Các lớp quản lý có thể là một dấu hiệu của kiến ​​trúc xấu?


49

Gần đây tôi đã bắt đầu nghĩ rằng có nhiều lớp người quản lý trong thiết kế của bạn là một điều tồi tệ. Ý tưởng chưa đủ chín muồi để tôi đưa ra một lập luận hấp dẫn, nhưng đây là một vài điểm chung:

  • Tôi thấy khó khăn hơn nhiều đối với tôi để hiểu các hệ thống phụ thuộc nhiều vào "người quản lý". Điều này là do, ngoài các thành phần chương trình thực tế, bạn cũng phải hiểu cách thức và lý do tại sao trình quản lý được sử dụng.

  • Các nhà quản lý, rất nhiều thời gian, dường như được sử dụng để giảm bớt một vấn đề với thiết kế, như khi lập trình viên không thể tìm ra cách làm cho chương trình Just Work TM và phải dựa vào các lớp của người quản lý để làm cho mọi thứ hoạt động chính xác.

Tất nhiên, máng cỏ có thể tốt. Một ví dụ rõ ràng là một EventManager, một trong tất cả các cấu trúc yêu thích thời gian của tôi. : P Quan điểm của tôi là các nhà quản lý dường như bị lạm dụng rất nhiều thời gian và không có lý do chính đáng nào ngoài việc che giấu một vấn đề với kiến ​​trúc chương trình.

Là các lớp quản lý thực sự là một dấu hiệu của kiến ​​trúc xấu?


5
Tôi nghĩ rằng Of course, mangers can be good. An obvious example is an EventManagergiải thích tất cả ngay tại đó. Một sự lạm dụng của khái niệm này là kiến ​​trúc xấu, nhưng có những trường hợp sử dụng hợp pháp. Điều tương tự cũng đúng với hầu hết mọi thứ.

27
Có vẻ như là một dấu hiệu của việc đặt tên không tưởng tượng.
pdr

9
EventManagerlà một cái tên kinh khủng cho một lớp học. Nó bề ngoài là làm một cái gì đó với các sự kiện, nhưng những gì ?
Christoffer Hammarström

5
Một trong những vấn đề ở đây là giới hạn ngôn ngữ steve-yegge.blogspot.com/2006/03/ Các lớp Trình quản lý thường là do các động từ chỉ định, các hàm miễn phí là những gì thực sự muốn
jk.

1
Người quản lý thường có rất nhiều quyền lực (trách nhiệm) và họ có thể là một nỗi đau để giải quyết - giống như trong bất kỳ môi trường văn phòng nào;) EventManager có nghĩa là không có gì. EventDispatcher mô tả những gì nó làm.
CodeART

Câu trả lời:


31

Các lớp quản lý có thể là một dấu hiệu của một kiến ​​trúc xấu, vì một vài lý do:

  • Định danh vô nghĩa

    Cái tên FooManagerkhông nói gì về những gì lớp thực sự làm , ngoại trừ việc nó liên quan đến các Footrường hợp. Đặt cho lớp một cái tên có ý nghĩa hơn làm sáng tỏ mục đích thực sự của nó, điều này có thể sẽ dẫn đến tái cấu trúc.

  • Trách nhiệm phân số

    Theo nguyên tắc trách nhiệm duy nhất, mỗi đơn vị mã phải phục vụ chính xác một mục đích. Với một người quản lý, bạn có thể phân chia trách nhiệm đó một cách giả tạo.

    Xem xét một ResourceManagertọa độ vòng đời của và truy cập vào các Resourcetrường hợp. Một ứng dụng có một ResourceManagerthông qua đó nó có được các Resourcethể hiện. Trong trường hợp này, không có lý do thực sự tại sao chức năng của một ResourceManagercá thể không thể được phục vụ bởi các phương thức tĩnh trong Resourcelớp.

  • Trừu tượng phi cấu trúc

    Thông thường một người quản lý được giới thiệu để trừu tượng hóa các vấn đề tiềm ẩn với các đối tượng mà nó quản lý. Đây là lý do tại sao các nhà quản lý cho vay để lạm dụng như các thiết bị hỗ trợ cho các hệ thống được thiết kế kém. Trừu tượng hóa là một cách tốt để đơn giản hóa một hệ thống phức tạp, nhưng cái tên mà người quản lý có thể cung cấp không có manh mối nào về cấu trúc của sự trừu tượng mà nó đại diện. Nó thực sự là một nhà máy, hoặc một proxy, hoặc cái gì khác?

