Misalkan saya memiliki kelas abstrak bernama Task
.
Apakah ada standar atau konvensi yang menyarankan agar saya AbstractTask
menamainya?
Misalkan saya memiliki kelas abstrak bernama Task
.
Apakah ada standar atau konvensi yang menyarankan agar saya AbstractTask
menamainya?
Jawaban:
Menurut Bloch's Java Efektif (Butir 18), awalan abstrak adalah konvensi yang digunakan dalam kasus khusus.
Anda dapat menggabungkan kebajikan antarmuka dan kelas abstrak dengan menyediakan kelas implementasi kerangka abstrak untuk digunakan dengan setiap antarmuka nontrivial yang Anda ekspor. ... Dengan konvensi, implementasi kerangka disebut AbstractInterface, di mana Antarmuka adalah nama antarmuka yang mereka implementasikan.
Tapi Bloch juga menunjukkan bahwa nama SkeletalInterface akan masuk akal, tetapi menyimpulkan itu
konvensi abstrak sekarang sudah mapan.
Seperti yang ditunjukkan oleh jawaban lain, secara umum tidak ada alasan untuk menerapkan konvensi penamaan ini untuk semua kelas abstrak.
Tidak ada konvensi. Ini semua tentang apa yang akan membantu Anda, sebagai pengembang, kode lebih cepat dan lebih baik, dan membantu orang lain memahami kode Anda.
Tanyakan kepada orang-orang yang akan melihat dan memelihara kode. Apa yang ingin mereka lihat? Apa yang akan membuatnya lebih mudah? Kemudian beri nama berdasarkan apa yang mereka inginkan.
Pada catatan lain, Konvensi Kode untuk Bahasa Pemrograman Java: 9. Konvensi Penamaan menunjukkan tidak ada persyaratan:
Nama kelas harus berupa kata benda, dalam kasus campuran dengan huruf pertama dari setiap kata internal yang ditulis dengan huruf kapital. Usahakan agar nama kelas Anda tetap sederhana dan deskriptif. Gunakan seluruh kata-hindari akronim dan singkatan (kecuali singkatan jauh lebih banyak digunakan daripada bentuk panjang, seperti URL atau HTML).
Intellisense sepele akan memberitahuku kalau itu abstrak, jadi kau hanya melanggar KERING di sini.
abstract
ke nama kelas tidak melanggar KERING, dan tidak semua orang menggunakan kecerdasan. Sebagai contoh, apa yang Anda lakukan jika Anda membaca kode di halaman web, atau jika itu adalah bagian dari tambalan yang Anda lihat di editor teks biasa atau alat diff eksternal?
abstract class AbstractName
? Jelas memiliki "abstrak" dua kali. Dan jika Anda tidak menggunakan Intellisense, maka itu masalah Anda, semua orang menggunakan alat yang waras untuk melihat kode.
Ini agak masalah preferensi (tetapi praktik buruk batas), tetapi kebanyakan orang tidak suka melihat bagian dari kualifikasi atas nama kelas.
Sebagian besar IDE akan membuat informasi itu mudah tersedia bagi Anda, jadi memasukkannya dalam nama tidak perlu, dan akan lebih bersih jika hanya menghilangkannya. Ini mengingatkan pada notasi hungaria untuk penamaan variabel, dan itu tentu saja dianggap bentuk buruk sekarang-a-hari. Saya sarankan hanya menyebutnya Task
.
Dalam .NET, penggunaan "Basis" sebagai akhiran untuk menunjukkan kelas dasar abstrak sering terlihat. Saya akan merujuk pada jawaban lain, apakah ini adalah praktik umum di Jawa.
Menurut pendapat saya, nama entitas tidak boleh menyampaikan informasi tentang struktur tipenya, tetapi tentang semantiknya. Jadi tidak masuk akal untuk mendefinisikan kelas Anda sebagai "AbstractSomething" jika abstraksi bukan bagian dari tujuan runtime-nya. Itu adalah kelas abstrak dasar yang terlihat oleh programmer, dan tidak perlu tercermin dalam namanya.
Namun, jika membuatnya sempurna untuk menyebut implementasi pabrik abstrak sebagai AbstractFactory, karena itu berkaitan dengan maksud kelas.
Secara umum, nikmatilah konvensi penamaan yang membantu menyampaikan informasi paling banyak tentang tujuan kelas Anda.
Demikian pula, jauhi SomethingImpl
. Kami tidak peduli bahwa ini merupakan implementasi dan bukan kelas dasar. Jika hierarki kelas Anda dirancang dengan benar untuk warisan, maka seseorang dapat mewarisinya. Tentunya tidak akan ada nilai di dalamnya menambahkan lebih banyak sufiks "Impl" atau artefak lainnya. Tidak ada nilai dalam menambahkan akhiran "Antarmuka" atau awalan "Saya".
Mempertimbangkan:
IVehicle <-- IMotoredVehicle <-- AbstractCar <-- CarImpl
Sebagai lawan:
Vehicle <-- MotoredVehicle <-- Car <-- DefaultCar
<-- Ferrari
<-- Trabi
Saya lebih suka yang terakhir.
Ini, dalam beberapa hal, mirip dengan penyalahgunaan yang mencolok dari Notasi Hongaria yang terakhir memberikannya reputasi buruk , karena orang-orang salah menafsirkannya sebagai mengharuskan pengembang untuk mengawali variabel mereka dengan indikator tipe variabel. Meskipun ini kadang-kadang dapat memiliki kegunaannya (kebanyakan jika Anda malas mencari definisi tipe), sebagian besar tidak berguna. Gagasan asli Simonyi dengan Notasi Hongaria adalah menggunakannya sebagai mnemonik untuk mengingatkan pengembang tentang kemampuan entitas, bukan dari jenisnya.
Aturan praktis yang baik adalah untuk tidak menyertakan properti dalam nama yang jelas dari sintaksis. Karena di Jawa, Anda harus menandai kelas abstrak dengan abstract
kata kunci yang dinamai dengan tepat , saya tidak akan memasukkannya ke dalam namanya. Dalam C ++, misalnya, kasingnya tidak begitu jelas, tetapi setidaknya kompiler akan memberi tahu Anda ketika Anda salah menggunakan kelas abstrak. Dalam sesuatu seperti Python lagi, secara eksplisit menyebutkan kelas abstrak seperti itu bukanlah ide yang buruk.
Pengecualian umum untuk aturan adalah ketika nama tersebut ambigu. Jika, karena alasan apa pun, ada subkelas konkret Task
(dalam contoh lain, ini mungkin lebih masuk akal, tapi apa pun), maka tentu saja, gunakan AbstractTask
.
protected abstract SomeClass { }
Ini memberitahu saya ini adalah kelas abstrak. Menambahkan awalan adalah tautologi dan anti-pola dan dalam kebanyakan kasus tidak cocok, lihat tautan di mana itu berbicara tentang package local
menjadi pengecualian misalnya.
Dalam kebanyakan kasus, Abstract
kelas tidak boleh menjadi bagian dari API yang dihadapi publik, jika memang ada alasan yang kuat dan alasan yang baik harus memberikan nama yang jelas selain AbstractSomeClass
.
Dalam kebanyakan kasus, jika Anda tidak dapat membuat nama yang lebih deskriptif, Anda mungkin perlu melakukan desain ulang.
Lima sen saya, Mungkin Anda akan memiliki implementasi kelas abstrak itu dan mereka akan dinamai 'SomeSpecificTask', 'TaskWithBubbles', 'StrangeTask' dll. Jadi tidak akan ada bentrokan nama antara 'Tugas' abstrak Anda dan mereka.
Selain itu, kata 'abstrak' adalah tentang sintaks bahasa, bukan entitas domain bisnis, jadi saya lebih suka untuk tidak menggunakannya sebagai bagian dari nama.
Di sisi lain, dalam satu jawaban di sini saya melihat kutipan dari J.Bloch Java Efektif yang mengatakan bahwa menggunakan 'abstrak' sebagai bagian dari nama adalah praktik yang mapan. Mungkin begitu. Tetapi bagaimanapun juga dalam konvensi kode java resmi tidak ada yang seperti itu.
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
- seseorang tidak dapat menggunakan List
sebagai nama untuk AbstractList
kelas karena itu adalah nama antarmuka. Ini adalah praktik mapan dan bagian dari kode Java resmi yang digunakan di mana sesuatu yang mengimplementasikan antarmuka mungkin atau mungkin tidak memperpanjang kelas abstrak (yang juga mengimplementasikan (beberapa) antarmuka).
Saya bukan pengembang Java (INAJD?) Dan tidak tahu nomenklatur standar untuk hal-hal seperti itu, tapi saya pikir Task
terdengar cukup abstrak sehingga bisa berdiri sendiri apa adanya.
Saya sudah melakukan ini. Saya memang menambahkan 'Abstrak' sebagai awalan ke kelas abstrak saya bernama AbstractOperation. Alasan saya melakukan ini adalah ada paket lain yang memiliki kelas non-abstrak bernama Operation, dan itu membantu tim saya dan para programmer yang mengambil alih kemudian dalam menghindari kebingungan di antara keduanya.