Haruskah saya menambahkan awalan “Abstrak” ke kelas abstrak saya? [Tutup]

20

Misalkan saya memiliki kelas abstrak bernama Task.

Apakah ada standar atau konvensi yang menyarankan agar saya AbstractTaskmenamainya?

juan
sumber
Konvensi penamaan yang tercantum di sini: oracle.com/technetwork/java/codeconventions-135099.html menyarankan tidak, meskipun tautan ini: stackoverflow.com/questions/1006332/… mengatakan Anda bisa dan itu tidak akan menjadi hal yang buruk jika Anda melakukannya.
FrustratedWithFormsDesigner
Dalam C # konvensi standar adalah Suffix dengan '* Base'.
Den

Jawaban:

26

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.

scarfridge
sumber
15

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).

Dinamis
sumber
13

Intellisense sepele akan memberitahuku kalau itu abstrak, jadi kau hanya melanggar KERING di sini.

DeadMG
sumber
21
-1 Menambahkan abstractke 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?
Bryan Oakley
10
@Bryan: Tentu saja itu melanggar KERING. 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.
DeadMG
13
"Semua orang"? Sebagian besar orang yang saya kenal menggunakan emacs dan vi, dengan beberapa yang menggunakan gerhana. Mengatakan sesuatu adalah "masalah Anda" bukanlah definisi kerja tim. Maksud saya yang buruk adalah, Anda tidak bisa hanya menetapkan aturan selimut dan mengatakan itulah yang dilakukan. Tim yang berbeda memiliki persyaratan yang berbeda, dan tidak semua orang membutuhkan bantuan dengan intellisense. Plus, seperti yang saya katakan, ada banyak waktu ketika Anda melihat kode di beberapa alat selain editor utama atau IDE.
Bryan Oakley
1
+1 pasti melanggar KERING. Mengandalkan Intellisense agak kuat, tetapi siapa pun yang menggunakan kelas dasar setidaknya harus melihat untuk melihat apa yang mereka kembangkan sebagai bagian dari SOLID.
Gary Rowe
8
@BryanOakley mengapa tidak mengumumkan juga publik dan final? Sebuah nama kelas kemudian akan terlihat seperti PublicAbstractPersonThatImplementsInterfaceHuman. Hmm, tidak yakin itu bagus. Tapi saya setuju, tidak ada yang seperti konvensi universal - gunakan apa pun yang meningkatkan produktivitas kolektif tim.
Apoorv Khurasia
9

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.

Oleksi
sumber
9

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.

KeithS
sumber
1
+1 untuk sufiks "Base" dan "Impl". Mereka membuat titik struktural (kelas abstrak akan menjadi dasar untuk sesuatu).
vski
7
@vski: tidak, saya sangat tidak setuju: itu adalah rasa sakit yang tidak berguna di pantat. Secara umum sangat baik untuk memberi nama antarmuka Anda atau kelas dasar dengan nama generik yang menggambarkan antarmuka, dan implementasi konkret Anda dengan nama yang lebih jelas.
haylem
3
Saya cenderung menggunakan ... Base untuk kelas dasar di belakang sebuah antarmuka. Nama baik sudah diambil oleh antarmuka, dan kelas dasar tidak digunakan oleh kode klien.
starblue
1
@Haylem banyak pola desain java menggunakan antarmuka dengan hanya satu implementasi yang diharapkan. Impl adalah sufiks yang sangat berguna dalam kasus ini.
funkybro
Mengenai penggunaan Impl, lihat Default vs Impl - tinggal jauh dari Impl! Menggunakan Basis sebagai akhiran (mis. TaskBase) menyiratkan bahwa kelas dasar adalah pola daripada konstruksi bahasa.
Gary Rowe
8

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.

haylem
sumber
3

Aturan praktis yang baik adalah untuk tidak menyertakan properti dalam nama yang jelas dari sintaksis. Karena di Jawa, Anda harus menandai kelas abstrak dengan abstractkata 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.

Benjamin Kloster
sumber
... atau antarmuka seperti Listdan AbstractListkelas (yang mengimplementasikannya).
3
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 localmenjadi pengecualian misalnya.

Dalam kebanyakan kasus, Abstractkelas 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.


sumber
0

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.


sumber
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>- seseorang tidak dapat menggunakan Listsebagai nama untuk AbstractListkelas 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).
-1

Jika Anda bekerja dalam tim, maka seluruh tim harus memutuskan apakah Anda harus mengawali kelas abstrak dengan "Abstrak".

Jika Anda bekerja sendiri, maka sepenuhnya terserah Anda, bukan saya atau siapa pun di situs ini.

CodeART
sumber
-2

Saya bukan pengembang Java (INAJD?) Dan tidak tahu nomenklatur standar untuk hal-hal seperti itu, tapi saya pikir Taskterdengar cukup abstrak sehingga bisa berdiri sendiri apa adanya.

Jesse C. Slicer
sumber
RE: Base Suffix: stackoverflow.com/a/429494/1782
juan
-2

Bagaimana jika Anda ingin menulis AbstractSyntaxTreekelas abstrak ? Atau mungkin hanya abstrak SyntaxTree?

Ini tidak konvensional dan dapat dengan mudah membingungkan orang.

tskuzzy
sumber
-2

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.

Abhishek Oza
sumber