Tất nhiên, các nhà quản lý có thể được sử dụng cho nhiều thứ hơn là chỉ vì cái ác, vì những lý do tương tự. Một EventManager-which là thực sự là một Dispatcher-queues sự kiện từ nhiều nguồn và công văn họ với các mục tiêu quan tâm. Trong trường hợp này, nên tách biệt trách nhiệm nhận và gửi các sự kiện, bởi vì một cá nhân Eventchỉ là một thông điệp không có khái niệm về xuất xứ hoặc đích đến.

Chúng tôi viết một Dispatchersố Eventtrường hợp cho thực chất lý do tương tự, chúng tôi viết một GarbageCollectorhoặc một Factory:

Người quản lý biết trọng tải của nó không cần biết.

Điều đó, tôi nghĩ, là sự biện minh tốt nhất có để tạo ra một lớp giống như người quản lý. Khi bạn có một số đối tượng tải trọng trên mạng mà ứng xử như một giá trị, nó sẽ càng ngu ngốc càng tốt để hệ thống tổng thể vẫn linh hoạt. Để cung cấp ý nghĩa cho từng trường hợp riêng lẻ, bạn tạo một trình quản lý điều phối các trường hợp đó theo một cách có ý nghĩa. Trong bất kỳ tình huống nào khác, các nhà quản lý là không cần thiết.


3
Tôi chắc chắn đã tạo các lớp FooManager trước đây. Tôi cũng đã tạo ra các nhà máy và proxy. Nhưng có vẻ như đôi khi những gì bạn thực sự cần là một loại <Foo> GlorifiedCollection và FooManager có vẻ phù hợp hoàn hảo với hóa đơn. Bạn sẽ gọi một lớp theo nghĩa đen là quản lý bộ sưu tập nội bộ của các đối tượng Foo và cung cấp giao diện rất gọn gàng và súc tích để truy xuất các thể hiện Foo? Tôi đoán với tôi một "người quản lý" là một lớp đóng gói một nhà máy (tức là tất cả các trường hợp Foo được khởi tạo bên trong) cũng như một bộ sưu tập các đối tượng đó. Bạn sẽ gọi nó là cái gì khác? Hay làm thiết kế khác nhau?
DXM

À đúng rồi, EventDispatchertôi đã cố gắng tìm một cái tên hay trong một thời gian rồi. : P
Paul

@DXM Chỉ cần một bộ sưu tập Foos, nó có thể theo nghĩa đen là "FooList". Đối với địa điểm toàn cầu nơi Foos được đăng ký để chúng có thể được truy xuất sau đó, "FooRegistry", xuất hiện trong tâm trí. Kết hợp bộ sưu tập & nhà máy không phải là điều mà cá nhân tôi muốn làm, nhưng tôi tin rằng điều đó thường sẽ được gọi là "FooRep repository".
R. Schmitz

28

Các nhà quản lý có thể là một dấu hiệu của một kiến ​​trúc xấu, nhưng thường thì họ chỉ là một dấu hiệu của sự bất lực thay mặt nhà thiết kế đưa ra các tên tốt hơn cho các đối tượng của mình, hoặc đơn giản chỉ là sự phản ánh của thực tế rằng tiếng Anh (và bất kỳ ngôn ngữ nào của con người cho vấn đề đó) đều phù hợp để truyền đạt các khái niệm thực tế hàng ngày, và không phải là khái niệm kỹ thuật cao, trừu tượng.

Một ví dụ đơn giản để minh họa quan điểm của tôi: trước khi Mô hình nhà máy được đặt tên, mọi người đang sử dụng nó, nhưng họ không biết cách gọi nó. Vì vậy, ai đó đã phải viết một nhà máy cho Foolớp học của mình có thể đã gọi nó FooAllocationManager. Đó không phải là thiết kế tồi, đó chỉ là thiếu trí tưởng tượng.

Và sau đó ai đó cần phải thực hiện một lớp duy trì nhiều nhà máy và trao chúng cho các đối tượng khác nhau yêu cầu họ; và anh ta gọi lớp mình FactoryManagervì từ này Industrykhông bao giờ xảy ra với anh ta, hoặc anh ta nghĩ nó sẽ không hay vì trước đây anh ta chưa bao giờ nghe về một thứ như thế trong lập trình. Một lần nữa, một trường hợp thiếu trí tưởng tượng.


10

Có nhiều lớp "trình quản lý" thường là một biểu tượng của mô hình miền thiếu máu , trong đó logic miền được đưa ra khỏi mô hình miền và thay vào đó được đặt trong các lớp của trình quản lý, ít nhiều tương đương với các tập lệnh giao dịch . Điều nguy hiểm ở đây là về cơ bản bạn đang quay trở lại lập trình thủ tục - rằng bản thân nó có thể hoặc không phải là một điều tốt tùy thuộc vào dự án của bạn - nhưng thực tế là nó không được xem xét hoặc dự định là vấn đề thực sự.

