Quy ước đặt tên lớp C #: Nó có phải là BaseClass hay ClassBase hay AbstractClass không


117

Cách tiếp cận được đề xuất để đặt tên các lớp cơ sở là gì? Nó có tiền tố tên kiểu là " Cơ sở " hoặc " Tóm tắt " hay chúng ta chỉ đặt hậu tố bằng "Cơ sở"?

Hãy xem xét những điều sau:

loại: ViewModelví dụ: MainViewModel , ReportViewModel

lớp cơ sở: BaseViewModelhoặc ViewModelBasehoặcAbstractViewModel

Cũng xem xét:

loại: Productví dụ: VirtualProduct , ExpiringProduct

lớp cơ sở: BaseProducthoặc ProductBasehoặcAbstractProduct

Bạn nghĩ cái nào chuẩn hơn?

class Entity : EntityBase
{
}

hoặc là

class Entity : BaseEntity
{
}


Câu trả lời:


90

Có những ví dụ trong khung với hậu tố cơ bản, ví dụ như System.Configuration.Provider.ProviderBase, System.Web.SessionState.SessionStateStoreProviderBase.

Nhưng không có nghĩa là tất cả các lớp cơ sở trừu tượng trong khung tuân theo quy ước này (ví dụ System.Data.Common.DbParameter, System.Data.Common.DbCommand).

Cá nhân tôi sẽ tránh sử dụng hậu tố trừ khi tôi muốn nhấn mạnh thực tế rằng đó là một lớp trừu tượng và cảm thấy rằng nếu không thì người dùng của lớp có thể mong đợi tên để chỉ ra một triển khai cụ thể.


" Avoidđặt tên các lớp cơ sở với một Basehậu tố nếu lớp đó được thiết kế để sử dụng trong các API công khai." Hướng dẫn thiết kế khung, trang 174
Yousha Aleayoub

47

Không có điều nào ở trên. Xem xét mục đích mà lớp cơ sở của bạn cung cấp; đặt tên cho nó. Ví dụ, hạng cơ sở của Ô tô và Xe đạp có thể là Xe.

Nếu bạn đang tạo các lớp cơ sở chỉ để có một lớp cơ sở của một lớp và không có mục đích hoặc lý do nào khác ngoài điều đó, có thể bạn đang làm sai.


15
Điều đó không phải luôn luôn như vậy và bạn sẽ tìm thấy nhiều lớp Cơ sở * trong khuôn khổ. CollectionBase, DictionaryBase .... vv
Chad Grant

1
Điểm tốt là các đồ vật trong thế giới thực phải khớp chính xác với đồ tạo tác. Sự trừu tượng của các dấu phẩy phải dựa trên như Xe, các chi tiết cụ thể phải đi sau nhưng cũng phải chính xác.
ruslander

45
Cần lưu ý rằng một số lớp trong .NET Framework có hậu tố "Cơ sở" đã được đặt tên trước phiên bản 1.0 và Microsoft không còn tuân theo các quy ước đó nữa .... nhưng họ không thể thay đổi tên bây giờ. Sách Hướng dẫn Thiết kế Khung của Microsoft, phần 6.2 (bao gồm các lớp cơ sở), đặc biệt khuyến cáo không nên sử dụng hậu tố "Cơ sở".
Warren Rumak

5
Thực tiễn mà tôi đã thấy được sử dụng thường xuyên nhất trong một số ngôn ngữ OO tại một số công ty là "Cơ sở" chỉ định các lớp cơ sở chỉ được kế thừa từ - không được sử dụng trực tiếp. Với ví dụ của bạn, một lớp có tên “Xe” nghe có vẻ giống như một thứ gì đó có thể được sử dụng và “lái được” - nó tự xưng là một phương tiện. Tuy nhiên, nếu lớp cơ sở được đặt tên là “Phụ tùng xe” hoặc “Đồ dùng cần thiết cho xe” hoặc “Bộ dụng cụ cho xe” - chúng tôi biết nó không phải là thứ có thể sử dụng trực tiếp, mà là cơ sở cho nhiều loại xe.
Slipp D. Thompson

4
Như đã đề cập bởi Warren, cuốn sách Hướng dẫn thiết kế khung của Microsoft, phần 6.2 về Lớp cơ sở: msdn.microsoft.com/en-us/library/ms229003(v=vs.110).aspx Họ nói tránh hậu tố Cơ sở: "TRÁNH đặt tên các lớp cơ sở có hậu tố "Cơ sở" nếu lớp được thiết kế để sử dụng trong các API công khai. "
cwills

5

Nếu bạn đang nói về các lớp cơ sở ảo, tiêu chuẩn của Microsoft là ClassnameBase (như CollectionBase.)


3

