Thực hành tốt nhất để đặt tên các lớp con


10

Tôi thường ở trong tình huống mà tôi có một khái niệm được biểu diễn bởi một giao diện hoặc lớp, và sau đó tôi có một loạt các lớp con/subinterface mở rộng nó.

Ví dụ: Một generic "DoiGraphNode" A "DoiGraphNode" đại diện cho một nguồn tài nguyên A "DoiGraphNode" đại diện cho một nguồn tài nguyên Java A "DoiGraphNode" với một con đường liên quan, vv, vv

tôi có thể nghĩ đến ba quy ước đặt tên và sẽ đánh giá cao nhận xét về cách chọn.


Tùy chọn 1: Luôn bắt đầu với tên của khái niệm.

Như vậy: DoiGraphNode, DoiGraphNodeResource, DoiGraphNodeJavaResource, DoiGraphNodeWithPath vv

Pro: Nó là rất rõ ràng những gì tôi đang đối phó với, nó rất dễ dàng để xem tất cả các tùy chọn tôi có

Côn: Not very tự nhiên? Mọi thứ trông giống nhau?


Tùy chọn 2: Đặt nội dung đặc biệt vào đầu.

Như vậy: DoiGraphNode, ResourceDoiGraphNode, JavaResourceDoiGraphNode, PathBaseDoiGraphNode, vv, vv

Pro: Nó là rất rõ ràng khi tôi nhìn thấy nó trong mã

Côn: Tìm nó có thể là khó khăn, đặc biệt nếu tôi không nhớ tên, thiếu nhất quán hình ảnh


Lựa chọn 3: Đặt những thứ đặc biệt và loại bỏ một số văn bản dự phòng

Như vậy: DoiGraphNode, ResourceNode, JavaResourceNode, GraphNodeWithPath

Pro: Không phải là nhiều để viết và đọc Côn: Hình như cr * p, rất phù hợp, có thể mâu thuẫn với những cái tên khác

4

Tên họ cho những gì họ đang có.

Nếu đặt tên chúng khó hoặc không rõ ràng, thường là dấu hiệu cho thấy Lớp đang làm quá nhiều (Nguyên tắc chịu trách nhiệm một lần).

Để tránh xung đột tên, hãy chọn không gian tên của bạn một cách thích hợp.

Cá nhân, tôi muốn sử dụng 3

+1

Tôi cũng đã chọn tùy chọn thứ ba. Trong hai đầu tiên có một nguy cơ kết thúc trong một "mê cung của tên dài uốn lượn, tất cả hơi khác nhau", nơi bạn có một thời gian khó đọc chúng và thậm chí nhớ tên gì tương ứng với khái niệm gì. 22 feb. 092009-02-22 08:52:59


5

Sử dụng bất cứ điều gì bạn thích, đó là một điều chủ quan. Điều quan trọng là làm rõ những gì mỗi lớp đại diện, và các tên nên được như vậy mà các mối quan hệ thừa kế có ý nghĩa. Tôi không thực sự nghĩ rằng đó là tất cả những gì quan trọng để mã hóa các mối quan hệ trong tên, mặc dù; đó là những gì tài liệu là cho (và nếu tên của bạn là thích hợp cho các đối tượng, mọi người sẽ có thể làm cho đoán tốt như những gì thừa kế từ những gì).

Đối với những gì nó có giá trị, tôi thường sử dụng tùy chọn 3, và từ kinh nghiệm của tôi nhìn vào mã tùy chọn 2 người khác có lẽ là phổ biến hơn tùy chọn 1.


0

Tùy chọn ba hợp lý hơn sau khái niệm kế thừa. Vì bạn chuyên về giao diện hoặc lớp, tên nên hiển thị rằng nó không còn sử dụng triển khai cơ sở (nếu có).

Có vô số công cụ để xem lớp được kế thừa từ cái gì, vì vậy một tên ngắn gọn cho biết chức năng thực sự của lớp sẽ đi xa hơn việc cố gắng đóng gói quá nhiều thông tin vào tên.


2

Bạn có thể tìm thấy một số hướng dẫn trong tài liệu tiêu chuẩn mã hóa, ví dụ: tài liệu IDesign cho C# here.

Cá nhân, tôi thích tùy chọn 2. Đây thường là cách mà Khuôn khổ .NET đặt tên đối tượng của nó. Ví dụ, nhìn vào các lớp thuộc tính. Tất cả đều kết thúc trong Thuộc tính (TestMethodAttribute). Điều tương tự cũng xảy ra với EventHandlers: OnClickEventHandler là tên được đề nghị cho trình xử lý sự kiện xử lý sự kiện Click.

Tôi thường cố gắng làm theo điều này trong việc thiết kế mã và giao diện của riêng mình. Do đó một IUnitWriter tạo ra một StringUnitWriter và một DataTableUnitWriter. Bằng cách này tôi luôn biết lớp cơ sở của họ là gì và nó đọc tự nhiên hơn. Mã tự viết là mục tiêu cuối cùng cho tất cả các nhà phát triển nhanh, vì vậy nó dường như hoạt động tốt cho tôi!


1

Tôi thường đặt tên tương tự như tùy chọn 1, đặc biệt là khi các lớp học sẽ được sử dụng polymophically. Lý do của tôi là bit thông tin quan trọng nhất được liệt kê trước tiên. (ví dụ: thực tế là lớp con về cơ bản là tổ tiên là gì, với (thường là) tiện ích mở rộng 'được thêm vào'). Tôi thích tùy chọn này cũng vì khi sắp xếp danh sách tên lớp, các lớp liên quan sẽ được liệt kê cùng nhau. I.e. Tôi thường đặt tên cho đơn vị dịch (tên tệp) giống như tên lớp sao cho các tệp lớp có liên quan sẽ tự động được liệt kê cùng nhau. Tương tự, điều này rất hữu ích với tìm kiếm gia tăng.

Mặc dù tôi có xu hướng sử dụng tùy chọn 2 sớm hơn trong sự nghiệp lập trình của mình, tôi tránh nó ngay bây giờ bởi vì khi bạn nói nó 'không phù hợp' và dường như không trực giao.

Tôi thường sử dụng tùy chọn 3 khi phân lớp cung cấp phần mở rộng đáng kể hoặc đặc điểm kỹ thuật hoặc nếu tên sẽ dài hơn. Ví dụ, tập tin lớp tên hệ thống của tôi có nguồn gốc từ String nhưng họ rất mở rộng các lớp String và có một sử dụng khác nhau đáng kể/ý nghĩa:

Directory_entry_name có nguồn gốc từ String thêm chức năng mở rộng. File_name có nguồn gốc từ Directory_entry_name có chức năng khá chuyên biệt. Directory_name có nguồn gốc từ Directory_entry_name cũng có các chức năng khá chuyên biệt.

Cũng cùng với tùy chọn 1, tôi thường sử dụng tên không đủ tiêu chuẩn cho lớp giao diện. Ví dụ tôi có thể có một chuỗi lớp interence:

  • Text (giao diện)
  • Text_abstract (trừu tượng (cơ sở) khái quát lớp)
  • Text_ASCII (lớp bê tông cụ thể đối với ASCII mã hóa)
  • Text_unicode (cụ thể lớp cụ thể cho mã hóa unicode)

Tôi thích giao diện và lớp cơ sở trừu tượng tự động xuất hiện đầu tiên trong danh sách được sắp xếp.