Có bao giờ là một ý tưởng tốt để sử dụng tên mẫu thiết kế trong các lớp thực hiện? [đóng cửa]


28

Gần đây tôi tình cờ gặp một codebase trăn khá lớn với rất nhiều MyClassAbstractFactory, MyClassManager, MyClassProxy, MyClassAdapter, vv lớp.

Mặc dù một mặt, những cái tên đó đã chỉ cho tôi nghiên cứu và tìm hiểu các mẫu tương ứng, nhưng chúng không được mô tả nhiều về những gì lớp học làm .

Ngoài ra, họ dường như nằm trong danh sách cấm của các từ trong lập trình: variable, process_available_information, data, amount, compute: tên quá rộng, mà không cho chúng tôi bất cứ điều gì về chức năng khi được sử dụng bởi bản thân .

Vậy nên có CommunicationManagerhay không PortListener? Hoặc có lẽ tôi không hiểu vấn đề gì cả ...?


nếu bạn đã quen thuộc với những gì mẫu đó làm thì tên mẫu là một mô tả phù hợp, tuy nhiên chỉ cần tên mẫu là một ý tưởng tồi, tốt hơn là nên có MyClassFactory, FooAd CHƯƠNG, v.v.
ratchet freak

Đã chỉnh sửa câu hỏi để chỉ ra rằng các lớp không được gọi là "Tóm tắt", nhưng một số từ mô tả cũng có ở đó.
Vorac

1
... họ đã nghiêm túc gọi nó là Fctorythay vì a Factory, hay đó chỉ là một lỗi đánh máy?
Izkata

@Izkata, lol, xấu của tôi. Tuy nhiên, đã có Adaptor và Adaptor!
Vorac

Câu trả lời:


47
  • AbstractFactorythực sự là một sự lựa chọn nghèo nàn cho một cái tên Không có cách nào để biết những gì được tạo ra bởi nhà máy này và khi bạn tìm kiếm một thực thể tạo ra Animals, bạn sẽ không bao giờ tìm thấy nhà máy tương ứng theo tên.

  • AnimalAbstractFactorycũng không phải là một lựa chọn khôn ngoan, vì trong hầu hết các ngôn ngữ, nó sẽ là dư thừa với abstracttừ khóa trong chữ ký.

    Điều này đang được nói, có một số lý do chính đáng, được đánh dấu bằng các bình luận, để thực sự bao gồm Abstracttrong tên: không chỉ có một số bối cảnh mà bạn không có chữ ký đầy đủ, mà chỉ là tên, mà còn, giữ AnimalFactorycho một giao diện có thể là một lựa chọn khôn ngoan (trừ khi, không may, quy ước của ngôn ngữ / khung là giao diện tiền tố với I).

  • AnimalCreationUtilitycũng sẽ là một lựa chọn tồi: nếu đó là một nhà máy , hãy làm mọi thứ dễ dàng hơn cho những người sẽ đọc mã và gọi nó là một nhà máy .

  • abstract AnimalFactoryđược rồi Nó không có sự dư thừa, và rõ ràng đó một nhà máy trừu tượng , ủy thác việc tạo ra động vật cho trẻ em của nó.

Vì vậy, có, bao gồm tên của mẫu thiết kế là một ý tưởng tốt, nhưng nó chỉ nên là một phần của tên, và không nên thừa với các phần khác của chữ ký.


2
Tại sao điều này tốt hơn là viết bình luận ở một vị trí nổi bật "Trong mô-đun này, chúng tôi triển khai MVC. Lý do: ... Mô hình: ... Lượt xem: ... Bộ điều khiển: ... Bản đồ cấu trúc: ... API :. .. ".
Vorac

37
@Vorac: Có một cái tên rõ ràng luôn tốt hơn là dựa vào các bình luận.
Arseni Mourzenko

2
@Vorac sớm hay muộn ai đó sẽ thêm một lớp mới mà không cập nhật nhận xét nổi bật đó (hoặc thậm chí biết về sự tồn tại của nó). Mặc dù khó bỏ qua một quy ước đặt tên được sử dụng nhất quán trên toàn bộ ứng dụng.
Konrad Morawski

2
Trong khi bạn đang duyệt qua giải pháp dự án của mình, bạn sẽ mở từng tệp lớp để tìm những gì nó làm? Không. Đó là lý do tại sao luôn có các lớp / tệp tên mô tả.
ma trận

2
Tôi muốn vui lòng không đồng ý với quan điểm thứ hai: Tôi nghĩ rằng Animal sát trọng là một lựa chọn tốt, bởi vì mặc dù nó là dư thừa trong khai báo lớp, nhưng nó sẽ rất hữu ích trong tuyên bố của lớp con: LionFactory mở rộng Animal. là một phần tốt đẹp của thông tin.
Igor

11

Phụ thuộc vào ví dụ cụ thể. Mẫu Builder hầu như luôn được phục vụ tốt nhất bằng cách đặt tên lớp * Builder của bạn, trong khi Singleton thường không cần phải được đặt tên như vậy.

Nếu bạn không đặt tên mẫu trong tên lớp của mình và thậm chí nếu bạn làm như vậy, bạn thường nên đặt một nhận xét trong lớp giải thích rằng nó thực hiện một mẫu cụ thể.


3
Tính nhất quán là rất quan trọng ở đây, bởi vì chỉ khi một số nhà máy được gọi ...Factory, nó trở nên khá khó khăn để nhận ra một lớp là một nhà máy nếu việc đặt tên của nó phá vỡ quy ước đó.
Konrad Morawski

10

Toàn bộ quan điểm của việc sử dụng tên mẫu trong các lớp là để dễ hiểu những gì lớp làm. Nếu bạn đặt tên cho lớp AnimalFactory thì rõ ràng là lớp tạo ra các thể hiện Animal. Nếu tên của lớp của bạn bao gồm tên của một mẫu và nó không mô tả những gì nó đã chọn một mẫu sai hoặc thực hiện nó không chính xác.


1

Tôi nghĩ rằng nó có thể làm việc thực sự tốt. Ví dụ:

// Command for retrying card entry with CVN.
public class RetryCardEntryWithCVNCommand { ... }

// Query for getting expired accounts
public class GetExpiredAccountsQuery { ... }

// Decorator for logging exception. Implies that it's an additional 
//mechanism for logging exceptions.
public class LogExceptionToDbDecorator { ... }

// Factory for creating account filters
public class AccountFilterFactory { ... }

1
Làm thế nào để trả lời câu hỏi này? Theo tôi đọc, "ví dụ" của bạn chỉ hiển thị sự trùng lặp vô ích của tên lớp và nhận xét mã
gnat

Nhận xét là để biện minh cho mục đích của mỗi lớp trong trường hợp tên lớp không rõ ràng đối với một số người. Bằng cách nhìn vào chúng tôi biết ngay rằng tôi có lệnh thực hiện điều gì đó, truy vấn trả về dữ liệu, trình trang trí có thêm hành vi bổ sung cho cơ chế ghi nhật ký ngoại lệ hiện có và một nhà máy tạo bộ lọc tài khoản. Theo tôi, bạn càng mô tả nhiều hơn với tên lớp của mình, người khác càng dễ đọc mã của bạn. Nếu bạn đang sử dụng một mẫu thiết kế, thì hãy nói như vậy - vào cuối ngày, toàn bộ mục đích của việc có các mẫu thiết kế là để giúp người khác đọc mã của bạn dễ dàng hơn
CodeART
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.