Theo nguyên tắc của "chuyên gia thông tin" , một hoạt động logic sẽ nằm càng gần với dữ liệu mà nó yêu cầu càng tốt. Điều này có nghĩa là chuyển logic miền trở lại mô hình miền, do đó, các hoạt động logic này có ảnh hưởng rõ rệt đến trạng thái của mô hình miền, thay vì 'người quản lý' thay đổi trạng thái của mô hình miền từ bên ngoài.


8

Câu trả lời ngắn gọn: nó phụ thuộc .

Có một số dạng khác nhau của "lớp người quản lý", một số trong số chúng là tốt, một số khác là xấu và đối với hầu hết chúng phụ thuộc rất nhiều vào bối cảnh nếu giới thiệu một lớp người quản lý là điều đúng đắn. Điểm khởi đầu tốt để khiến họ đúng là tuân theo nguyên tắc trách nhiệm duy nhất - nếu bạn biết chính xác mỗi lớp quản lý của bạn chịu trách nhiệm (và những gì không), bạn sẽ có ít vấn đề hơn khi hiểu họ.

Hoặc để trả lời trực tiếp câu hỏi của bạn: đó không phải là số lượng các lớp quản lý biểu thị một kiến ​​trúc xấu, nhưng có quá nhiều trong số chúng có trách nhiệm không rõ ràng hoặc xử lý quá nhiều mối quan tâm.


Xin lỗi, tôi không thấy câu trả lời này là rất hữu ích. Bạn đưa ra một điểm tốt rằng trách nhiệm không rõ ràng và quá nhiều mối quan tâm là xấu. Nhưng điều đó áp dụng cho bất kỳ lớp nào , không chỉ lớp "Người quản lý". Các câu trả lời khác có vẻ cụ thể hơn nhiều về cách một lớp người quản lý có thể hữu ích hoặc bất lợi.
dùng949300

3

Mặc dù có thể dễ dàng nói rằng chúng vốn chỉ là một thiết kế tồi, nhưng chúng có thể phục vụ để mang lại nhiều điều tốt và giảm độ phức tạp của mã và mã nồi hơi khác trong toàn dự án bằng cách bao gồm một nhiệm vụ và trách nhiệm chung.

Mặc dù sự phổ biến của Người quản lý có thể là do phán đoán kém về thiết kế, họ cũng có thể xử lý các quyết định thiết kế kém hoặc các vấn đề không tương thích với các thành phần khác trong thiết kế thành phần hoặc các thành phần UI của bên thứ ba hoặc dịch vụ web của bên thứ ba với giao diện lạ làm ví dụ

Những ví dụ này chứng minh rằng chúng rất hữu ích cho các tình huống nhất định trong việc giảm độ phức tạp tổng thể và thúc đẩy khớp nối lỏng lẻo giữa các thành phần và lớp khác nhau bằng cách gói "mã xấu" ở một vị trí. Mặc dù vậy, một điều đáng chú ý là mọi người sẽ cảm thấy hấp dẫn khi biến Người quản lý thành người độc thân, tôi sẽ khuyên bạn nên chống lại điều này, và tất nhiên như những người khác đã đề xuất Nguyên tắc Trách nhiệm Đơn lẻ phải luôn được tuân theo.


2

Các lớp quản lý có thể là một dấu hiệu của kiến ​​trúc xấu?

Bạn đã trả lời câu hỏi của bạn: chúng không phải là một dấu hiệu của một thiết kế xấu.

Ngoại trừ ví dụ trong câu hỏi của bạn với EventManager, còn có một ví dụ khác: trong mẫu thiết kế MVC , người trình bày có thể được xem như là người quản lý cho các lớp mô hình / khung nhìn.

Tuy nhiên, nếu bạn sử dụng sai một khái niệm, thì đó là dấu hiệu của một thiết kế xấu và có thể là kiến ​​trúc.


Trong phần câu hỏi - "có nhiều lớp người quản lý trong thiết kế của bạn là một điều xấu". Tôi tin rằng đây là những gì OP thực sự muốn biết.
Oded

2

Khi lớp có "Người quản lý" trong tên, hãy cẩn thận với vấn đề của lớp thần (một người có quá nhiều trách nhiệm). Nếu thật khó để mô tả những gì một lớp chịu trách nhiệm với tên của nó, đó là một dấu hiệu cảnh báo thiết kế.

