C # Konvensi penamaan kelas: Apakah BaseClass atau ClassBase atau AbstractClass


117

Apa pendekatan yang direkomendasikan untuk penamaan kelas dasar? Apakah itu mengawali nama tipe dengan " Base " atau " Abstract " atau apakah kita akan mencampurkannya dengan "Base"?

Pertimbangkan hal berikut:

jenis: ViewModelmisalnya MainViewModel , ReportViewModel

kelas dasar: BaseViewModelatau ViewModelBaseatauAbstractViewModel

Pertimbangkan juga:

ketik: Productmisalnya VirtualProduct , ExpiringProduct

kelas dasar: BaseProductatau ProductBaseatauAbstractProduct

Mana yang menurut Anda lebih standar?

class Entity : EntityBase
{
}

atau

class Entity : BaseEntity
{
}


Jawaban:


90

Ada contoh dalam Kerangka dengan akhiran Base, misalnya System.Configuration.Provider.ProviderBase, System.Web.SessionState.SessionStateStoreProviderBase.

Tetapi tidak berarti semua kelas dasar abstrak dalam Framework mengikuti konvensi ini (misalnya System.Data.Common.DbParameter, System.Data.Common.DbCommand).

Secara pribadi saya akan menghindari penggunaan sufiks kecuali saya ingin menekankan fakta bahwa ini adalah kelas abstrak dan merasa bahwa jika tidak, pengguna kelas mungkin mengharapkan nama tersebut untuk menunjukkan implementasi konkret.


" Avoidmenamai kelas dasar dengan Basesufiks jika kelas tersebut dimaksudkan untuk digunakan dalam API publik." Pedoman Desain Kerangka, halaman 174
Yousha Aleayoub

47

Bukan dari salah satu di atas. Pertimbangkan tujuan apa yang disediakan kelas dasar Anda; beri nama itu. Misalnya, kelas dasar Mobil dan Sepeda bisa jadi Kendaraan.

Jika Anda membuat kelas dasar hanya untuk memiliki kelas dasar dari satu kelas, dan tanpa tujuan atau alasan selain itu, Anda mungkin melakukan sesuatu yang salah.


15
Itu tidak selalu terjadi dan Anda akan menemukan banyak kelas Basis * dalam kerangka kerja. CollectionBase, DictionaryBase .... dll
Chad Grant

1
Poin bagusnya benda dunia nyata harus pas dengan artefak. Abstraksi milik bersama harus didasarkan seperti Kendaraan, spesifik harus tertinggal tetapi juga tepat.
ruslander

45
Perlu dicatat bahwa beberapa kelas dalam .NET Framework dengan sufiks "Base" dinamai sebelum versi 1.0 dan Microsoft tidak lagi mengikuti konvensi tersebut .... tetapi mereka tidak dapat mengubah nama sekarang. Buku Panduan Desain Kerangka Microsoft, bagian 6.2 (yang mencakup kelas-kelas dasar), secara khusus merekomendasikan untuk tidak menggunakan sufiks "Basis".
Warren Rumak

5
Praktik yang paling sering saya lihat digunakan dalam sejumlah bahasa OO di sejumlah perusahaan adalah bahwa "Basis" menunjuk kelas dasar yang dimaksudkan hanya untuk diwarisi — bukan untuk digunakan secara langsung. Dengan contoh Anda, kelas bernama "Kendaraan" terdengar seperti sesuatu yang dapat digunakan dan "dikendarai" - itu mengklaim dirinya sebagai kendaraan. Namun, jika kelas dasar diberi nama "Suku Cadang Kendaraan" atau "Dasar-Dasar Kendaraan" atau "Kit Kendaraan" - kami tahu itu bukan sesuatu yang dapat digunakan secara langsung, tetapi dasar untuk berbagai kendaraan.
Slipp D. Thompson

4
Seperti yang disebutkan oleh Warren, buku Panduan Desain Kerangka Microsoft, bagian 6.2 pada Kelas Dasar: msdn.microsoft.com/en-us/library/ms229003(v=vs.110).aspx Mereka mengatakan untuk menghindari akhiran Dasar: "HINDARI penamaan kelas dasar dengan akhiran "Base" jika kelas tersebut dimaksudkan untuk digunakan dalam API publik. "
cwills

5

Jika Anda berbicara tentang kelas basis virtual, standar Microsoft adalah ClassnameBase (seperti CollectionBase.)


3

