Beberapa waktu yang lalu saya telah membaca sebuah artikel (saya percaya sebuah entri blog) yang menempatkan saya di jalur yang "benar" pada objek penamaan: Menjadi sangat sangat teliti tentang penamaan hal-hal dalam program Anda.
Misalnya jika aplikasi saya (sebagai aplikasi bisnis biasa) menangani pengguna, perusahaan, dan alamat, saya akan memiliki User
, Company
dan Address
kelas domain - dan mungkin di suatu tempat UserManager
, CompanyManager
dan AddressManager
akan muncul yang menangani hal-hal itu.
Jadi bisakah Anda tahu apa itu UserManager
, CompanyManager
dan AddressManager
lakukan? Tidak, karena Manajer adalah istilah yang sangat umum yang cocok untuk apa pun yang dapat Anda lakukan dengan objek domain Anda.
Artikel yang saya baca direkomendasikan menggunakan nama yang sangat spesifik. Jika itu adalah aplikasi C ++ dan UserManager
pekerjaan itu mengalokasikan dan membebaskan pengguna dari tumpukan itu tidak akan mengatur pengguna tetapi menjaga kelahiran dan kematian mereka. Hmm, mungkin kita bisa menyebutnya a UserShepherd
.
Atau mungkin UserManager
tugasnya adalah untuk memeriksa data setiap objek Pengguna dan menandatangani data secara kriptografis. Maka kita akan punya UserRecordsClerk
.
Sekarang ide ini macet dengan saya, saya mencoba menerapkannya. Dan menemukan ide sederhana ini sangat sulit.
Saya dapat menjelaskan apa yang dikerjakan oleh kelas dan (selama saya tidak masuk ke pengkodean cepat & kotor), kelas yang saya tulis melakukan satu hal. Apa yang saya rindukan dari deskripsi ke nama adalah semacam katalog nama, kosa kata yang memetakan konsep ke nama.
Pada akhirnya saya ingin memiliki sesuatu seperti katalog pola dalam pikiran saya (seringkali pola desain dengan mudah memberikan nama objek, misalnya pabrik )
- Pabrik - Membuat objek lain (penamaan diambil dari pola desain)
- Shepherd - Seorang gembala menangani masa objek, penciptaan dan penutupannya
- Sinkronisasi - Menyalin data antara dua objek atau lebih (atau hierarki objek)
Pengasuh - Membantu benda mencapai keadaan "dapat digunakan" setelah penciptaan - misalnya dengan menghubungkan kabel ke objek lain
dll.
Jadi, bagaimana Anda menangani masalah itu? Apakah Anda memiliki perbendaharaan kata yang tetap, apakah Anda menemukan nama baru dengan cepat atau apakah Anda menganggap penamaan hal-hal yang tidak begitu penting atau salah?
PS: Saya juga tertarik dengan tautan ke artikel dan blog yang membahas masalah ini. Sebagai permulaan, inilah artikel asli yang membuat saya berpikir tentang hal ini: Memberi Penamaan Kelas Java tanpa 'Manajer'
Pembaruan: Ringkasan jawaban
Inilah sedikit ringkasan dari apa yang saya pelajari dari pertanyaan ini sementara itu.
- Cobalah untuk tidak membuat metafora baru (Nanny)
- Lihatlah apa yang dilakukan kerangka kerja lainnya
Artikel / buku lebih lanjut tentang topik ini:
- Apa nama yang Anda temukan sendiri / tambahkan ke kelas secara teratur?
- Apa pendekatan terbaik untuk penamaan kelas?
- Buku: Pola Desain: Elemen-elemen Perangkat Lunak Berorientasi Objek yang Dapat Digunakan Kembali (Hardcover)
- Buku: Pola Arsitektur Aplikasi Perusahaan (Hardcover)
- Buku: Pola Implementasi (Paperback)
Dan daftar awalan nama / sufiks yang saya kumpulkan (secara subyektif!) Dari jawaban:
- Koordinator
- Pembangun
- Penulis
- Pembaca
- Handler
- Wadah
- Protokol
- Target
- Konverter
- Pengendali
- Melihat
- Pabrik
- Kesatuan
- Ember
Dan tip yang bagus untuk jalan:
Jangan lumpuh penamaan. Ya, nama itu sangat penting tetapi itu tidak cukup penting untuk menghabiskan banyak waktu. Jika Anda tidak dapat menemukan nama baik dalam 10 menit, lanjutkan.
Jawaban:
Saya mengajukan pertanyaan serupa , tetapi jika memungkinkan saya mencoba menyalin nama-nama yang sudah ada dalam kerangka .NET , dan saya mencari ide di kerangka Java dan Android .
Tampaknya
Helper
,,Manager
danUtil
merupakan kata benda yang tidak dapat dihindari yang Anda lampirkan untuk mengoordinasikan kelas yang tidak mengandung keadaan dan umumnya prosedural dan statis. Alternatifnya adalahCoordinator
.Anda bisa mendapatkan prosey terutama ungu dengan nama dan pergi untuk hal-hal seperti
Minder
,Overseer
,Supervisor
,Administrator
, danMaster
, tapi seperti yang saya katakan saya lebih suka menyimpannya seperti nama kerangka kerja Anda terbiasa.Beberapa sufiks umum lainnya (jika itu istilah yang benar) yang juga Anda temukan dalam kerangka .NET adalah:
Builder
Writer
Reader
Handler
Container
sumber
Conductor
, seperti konduktor orkestra musikal. Ini pasti peran yang penting, tergantung pada sifat kolaborasi yang Anda butuhkan untuk "melakukan" (objek lain menjadi aktor yang sangat khusus yang harus menanggapi perintah terpusat dan tidak terlalu khawatir tentang setiap kolaborator lainnya).Anda dapat melihat pada source-code-wordle.de , saya telah menganalisis sufiks nama kelas yang paling sering digunakan dari .NET framework dan beberapa pustaka lainnya.
20 teratas adalah:
sumber
Thingy
.Saya semua untuk nama baik, dan saya sering menulis tentang pentingnya berhati-hati ketika memilih nama untuk sesuatu. Untuk alasan yang sama ini, saya mewaspadai metafora ketika menyebutkan sesuatu. Dalam pertanyaan awal, "pabrik" dan "sinkronisasi" terlihat seperti nama yang bagus untuk arti sebenarnya. Namun, "gembala" dan "pengasuh" tidak, karena mereka didasarkan pada metafora . Kelas dalam kode Anda tidak bisa benar - benar pengasuh; Anda menyebutnya pengasuh karena merawat beberapa hal lain seperti pengasuh kehidupan nyata merawat bayi atau anak-anak. Tidak apa-apa dalam pidato informal, tetapi tidak OK (menurut saya) untuk penamaan kelas dalam kode yang harus dipertahankan oleh siapa yang tahu siapa yang tahu kapan.
Mengapa? Karena metafora tergantung pada budaya dan seringkali juga tergantung pada individu. Bagi Anda, memberi nama kelas "pengasuh" bisa sangat jelas, tetapi mungkin tidak jelas bagi orang lain. Kita seharusnya tidak mengandalkan itu, kecuali Anda menulis kode yang hanya untuk penggunaan pribadi.
Bagaimanapun, konvensi dapat membuat atau menghancurkan metafora. Penggunaan "pabrik" itu sendiri didasarkan pada metafora, tetapi yang sudah ada cukup lama dan saat ini cukup terkenal di dunia pemrograman, jadi saya akan mengatakan itu aman untuk digunakan. Namun, "pengasuh" dan "gembala" tidak dapat diterima.
sumber
Kita bisa melakukannya tanpa
xxxFactory
,xxxManager
atauxxxRepository
kelas jika kita memodelkan dunia nyata dengan benar:;-)
sumber
Universe.Instance.ToParallel()
Kedengarannya seperti kemiringan yang licin untuk sesuatu yang akan diposting di thedailywtf.com, "ManagerOfPeopleWhoHaveMortgages", dll.
Saya kira benar bahwa satu kelas Manajer monolitik bukanlah desain yang baik, tetapi menggunakan 'Manajer' tidak buruk. Alih-alih UserManager, kami mungkin memecahnya menjadi UserAccountManager, UserProfileManager, UserSecurityManager, dll.
'Manajer' adalah kata yang baik karena jelas menunjukkan kelas tidak mewakili 'hal' dunia nyata. 'AccountsClerk' - bagaimana saya bisa tahu apakah itu kelas yang mengelola data pengguna, atau mewakili seseorang yang merupakan Petugas Akun untuk pekerjaan mereka?
sumber
Karena Anda tertarik dengan artikel di bidang ini, Anda mungkin tertarik dengan artikel opini Steve Yegge "Eksekusi di Kerajaan Kata Benda":
http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html
sumber
Ketika saya menemukan diri saya berpikir tentang menggunakan
Manager
atauHelper
dalam nama kelas, saya menganggapnya sebagai bau kode yang berarti saya belum menemukan abstraksi yang tepat dan / atau saya melanggar prinsip tanggung jawab tunggal , jadi refactoring dan berusaha lebih banyak ke dalam desain sering membuat penamaan jauh lebih mudah.Tetapi bahkan kelas yang dirancang dengan baik tidak (selalu) menyebutkan nama sendiri, dan pilihan Anda sebagian bergantung pada apakah Anda membuat kelas model bisnis atau kelas infrastruktur teknis.
Kelas model bisnis bisa sulit, karena mereka berbeda untuk setiap domain. Ada beberapa istilah yang sering saya gunakan, seperti
Policy
untuk kelas strategi dalam suatu domain (misalnya,LateRentalPolicy
), tetapi ini biasanya berasal dari upaya membuat " bahasa di mana-mana " yang dapat Anda bagikan dengan pengguna bisnis, merancang dan menamai kelas sehingga mereka memodelkan nyata Ide-ide-dunia, objek, tindakan, dan peristiwa.Kelas infrastruktur teknis sedikit lebih mudah, karena mereka menggambarkan domain yang kita kenal dengan baik. Saya lebih suka memasukkan nama-nama pola desain ke dalam nama kelas, seperti
InsertUserCommand,
CustomerRepository,
atauSapAdapter.
saya mengerti keprihatinan tentang mengkomunikasikan implementasi alih-alih maksud, tetapi pola desain menggabungkan kedua aspek desain kelas ini - setidaknya ketika Anda berurusan dengan infrastruktur, di mana Anda menginginkan desain implementasi menjadi transparan bahkan saat Anda menyembunyikan detailnya.sumber
Policy
akhiran untuk kelas yang mengandung logika bisnisMenjadi au fait dengan pola seperti yang didefinisikan oleh (katakanlah) buku GOF , dan penamaan objek setelah ini membuat saya jauh dalam penamaan kelas, mengatur mereka dan berkomunikasi maksud. Kebanyakan orang akan memahami nomenklatur ini (atau setidaknya sebagian besar darinya).
sumber
Jika saya tidak dapat membuat nama yang lebih konkret untuk kelas saya daripada XyzManager, ini akan menjadi poin bagi saya untuk mempertimbangkan kembali apakah ini benar-benar fungsionalitas yang dimiliki bersama dalam suatu kelas, yaitu 'bau kode' arsitektur.
sumber
Saya pikir hal yang paling penting untuk diingat adalah: apakah namanya cukup deskriptif? Bisakah Anda tahu dengan melihat nama apa yang seharusnya dilakukan Kelas? Menggunakan kata-kata seperti "Manajer", "Layanan" atau "Handler" dalam nama kelas Anda dapat dianggap terlalu umum, tetapi karena banyak programmer menggunakannya, itu juga membantu memahami untuk apa kelas itu.
Saya sendiri telah banyak menggunakan fasad-pola (setidaknya, saya pikir itulah namanya). Saya dapat memiliki
User
kelas yang menjelaskan hanya satu pengguna, danUsers
kelas yang melacak "kumpulan pengguna" saya. Saya tidak memanggil kelasUserManager
karena saya tidak suka manajer di kehidupan nyata dan saya tidak ingin diingatkan tentang mereka :) Cukup menggunakan bentuk jamak membantu saya memahami apa yang dilakukan kelas.sumber
Users
, terutama jika Anda melewati objek manajer.this.users = new Users()
Tetapi kemudian selalu di tempat lain dalam kode Andausers
akan merujuk ke arrayUser
s.Khusus untuk C #, saya menemukan "Pedoman Desain Kerangka Kerja: Konvensi, Idiom, dan Pola untuk Reusable .NET Libraries" memiliki banyak informasi bagus tentang logika penamaan.
Sejauh menemukan kata-kata yang lebih spesifik, saya sering menggunakan tesaurus dan melompati kata-kata terkait untuk mencoba dan menemukan yang baik. Saya mencoba untuk tidak menghabiskan banyak waktu dengan itu, karena saya maju melalui pengembangan saya datang dengan nama yang lebih baik, atau kadang-kadang menyadari bahwa
SuchAndSuchManager
harus benar-benar dipecah menjadi beberapa kelas, dan kemudian nama kelas yang sudah usang itu menjadi bukan masalah. .sumber
Saya percaya hal penting di sini adalah konsisten dalam lingkup visibilitas kode Anda, yaitu selama semua orang yang perlu melihat / mengerjakan kode Anda memahami konvensi penamaan Anda maka itu harus baik-baik saja, bahkan jika Anda memutuskan untuk memanggil mereka 'CompanyThingamabob' dan 'UserDoohickey'. Perhentian pertama, jika Anda bekerja untuk sebuah perusahaan, adalah untuk melihat apakah ada konvensi perusahaan untuk penamaan. Jika tidak ada atau Anda tidak bekerja untuk suatu perusahaan maka buat istilah menggunakan Anda sendiri yang masuk akal bagi Anda, sebarkan di sekitar beberapa kolega / teman tepercaya yang setidaknya kode dengan santai, dan masukkan umpan balik yang masuk akal.
Menerapkan konvensi orang lain, bahkan ketika itu diterima secara luas, jika itu tidak melompat keluar halaman pada Anda adalah sedikit kesalahan dalam buku saya. Pertama dan terutama saya perlu memahami kode saya tanpa referensi ke dokumentasi lain tetapi pada saat yang sama harus cukup generik sehingga tidak dapat dimengerti oleh orang lain di bidang yang sama dalam industri yang sama.
sumber
Saya akan mempertimbangkan pola yang Anda gunakan untuk sistem Anda, konvensi penamaan / kataloging / pengelompokan kelas cenderung didefinisikan oleh pola yang digunakan. Secara pribadi, saya tetap pada konvensi penamaan ini karena mereka adalah cara yang paling mungkin bagi orang lain untuk dapat mengambil kode saya dan menjalankannya.
Misalnya UserRecordsClerk mungkin lebih baik dijelaskan sebagai memperluas antarmuka RecordsClerk generik yang mengimplementasikan UserRecordsClerk dan CompanyRecordsClerk dan kemudian berspesialisasi, artinya orang dapat melihat metode-metode dalam antarmuka untuk melihat apa yang biasanya dilakukan oleh subkelasnya.
Lihat buku seperti Pola Desain untuk info, itu buku yang bagus dan mungkin bisa membantu Anda menjernihkan tujuan Anda dengan kode Anda - jika Anda belum menggunakannya! ;Hai)
Saya rasa selama pola Anda dipilih dengan baik dan digunakan sejauh yang tepat, maka nama kelas yang cukup sederhana dan tidak mencukupi sudah cukup!
sumber