Tôi nghĩ đó là một vấn đề của sự lựa chọn. Tôi muốn nói nếu bạn đang tạo nhiều lớp cơ sở thì có lẽ tốt hơn nên sử dụng BaseClassname luôn vì bằng cách đó, bạn LUÔN LUÔN có thể tìm ra những lớp cơ sở nào bạn có thể bắt đầu sử dụng chỉ bằng cách nhập Base và nhận phần còn lại của sự trợ giúp Intellisense. Điều gì sẽ xảy ra nếu bạn có 20 lớp Cơ sở và bạn thêm Cơ sở làm hậu tố và bạn quên tên của lớp cơ sở là gì? Bạn có muốn tạo một sơ đồ lớp trước từ VS và tìm hiểu những lớp cơ sở nào có sẵn không? Đặt tên cho chúng là ClassBase cũng được khi nó chỉ là một hoặc hai lớp.

Tương tự đối với quyết định giữa hàm GetItems và ItemsGet. Tôi muốn nói rằng vì lợi ích của khả năng đọc ít nhất - hãy sử dụng GetItems. Tuân theo các quy ước :)


1
Các lớp 'cơ sở' là một hack OO, hãy xem nhận xét của Paul . Chúng thường hữu ích và đôi khi cần thiết, nhưng chúng vẫn là một cuộc tấn công. Nếu bạn cảm thấy cần phải tìm kiếm tất cả các lớp cơ sở có sẵn, tại sao lại như vậy? Họ chia sẻ điều gì khiến bạn có nhu cầu muốn xem tất cả cùng nhau? Câu trả lời có thể giúp bạn tìm ra cách đặt tên tốt hơn.
Iain

1
@Abhishek: Tương tự GetItemskhông hoạt động— “Get” chỉ là một động từ và do đó chỉ có ý nghĩa ngữ pháp tiếng Anh như một tiền tố, trong khi “Base” hoạt động như một tính từ (tiền tố) hoặc danh từ (hậu tố).
Slipp D. Thompson

1
@Iain: Lý do mọi người sử dụng "Cơ sở" trong tên lớp không phải là để có thể tìm thấy tất cả các lớp cơ sở— lý do gần gũi hơn với điều ngược lại. Đó là để lớp cơ sở của một số lớp liên quan nổi bật với chúng, theo cách mà tiền tố “I” được dùng để phân biệt một giao diện với các lớp áp dụng nó. Tôi đã thấy tiền tố / hậu tố “Cơ sở” được sử dụng thường xuyên nhất khi lớp cơ sở tự nó không có chức năng— trừu tượng theo mục đích sử dụng, bất kể có được thực thi hay không abstract.
Slipp D. Thompson

@ SlippD.Thompson vâng, 'tìm tất cả các lớp' là một phản hồi cho Abhishek. Tôi trả lời về câu trả lời của Paul.
Iain

2

Chúng tôi sử dụng BaseEntity, nhưng tôi nghĩ đó là sở thích của riêng bạn. Tôi thường xuyên nhìn thấy cái khác.

Chỉ cần nhất quán trong ngữ cảnh của bạn, đó là dự án, không gian tên của bạn hoặc nếu có thể, nhóm của bạn. Các quy ước khác nhau tồi tệ hơn một quy ước xấu IMHO.


2

Cá nhân, tôi khuyên bạn không nên thêm cơ sở từ. Bạn không bao giờ biết khi nào bạn sẽ phải thay đổi mã xung quanh và nó sẽ không còn là đối tượng cơ sở nữa. Điều đó đang được nói, chúng tôi đã làm điều này trong quá khứ, chúng tôi đặt tiền tố từ Base ở mặt trước. Nó dường như chảy tốt hơn.


-1

BaseEntity trông rất giống vỏ lạc đà - strName, bseEntity. Tôi muốn sử dụng EntityBase vì nó xác định chủ đề trước, điều này sẽ giúp bạn xác định chức năng của nó nhanh hơn.


10
Bạn đang nói về ký hiệu Hungary, không phải vỏ lạc đà. Ký hiệu Hungary chỉ tình cờ được bọc da lạc đà, nhưng chúng hoàn toàn khác nhau.
sliderhouserules

-5

Luôn nghĩ về thứ tự bảng chữ cái khi bạn đặt tên cho các thứ. Tôi thực sự không thích nhìn vào máy chủ SQL và mọi thủ tục được lưu trữ đều được đặt tên là usp [something]. Cùng dòng, đừng lạm dụng Get và Set làm tên hàng đầu cho một hàm. Thay vì GetItems hoặc PlaceOrder, hãy nghĩ đến việc đặt tên chúng là ItemsGet hoặc OrderPlace.

Vì vậy, nói chung, ClassnameBase / EntityBase sẽ là lựa chọn tốt hơn.


9
Không đồng ý; Khả năng đọc. GetItems có ý nghĩa hơn nhiều so với ItemsGet.
Nathan Ridley

2
Không đồng ý ... lý do tương tự như trên .. nhưng không thể bỏ phiếu xuống ... :(
Mugunth

Trái ngược với các ý kiến ​​khác, marcc KHÔNG đề xuất một cái gì đó như itemgsGet (). Anh ấy đã viết các mục ().
Hontvári Levente
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.