Pertanyaan yang canggung dan terbuka, tapi ini masalah yang selalu saya lawan:
Perangkat lunak yang mudah dirawat dan digunakan adalah perangkat lunak yang dirancang dengan baik. Mencoba membuat desain yang intuitif berarti memberi nama komponen Anda sedemikian rupa sehingga pengembang berikutnya harus dapat menyimpulkan fungsi komponen. Inilah sebabnya kami tidak memberi nama kelas kami "Type1", "Type2", dll.
Saat Anda memodelkan konsep dunia nyata (mis. Pelanggan), ini umumnya sesederhana memberi nama tipe Anda setelah konsep dunia nyata dimodelkan. Tetapi ketika Anda sedang membangun hal-hal abstrak, yang lebih berorientasi sistem, sangat mudah kehabisan nama yang mudah dibaca dan mudah dicerna.
Semakin buruk (bagi saya) ketika mencoba untuk menamai keluarga jenis, dengan tipe-dasar atau antarmuka yang menggambarkan apa yang harus dilakukan komponen, tetapi tidak bagaimana mereka bekerja. Ini secara alami mengarah ke masing-masing jenis turunan yang mencoba menggambarkan rasa implementasi (misalnya IDataConnection
dan SqlConnection
dalam .NET Framework), tetapi bagaimana Anda mengekspresikan sesuatu yang rumit seperti "bekerja dengan refleksi dan mencari set atribut tertentu"?
Kemudian, ketika Anda akhirnya memilih nama untuk tipe yang menurut Anda menggambarkan apa yang ingin dilakukan, kolega Anda bertanya "WTF apakah ini DomainSecurityMetadataProvider
benar - benar dilakukan? "
Apakah ada teknik yang baik untuk memilih nama yang bermaksud baik untuk suatu komponen, atau bagaimana membangun kumpulan komponen tanpa mendapatkan nama yang kacau?
Apakah ada tes sederhana yang dapat saya terapkan pada nama untuk mendapatkan perasaan yang lebih baik untuk apakah nama itu "baik", dan harus lebih intuitif kepada orang lain?
Jawaban:
Untuk penamaan, ada enam teknik yang terbukti berhasil untuk saya:
PS. Jika API Anda akan dipublikasikan, hal di atas berlaku sebelum itu - karena, Anda tahu,
sumber
Tes dasar saya adalah jika Anda dapat menggambarkan fungsi variabel hanya menggunakan kata-kata dari variabel:
Namun, ada nuansa yang berbeda dari orang ke orang:
Jadi tes lanjutan saya adalah menuliskan variabel di papan / wiki / chat, dan minta orang menebak apa artinya.
sumber
Tidak juga.
Satu tip, bagaimanapun, adalah untuk menghindari "suara pasif".
"DomainSecurityMetadataProvider" pasif. Tidak ada kata kerja, itu semua kata benda dan kata benda digunakan sebagai kata sifat.
"ProvidMetadataForDomainSecurity" lebih aktif. Ada kata kerja.
Pemrograman berorientasi objek adalah semua (benar-benar) kata benda-kata kerja. Kata benda == objek. Verb == metode. Jadi nama kelas umumnya sangat "kata benda". Untuk menghentikan kebiasaan ini, dan mulai memasukkan kata kerja, sulit.
Iya nih. Anda mendefinisikan tes yang sangat baik dalam pertanyaan Anda. Tanyai orang lain.
Di masa lalu kami menyebutnya "penelusuran desain". Itu adalah masalah besar, berkeringat dalam metodologi air terjun. Saat ini, dengan metode Agile, itu harus menjadi kolaborasi biasa antara penulis dan pengguna kelas. Tidak butuh waktu lama. Membahas desain (dan nama-nama) sebelum menulis tes (dan kode) akan mengurangi faktor keheranan dan dapat mencegah WTF.
sumber
ProvideMetadataForDomainSecurity
nama tipe yang buruk. Nama metode biasanya lebih mudah dinamai karena saya bebas menggunakan kata kerja. Pembatasan bahasa adalah inti masalahnya.Menggunakan tesaurus
Sangat sering saya akan merujuk pada tesaurus ketika melakukan pengembangan baru untuk menemukan kata-kata yang tepat untuk menggambarkan kelas dan metode saya.
Kelas yang terutama berisi logika operasi
Saya cenderung memberi nama kelas yang terutama menyediakan metode operasi dalam struktur kata benda seperti "EntityProvider", "EntityLocator", dll.
Kelas-kelas ini umumnya tidak mengandung banyak negara.
Kelas yang berisi status
Layar UI dan entitas data pada umumnya stateful, jadi saya cukup memberi nama kelas-kelas ini dengan pola kata benda atau kata benda.
Contoh: Orang, Karyawan, Karyawan Lancar, Karyawan Lepas
Kelas utilitas
Kelas yang hanya berisi metode statis umumnya dianggap kelas "utilitas", jadi saya secara konsisten menamainya dengan akhiran "Utilitas".
Contoh: NetworkUtilities, FileUtilities
Tes
Saya tidak memiliki tes yang baik untuk memutuskan apakah ada nama yang salah, tetapi saya akan menyarankan untuk mencoba menggunakan kata benda dan / atau kata kerja tunggal dalam nama, kemudian pikirkan apakah kata benda / kata kerja itu secara akurat menggambarkan apa yang Anda ' penamaan kembali.
Jika Anda merasa bahwa ada lebih banyak ke kelas / metode yang tidak ditangkap oleh nama, maka kelas / metode itu mungkin perlu di refactored.
Alan Green dan Jeff Attwood telah menulis tentang kejahatan penamaan kelas dengan akhiran "Manajer". Mereka berpendapat bahwa istilah "Manajer" terlalu sering digunakan dan terlalu samar untuk menyampaikan sesuatu yang bermakna. Saya harus setuju.
Artikel Jeff juga menyediakan daftar panduan yang disarankan dari Steve McConnell's Code Complete.
variabel
Baru-baru ini saya telah bereksperimen dengan nama variabel / parameter deskriptif yang lebih panjang yang menggabungkan preposisi, seperti "Of", "By", "For", dll. Beberapa contoh ditunjukkan di bawah ini:
Saya menemukan bahwa ini berfungsi baik dengan fitur intellisense Visual Studio membuatnya mudah untuk mengetik nama-nama panjang ini. Saya juga menemukan bahwa ada lebih sedikit duplikasi awalan nama variabel (mis. PersonID, personFirstName, personLastName vs idOfPerson, firstNameOfPerson, lastNameOfPerson), memberikan hash yang lebih baik yang membuat intellisense semakin berguna.
sumber
List
, array,IEnumerable
atauConcurrentQueue
. Ini adalah kumpulan ID yang harus saya sebutkan, dan detail implementasi bagaimana penyimpanannya adalah bagasi mental yang tidak perlu. Meskipun secara umum saya setuju bahwa jika nama yang lebih panjang jauh lebih deskriptif, itu harus lebih disukai daripada nama yang lebih pendek dan kurang jelas.Apa nama yang Anda harapkan untuk kelas khusus kompleks dan domain? Ini adalah tentang sebaik yang akan didapat tanpa membuat nama kelas Anda kalimat (yang akan membuat semua orang berpikir Anda telah memberikan terlalu banyak tanggung jawab ke satu kelas)
Saya akan mempertimbangkan menjatuhkan penyedia dari nama. Jika secara spesifik menyebutkan Metadata, semua orang sudah tahu Anda menggunakan refleksi. Anda bisa menjadikannya satu kata lebih ringkas (atau mungkin berubah ke kata lain - itu lebih merupakan konsumen daripada penyedia dari apa yang Anda tulis)
sumber
ISecurityMetadataProvider
antarmuka, yang ada titik injeksi dalam infrastruktur keamanan, untuk memberikan informasi kepada subsistem. Penamaan itu sulit.DomainSecurityMetadataProvider
sebagai penyediaDomainSecurityMetadata
objek, di manaDomainSecurityMetadata
metadata itu sendiri. Nama yang jelas dan mudah dimengerti. Aku bahkan tidak perlu tahu apaDomainSecurityMetadata
itu! Ini hanya beberapa objek, yang disediakan penyedia ini. Hanya menghapusProvider
akhiran tidak meningkatkan keterbacaan, tetapi justru sebaliknya - kurangi itu. Tanpa akhiran ini saya akan berpikir bahwa itu hanya beberapa metadata (objek kontainer untuk beberapa metadata), tetapi bukan objek untuk mendapatkan metadata dari (penyedia).Gunakan metafora untuk menggambarkan bagian-bagian dari sistem. Tidak hanya itu akan membuat Anda menemukan analogi baru, ini akan membantu penamaan yang lebih mudah.
(Saya sadar ini bukan contoh yang kuat tapi pokoknya) Sebagai contoh Anda dapat memanggil variabel atau tipe sebagai
mailbox
, yang berfungsi sebagai antrian untuk pesan yang diterima untuk kelas.sumber
Satu hal yang akan saya tegaskan adalah bahwa Nama TIDAK PERNAH boleh dibiarkan salah. Contoh terbaik, selama beberapa factoring, banyak kode berubah, dan beberapa variabel mulai merujuk pada sesuatu selain dari apa yang disarankan oleh nama mereka.
Tidak lama kemudian, seorang programmer menghabiskan waktu lama dan menggunakan beberapa panggilan database yang sangat mahal mencoba untuk mendapatkan potongan-potongan data tertentu yang telah diekstraksi dan disimpan. Saya mengganti nama semuanya dan tiba-tiba kami bisa menghapus satu ton logika yang terlalu rumit dan bermasalah.
sumber
Semoga kasus di mana Anda harus berpikir keras tentang nama-nama itu jarang terjadi. Ketika kasus-kasus itu muncul, tulis saja sebuah paragraf yang menjelaskan apa yang dilakukan kelas. Berlawanan dengan komentar in-function atau komentar level fungsi, tujuan utama suatu kelas jarang berubah sehingga risiko komentar yang keluar dari tanggal relatif kecil. Jadi, Anda memiliki kemewahan menulis beberapa paragraf atau bahkan menggambar ASCII untuk menjelaskan apa yang dilakukan kelas.
sumber