Konvensi penamaan untuk kelas abstrak

102

Saya ingat dengan jelas bahwa, pada suatu waktu, pedoman yang didorong oleh Microsoft adalah menambahkan sufiks "Base" ke kelas abstrak untuk meniadakan fakta bahwa itu abstrak. Oleh karena itu, kami memiliki kelas seperti System.Web.Hosting.VirtualFileBase, System.Configuration.ConfigurationValidatorBase, System.Windows.Forms.ButtonBase, dan, tentu saja, System.Collections.CollectionBase.

Tapi saya perhatikan bahwa, akhir-akhir ini, banyak kelas abstrak dalam Framework sepertinya tidak mengikuti konvensi ini. Misalnya, kelas-kelas berikut semuanya abstrak tetapi tidak mengikuti konvensi ini:

  • System.DirectoryServices.ActiveDirectory.DirectoryServer

  • System.Configuration.ConfigurationElement

  • System.Drawing.Brush

  • System.Windows.Forms.CommonDialog

Dan itulah yang bisa saya kembangkan dalam beberapa detik. Jadi saya mencari apa yang tertulis di dokumentasi resmi, untuk memastikan saya tidak gila. Saya menemukan Nama Kelas, Struktur, dan Antarmuka di MSDN di Pedoman Desain untuk Mengembangkan Perpustakaan Kelas . Anehnya, saya tidak dapat menemukan pedoman untuk menambahkan "Base" di akhir nama kelas abstrak. Dan pedoman tidak lagi tersedia untuk versi 1.1 dari Framework.

Jadi, apakah saya kehilangannya? Apakah pedoman ini pernah ada? Apakah itu ditinggalkan begitu saja tanpa sepatah kata pun? Apakah saya telah membuat nama kelas yang panjang sendirian selama dua tahun terakhir secara gratis?

Seseorang melempar saya tulang di sini.

Perbarui Saya tidak gila. Pedoman itu ada. Krzysztof Cwalina mengeluhkannya pada tahun 2005.

Mike Hofer
sumber
Jika Anda membaca bagian itu, Krzysztof hanya mengeluh tentang menerima "serangkaian rekomendasi" - belum tentu bahwa rekomendasi tersebut resmi Microsoft. Saya ingat membaca pedoman MS dan melihat mereka merekomendasikan untuk tidak melakukannya.
John Rudy
1
Saya membacanya, meskipun ini pertama kalinya saya ingat pernah melihat artikel itu. Ini melegakan, sebenarnya. Saya tidak pernah benar-benar menyukai rekomendasi itu. Ini akan menyelamatkan saya dari banyak geraman mulai sekarang. :)
Mike Hofer

Jawaban:

19

Juga, jika kelas abstrak memiliki beberapa anggota statis yang akan digunakan, 'Basis' bisa menjadi jelek.

Joel Coehoorn
sumber
14

Saya tidak ingat pedoman seperti itu. Saya yakin Anda harus menggunakan penamaan yang masuk akal. Terkadang kelas abstrak hanya dirancang untuk menyediakan fungsionalitas umum untuk beberapa kelas (sebagai alat), yang menurut saya harus memiliki sufiks. Namun, dalam beberapa kasus, Anda ingin menggunakannya sebagai basis hierarki polimorfisme yang tidak lengkap itu sendiri. Dalam kasus tersebut saya menyarankan penamaan seperti kelas normal.

Seperti yang Anda lihat, Anda mungkin tidak akan mendeklarasikan metode yang menerima ButtonBase sebagai parameter. Ini dirancang untuk memberikan fungsionalitas minimal untuk subclass. Namun, Anda mungkin memperlakukan a ConfigurationElementsebagai entitas yang memiliki bentuk berbeda tetapi tidak lengkap dengan sendirinya (dan karenanya abstrak)

Mehrdad Afshari
sumber
11

Terkadang Basis masih diperlukan, terutama saat Anda menyediakan kelas konkret dan kelas abstrak bagi seseorang untuk diperluas guna membuat implementasi konkret.
misalnya Controller dan ControllerBase (sebenarnya Controller juga abstrak, tetapi menyediakan fungsionalitas yang jauh lebih signifikan daripada ControllerBase)

Akhiran dasar jelek saat memprogram dengan antarmuka, jadi menurut saya pedoman Microsoft untuk tidak menggunakannya berlaku ketika kelas abstrak sebagian besar digunakan seperti antarmuka. Mungkin yang mereka maksud dengan API Publik.

Intinya adalah ada kasus di mana tidak ada alternatif yang lebih baik untuk menggunakan akhiran dasar.

James
sumber
4
Saya setuju. Saya bekerja dalam sistem umpan yang mengurai konten dari sumber yang berbeda. Kami menggunakan API publik sebuah antarmuka bernama IFeedParser , dan secara internal kami menggunakan kelas abstrak dasar yang berisi fungsionalitas umum bernama BaseFeedParser
Rui Jarimba
1

Saya memahami keinginan untuk menghindari Base-Sufiks, tapi saya juga memahami kebutuhan untuk beberapa Akhiran. Sekarang, Komentar artikel ini menyarankan penggunaan "Type" sebagai Suffix sebagai pilihan kedua untuk tidak menggunakan apapun. Saya percaya ini membingungkan, tetapi Gagasan bahwa "kata yang tidak berkomitmen seperti itu cenderung menunjukkan bahwa itu adalah kelas yang tidak berkomitmen" melekat pada saya.

Sebagai Alternatif: Saya lebih suka menggunakan "Jenis" sebagai sufiks untuk menyatakan objek sebagai "dari atau milik ras atau keluarga tertentu" ( Wiktionary: -kind ).

Contoh: DataProviderdan ReflectiveDataProviderkeduanyaDataProviderKind

Terinspirasi oleh Biology di mana misalnya "canis lupus" milik keluarga "Canoidea", yang secara kasar diterjemahkan menjadi "dog-ish".

Kooooons
sumber
1

Microsoft menyatakan, di:

https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces

"✓ PERTIMBANGKAN mengakhiri nama kelas turunan dengan nama kelas dasar. Ini sangat mudah dibaca dan menjelaskan hubungannya dengan jelas. Beberapa contoh kode ini adalah: ArgumentOutOfRangeException, yang merupakan semacam Exception, dan SerializableAttribute, yang merupakan jenis Atribut. Namun, penting untuk menggunakan penilaian yang wajar dalam menerapkan pedoman ini; misalnya, kelas Tombol adalah sejenis peristiwa Kontrol, meskipun Kontrol tidak muncul dalam namanya. "

Secara umum, ini secara implisit mengesampingkan penggunaan "Base" dalam nama.

Sam Jazz
sumber