Saya pikir ini masalah pilihan. Saya akan mengatakan jika Anda membuat banyak kelas dasar maka mungkin lebih baik menggunakan BaseClassname selalu karena dengan cara itu Anda SELALU dapat mengetahui kelas dasar apa yang dapat Anda mulai gunakan hanya dengan mengetikkan Base dan mendapatkan bantuan lainnya dari Intellisense. Bagaimana jika Anda memiliki 20 kelas dasar dan Anda menambahkan Basis sebagai sufiks dan Anda lupa apa nama kelas dasar? Apakah Anda ingin membuat diagram kelas terlebih dahulu dari VS dan mencari tahu kelas dasar apa yang tersedia? Tidak apa-apa untuk menamai mereka ClassBase jika hanya ada satu atau dua kelas.

Hal yang sama berlaku untuk keputusan antara fungsi GetItems dan ItemsGet. Saya akan mengatakan untuk setidaknya demi keterbacaan - pilih GetItems. Ikuti konvensi :)


1
Kelas 'Base' adalah hack OO, lihat komentar Paul . Mereka sering membantu dan terkadang diperlukan, tetapi tetap saja merupakan retasan. Jika Anda merasa perlu untuk mencari semua kelas dasar yang tersedia, mengapa demikian? Apa yang mereka bagikan yang menciptakan kebutuhan Anda untuk melihat mereka semua bersama-sama? Jawabannya bisa membantu Anda menemukan penamaan yang lebih baik.
Iain

1
@Abhishek: Analogi untuk GetItemstidak bekerja— "Get" hanyalah sebuah kata kerja dan dengan demikian hanya membuat pengertian gramatikal bahasa Inggris sebagai awalan, sedangkan "Base" berfungsi baik sebagai kata sifat (awalan) atau kata benda (sufiks).
Slipp D. Thompson

1
@Iain: Alasan orang menggunakan "Base" dalam nama kelas bukanlah untuk dapat menemukan semua kelas dasar— alasannya lebih mendekati kebalikannya. Ini agar kelas dasar dari sejumlah kelas terkait menonjol dari mereka, mirip dengan awalan “I” yang dimaksudkan untuk membedakan antarmuka dari kelas yang mengadopsinya. Saya telah melihat awalan / sufiks "Base" yang paling sering digunakan ketika kelas dasar tidak berfungsi dengan sendirinya — abstrak oleh penggunaan yang dimaksudkan, terlepas dari yang diberlakukan abstract.
Slipp D. Thompson

@ SlippD.Thompson ya, 'temukan semua kelas' adalah tanggapan Abhishek. Saya menjawab atas jawaban Paul.
Iain

2

Kami menggunakan BaseEntity, tetapi menurut saya itu adalah preferensi Anda sendiri. Saya sering melihat yang lain.

Bersikaplah konsisten dalam konteks Anda, baik itu proyek Anda, namespace atau jika mungkin, tim Anda. Konvensi yang berbeda lebih buruk daripada IMHO konvensi yang buruk.


2

Secara pribadi, saya akan merekomendasikan untuk tidak menambahkan basis kata sama sekali. Anda tidak pernah tahu kapan Anda harus mengubah kode di sekitar dan itu tidak akan menjadi objek dasar lagi. Karena itu, kami telah melakukan ini di masa lalu, kami memberi awalan kata Base di depan. Sepertinya mengalir lebih baik.


-1

BaseEntity sangat mirip dengan camel case - strName, bseEntity. Saya akan memilih EntityBase karena ini mendefinisikan subjek terlebih dahulu, yang akan membantu Anda mengidentifikasi fungsinya lebih cepat.


10
Anda berbicara tentang notasi Hongaria, bukan selubung unta. Notasi Hungaria kebetulan saja dilapisi unta, tetapi keduanya sama sekali berbeda.
sliderhouserules

-5

Selalu pikirkan tentang alfabet saat Anda menyebutkan sesuatu. Saya benar-benar tidak suka melihat server SQL dan setiap prosedur yang tersimpan dinamai usp [sesuatu]. Sejalan dengan itu, jangan terlalu sering menggunakan Get dan Set sebagai nama depan untuk suatu fungsi. Alih-alih GetItems atau PlaceOrder, pikirkan untuk menamainya sebagai ItemsGet atau OrderPlace.

Jadi, secara umum, ClassnameBase / EntityBase akan menjadi pilihan yang lebih baik.


9
Tidak setuju; Keterbacaan. GetItems lebih masuk akal daripada ItemsGet.
Nathan Ridley

2
Tidak setuju ... alasan yang sama seperti di atas .. tetapi tidak dapat memilih ... :(
Mugunth

Berlawanan dengan komentar lain marcc TIDAK menyarankan sesuatu seperti itemgsGet (). Dia menulis item ().
Hontvári Levente
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.