Bỏ qua các lớp quản lý tồi, cái tên tồi tệ nhất tôi từng thấy là "DataContainerAdOG"

"Dữ liệu" phải là một trong những chuỗi con bị cấm trong các tên - đó là tất cả dữ liệu, "dữ liệu" không cho bạn biết nhiều trong hầu hết các miền.


2

Các lớp quản lý - giống như hầu hết các lớp kết thúc bằng "-er" - là xấu xa và không liên quan gì đến OOP. Vì vậy, đối với tôi đó là một dấu hiệu của kiến ​​trúc xấu.

Tại sao? Tên "-er" ngụ ý rằng một nhà thiết kế mã đã thực hiện một số hành động và chuyển đổi nó thành lớp. Kết quả là chúng ta có một thực thể nhân tạo không phản ánh bất kỳ khái niệm hữu hình nào, nhưng một số hành động. Điều này nghe có vẻ rất thủ tục.

Bên cạnh đó, thông thường các lớp như vậy lấy một số dữ liệu và vận hành theo nó. Đây là một triết lý của dữ liệu thụ động và các thủ tục hoạt động và nó đã tìm thấy vị trí của nó trong lập trình thủ tục. Nếu bạn nhận ra rằng, không có gì xấu trong các lớp Manager, nhưng đó không phải là OOP.

Suy nghĩ đối tượng ngụ ý rằng các đối tượng làm mọi thứ cho chính họ. Khám phá miền của bạn , xây dựng mạng lưới ngữ nghĩa , để cho các đối tượng của bạn là những sinh vật sống, con người thông minh và có trách nhiệm.

Những đối tượng như vậy không cần phải kiểm soát. Họ biết phải làm gì và làm như thế nào. Vì vậy, các lớp Manager phá vỡ các nguyên tắc OOP hai lần. Ngoài việc là một lớp "-er", nó còn điều khiển các đối tượng khác. Nhưng nó phụ thuộc vào người quản lý mặc dù. Nó kiểm soát - anh ta là một người quản lý tồi. Nếu anh ấy phối hợp - anh ấy là một người quản lý tốt. Đó là lý do tại sao một chữ "C" trong MVC nên được đánh vần là "Điều phối viên".


Bạn đưa ra một quan điểm thú vị nhưng tôi vẫn tự hỏi làm thế nào bạn sẽ phân loại một "người quản lý thực thể"? Từ nền tảng cá nhân của tôi, trình quản lý <entity> có nghĩa là cho các hoạt động CRUD trên <thực thể> cụ thể. Liệu nó dẫn mô hình miền bị thiếu máu? Tôi không nghĩ vậy, chỉ cần không "kỷ lục hoạt động". Hơn nữa, chúng ta không thể đưa vào logic hợp chất CRUD phối hợp của một thực thể "người quản lý thực thể" sao? Tôi không thấy một nơi tốt hơn cho điều đó. Vì vậy, đây có thể được coi là mặt tiền CRUD bằng cách nào đó ...
ClemC

Tất cả những gì tôi có thể nói về con số của ORM là trung bình.com /@wrong.about / you
dont

Tôi không cần thiết phải tham khảo các ORM, tuy nhiên ... Tôi tôn trọng nhiều nhất có thể các nguyên tắc OO nhưng đối với tôi có vẻ như chúng khá lý thuyết và không thể luôn được áp dụng đầy đủ trong thực tế ... Ví dụ, nếu chúng ta cần tách rời, tái sử dụng, DRY, năng suất, ví dụ: đặt logic / quy tắc miền áp dụng cho các thực thể khác nhau trong các dịch vụ chung, do đó làm cho mô hình miền ít hành vi hơn ... Đó là hiệu ứng chính xác của mẫu kho lưu trữ / ánh xạ (mà ORM bạn tham khảo để thực hiện) VS một mẫu bản ghi hoạt động mà tôi tin rằng bạn ủng hộ ...
ClemC

1

Câu trả lời đúng cho câu hỏi này là:

  1. Nó phụ thuộc.

Mỗi tình huống bạn sẽ gặp trong khi viết phần mềm là khác nhau. Có lẽ bạn đang ở trong một nhóm nơi mọi người đều biết cách các lớp quản lý làm việc nội bộ? Sẽ là hoàn toàn điên rồ khi không sử dụng thiết kế đó. Hoặc nếu bạn đang cố gắng đẩy người thiết kế quản lý đến người khác, trong trường hợp đó có thể là ý tưởng tồi. Nhưng nó phụ thuộc vào chi tiết chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.