Cách tránh các lớp Trình trợ giúp hoặc Trình quản lý của Khác


9

Tôi có khá nhiều lớp Helper trong dự án của mình. Tôi đã đọc rằng đây là một điều xấu, nhưng tôi nghi ngờ rằng "Người trợ giúp" là hậu tố sai cho họ. Tôi sẽ đưa ra một ví dụ.

Đầu tiên, tôi có một Userlớp học. Tôi cần một phương pháp GetSuggestedFriends()cho người dùng. Tôi muốn giữ logic để xác định danh sách bạn bè được đề xuất ra khỏi Userlớp, vì vậy nó không bị phồng lên. Ngay bây giờ, tôi có một FriendshipHelpercái nhận được Usertrong hàm tạo của nó. Nó chứa logic để nhận được những người bạn được đề xuất và bây giờ tôi có thể gọi myUser.FriendshipHelper.GetSuggestedFriends().

Ban đầu chỉ FriendshipHelpercó các phương thức tĩnh và một Userđối tượng được truyền vào từng cái. Nếu bây giờ tôi đang viết lớp từ đầu, có lẽ tôi sẽ gọi nó FriendshipManager- nó cũng làm những việc như thêm và xóa bạn bè.

Tôi cũng đã đọc rằng ...Managercác lớp học là xấu, mặc dù. Tôi nên gọi lớp này là gì? Hoặc, đây là "mã xấu"? Logic ở đâu để có được những người bạn được đề xuất, những người bạn hiện tại và thêm và xóa những người bạn đang sống? Chắc chắn không phải tất cả trong một Userlớp học khổng lồ ?


Mã này sống ở đâu? Có phải là một dịch vụ? Nó có truy cập vào một cửa hàng dữ liệu? Đây là giao diện người dùng để thực hiện công cụ kết bạn này?
Telastyn

3
Khi bạn đã loại bỏ tất cả các phương thức tĩnh và tìm thấy một ngôi nhà thực sự trong thiết kế OOP của mình, các lớp này thực sự không phải là các lớp trợ giúp, vì vậy hãy đổi tên. Không có gì sai với FriendshipManager nếu bạn cần quản lý tình bạn trong dự án của mình.
JeffO

Có chuyện gì với bạn Facebookvậy?
toniedzwiedz

Câu trả lời:


10

Cách tránh các lớp Trình trợ giúp hoặc Trình quản lý của «

Nói chung: bởi thiết kế tốt

Đầu tiên, tôi có một lớp Người dùng. Tôi cần một phương thức GetSuggestedFriends () cho người dùng.

Đúng. A user có mối quan hệ với người khác users. Và mối quan hệ có thể được thể hiện như một phương pháp trên user, ví dụ user.isFriend(user2). Đây là trách nhiệm của user-object. Bên cạnh đó, bạn hỏi một đối tượng cho sự giúp đỡ việc tìm kiếm những người bạn khác . Bạn ủy nhiệm cho việc tìm kiếm bạn bè để đối tượng khác và đó là khá tốt .

Ngay bây giờ, tôi có FriendshipHelper nhận Người dùng trong hàm tạo của nó. Nó chứa logic để nhận được những người bạn được đề xuất và bây giờ tôi có thể gọi myUser.FriendshipHelper.GetSuggestedFriends ()

Đó không phải là cho mỗi gia nhập xấu, nhưng có một nhược điểm: khởi tạo "Helper" với một usergiới hạn các khả năng để một mà user.

Những gì bạn cần là một đối tượng , giúp tìm kiếm bạn bè cho bất kỳ người dùng nào . Vì vậy, một phương pháp chung sẽ có ý nghĩa: userMatcher.findFriendsFor(user)đó trong trở lại cung cấp một bộ sưu tập của bạn bè có thể ( user).

Nếu bây giờ tôi đang viết lớp từ đầu, có lẽ tôi sẽ gọi nó là FriendshipManager

Vấn đề của bạn không phải là viết "các lớp trợ giúp", mà là tìm đúng tên . ;)

nó cũng làm những việc như thêm và xóa bạn bè.

Đó là một thiết kế sai . Lấy bản thân bạn làm ví dụ: Mẹ của bạn có thêm bạn bè vào cuộc sống của bạn hay bạn tự thêm họ?

Tất nhiên các bộ sưu tập của bạn bè là một tài sản của userbản thân và như vậy là phương pháp user.addFriend(user)hayuser.removeFriend(user)

Tôi nên gọi lớp này là gì?

Như đã nói trước đây: bạn chỉ có một vấn đề đặt tên và "người trợ giúp" của bạn vẫn ổn . Nhưng bạn phải suy nghĩ kỹ hơn về trách nhiệm của từng đối tượng.

Logic ở đâu để có được những người bạn được đề xuất, những người bạn hiện tại và thêm và xóa những người bạn đang sống? Chắc chắn không phải tất cả trong một lớp Người dùng khổng lồ

Không. Đây là hai công việc mà bạn cần một đối tượng riêng biệt , như trong cuộc sống thực, nơi bạn có ngườicông ty hẹn hò .


3
Giải thích tuyệt vời, nhưng rõ ràng bạn chưa bao giờ gặp mẹ tôi. : '(
Matt

1
@ HEATH3N Tôi hy vọng, điều đó không ảnh hưởng đến khả năng mô hình hóa phần mềm của bạn.
Thomas Junk

3

Tôi muốn đề nghị bạn có một FriendshipServicelớp có GetSuggestedFriends(User)phương thức (không tĩnh) . Tránh các phương thức tĩnh vì bạn không thể thực hiện giao diện khiến việc kiểm tra khó khăn hơn. Tránh thêm đối tượng người dùng vào hàm tạo vì bạn có thể muốn mở rộng FriendshipService của mình bằng các phương thức không liên quan cụ thể đến một người dùng. (Ví dụ: bạn có thể muốn đề xuất bạn bè cho một nhóm người dùng hoặc đề xuất bạn bè dựa trên thứ khác)

Người dùng rất có thể không nhận thức được FriendshipService(do Mẫu Trách nhiệm duy nhất)


7
Thay đổi hậu tố từ "Người trợ giúp" thành "Dịch vụ" sẽ không dễ dàng hơn để có được ý tưởng về trách nhiệm của lớp bằng tên của nó, mà tôi nghĩ là trung tâm của câu hỏi.
Mike Partridge

Chà, cái tên có thể không nói nhiều, nhưng tôi sẽ nói rằng sử dụng hậu tố "Dịch vụ" là một cách giao tiếp được chuẩn hóa hơn mà lớp thực hiện một số loại logic nâng cao. Các lớp "Trình trợ giúp" (ít nhất là theo kinh nghiệm của tôi) thường liên quan nhiều hơn đến các tác vụ rất đơn giản, chẳng hạn như định dạng đơn giản và các phương thức tĩnh nhỏ. Tôi hy vọng rằng bạn có thể thay thế giao diện "Dịch vụ" bằng các triển khai khác nhau. Hơn nữa, có rất nhiều câu hỏi ở đây, không chỉ việc đặt tên.
Bjorn

Đã đồng ý. Tất cả ba "Người trợ giúp", "Người quản lý" và "Dịch vụ" là những cách chúng tôi nhóm các phương thức để tránh hàng tấn các lớp siêu cụ thể bằng một phương thức duy nhất, nhưng "Dịch vụ" có ý nghĩa hơn một chút, như bạn đã mô tả. Tôi sẽ nói thêm rằng nó ngụ ý rằng lớp là một phần của giao diện lớp dịch vụ, giúp đơn giản hóa việc truy cập vào logic nghiệp vụ (có thể được tạo thành từ nhiều lớp cụ thể hơn) cho một lớp miền nhất định. Việc logic gợi ý có nên ở trong một lớp riêng biệt với logic thêm / xóa hay không tùy thuộc vào mức độ phức tạp của việc triển khai logic đề xuất.
Mike Partridge

Khi chúng tôi đặt tên cho các lớp là ThingManager hoặc ThingService, chúng tôi sẽ mở cửa để tạo ra các lớp vượt khỏi tầm kiểm soát. Bởi vì tên không chỉ rõ ràng bất cứ điều gì cụ thể thuộc về lớp, nên nó cũng không loại trừ bất cứ điều gì. Tôi cần một phương pháp mới liên quan đến Thing. Nó đi đâu? Idk, đặt nó trong ThingManager với tất cả các phương thức khác.
Scott Hannen
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.