Kelas Penamaan - Bagaimana menghindari menyebut semuanya "Manajer <WhatEver>"? [Tutup]

1188

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, Companydan Addresskelas domain - dan mungkin di suatu tempat UserManager, CompanyManagerdan AddressManagerakan muncul yang menangani hal-hal itu.

Jadi bisakah Anda tahu apa itu UserManager, CompanyManagerdan AddressManagerlakukan? 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 UserManagerpekerjaan 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 UserManagertugasnya 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:

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.

froh42
sumber
11
Itu termasuk dalam komunitas wiki karena tidak ada satu jawaban "terbaik". Ini diskusi.
DOK
13
Itu kontra intuitif. Bukankah seharusnya mereka menyebutnya forum? Saya akan berpikir wiki adalah untuk kumpulan fakta, bukan pendapat.
AaronLS
78
Terima kasih telah menjaga ini diperbarui - tapi ugh, tip terakhir itu saran yang mengerikan! Jika Anda tidak dapat memikirkan nama baik dalam 10 menit, mungkin ada yang salah dengan kelas Anda. (Dengan peringatan standar: 1) sempurna adalah musuh kebaikan, 2) Pengiriman adalah fitur - ingatlah bahwa Anda menimbulkan utang teknis.)
Jeff Sternal
11
Jika Anda tidak dapat menemukan nama baik dalam 10 menit, mintalah bantuan rekan Anda. Jangan menyerah begitu saja.
9
Jika Anda tidak dapat menemukan nama baik dalam 10 menit, coba jelaskan kepada kolega Anda; mereka mungkin memikirkan nama yang baik (user338195), tetapi mencoba menjelaskannya mungkin akan membantu Anda menemukan apa yang salah dengannya ( Jeff ).
WillC

Jawaban:

204

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,, Managerdan Utilmerupakan kata benda yang tidak dapat dihindari yang Anda lampirkan untuk mengoordinasikan kelas yang tidak mengandung keadaan dan umumnya prosedural dan statis. Alternatifnya adalah Coordinator.

Anda bisa mendapatkan prosey terutama ungu dengan nama dan pergi untuk hal-hal seperti Minder, Overseer, Supervisor, Administrator, dan Master, 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
Chris S
sumber
4
Saya sangat suka ini. Mereka tidak jatuh ke dalam perangkap metafora yang buruk atau tidak dikenal karena mereka sudah digunakan oleh .NET Framework. Mungkin menarik untuk melihat perpustakaan lain (Jawa), juga untuk input lebih banyak dari apa yang biasa digunakan.
froh42
Saya ingin menyarankan 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).
heltonbiker
1
Saya tidak percaya solusi untuk kelas-nya adalah datang dengan nama yang berbeda. Seperti yang telah saya baca di banyak posting lain dan saya mencoba mempelajari jawabannya, adalah Anda perlu mengubah arsitekturnya, bukan hanya nama yang digunakan.
Michael Ozeryansky
115

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:

  • atribut
  • Tipe
  • pembantu
  • koleksi
  • konverter
  • pawang
  • info
  • pemberi
  • pengecualian
  • layanan
  • elemen
  • Pengelola
  • simpul
  • pilihan
  • pabrik
  • konteks
  • barang
  • perancang
  • mendasarkan
  • editor
Markus Meyer
sumber
147
Di satu perusahaan tertentu dahulu kala, saya kenal seorang insinyur yang begitu muak dengan peraturan sufiks yang tidak masuk akal dan terus bertambah yang menjangkiti perusahaan itu sehingga ia dengan tegas mengakhiri setiap kelas dengannya Thingy.
8
Daftar nama ini dengan sendirinya tidak begitu berguna tanpa konteks yang suffix harus diterapkan.
Fred
65

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.

CesarGon
sumber
10
Argumen ini benar-benar terurai dalam pabrik yang jelas-jelas itu sendiri adalah metafora. Seringkali metafora akan benar-benar menjernihkan apa yang mungkin menjadi objek yang bagus, sedangkan menjadi kabur atau generik secara otomatis memastikan bahwa satu-satunya cara untuk mengetahui apa yang dilakukan kode adalah dengan membacanya sepenuhnya! Skenario kasus terburuk.
Kzqai
1
+1 untuk menghindari nama 'imut'. Saya pikir sangat menyenangkan bisa berbicara langsung dengan bahasa yang Anda bisa. (Tentu saja, tidak selalu mudah secara langsung, ringkas, tepat dan tidak ambigu sekaligus ...)
andrewf
1
Pilihan inventif dari kata kerja + "er" biasanya akan menjadi lebih jelas untuk kelas-kelas konkret daripada analogi yang penuh warna. Abstraksi baru, di sisi lain - hal-hal yang merupakan konsep baru, "hal yang" baru, bukan hanya "hal" yang baru - sering berfungsi dengan baik sebagai metafora ("kacang" Jawa, "lensa" Haskell, GUI "Windows", banyak "janji" bahasa). Kebanyakan basis kode tidak akan memiliki penemuan asli seperti itu.
Malnormalulo
51

Kita bisa melakukannya tanpa xxxFactory, xxxManageratau xxxRepositorykelas jika kita memodelkan dunia nyata dengan benar:

Universe.Instance.Galaxies["Milky Way"].SolarSystems["Sol"]
        .Planets["Earth"].Inhabitants.OfType<Human>().WorkingFor["Initech, USA"]
        .OfType<User>().CreateNew("John Doe");

;-)

rev herzmeister
sumber
11
Bagaimana Anda bisa sampai ke alam semesta paralel dan dimensi alternatif?
kisah
23
Itu mudah: Omniverse.Instance.Dimensions ["Ours"]. Universes ["Ours"]. Galaksi ... ... oke oke saya akui ini akan membutuhkan kompilasi ulang. ;-)
herzmeister
73
Pembaruan: ini ditambahkan di .NET 4.0 Universe.Instance.ToParallel()
:;
2
Melanggar hukum demeter!
Jonas G. Drange
13
Itu adalah Objects dan Member, bukan nama Class
Harry Berry
39

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?

Pak Boy
sumber
8
Bagaimana dengan UserAccounter, UserProfiler dan UserSecurer? Jika Anda menyingkirkan Manajer, Anda harus menemukan definisi spesifik, yang menurut saya adalah hal yang baik.
Didier A.
10
Bagaimana dengan UserAccount, UserProfile, UserSecurity oO?
clime
3
Saya akan menamainya "MortageOwnersManager"
volter9
Terkadang domain memiliki nama tertentu. Seperti "MortageHolder" yang mungkin lebih baik daripada "MortageOwner"
borjab
24

Ketika saya menemukan diri saya berpikir tentang menggunakan Manageratau Helperdalam 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 Policyuntuk 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,atau SapAdapter.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.

Jeff Sternal
sumber
1
Saya sangat menyukai gagasan menggunakan Policyakhiran untuk kelas yang mengandung logika bisnis
jtate
+1 untuk menyebutkan bau kode yang terkait dengan nama-nama seperti "Manajer" dan "Pembantu". Saya menemukan bahwa jika saya tidak memiliki nama yang jelas untuk hal-hal, biasanya sebagian berasal dari beberapa ketidakjelasan dalam pemahaman saya tentang domain, apakah bisnis atau teknis. Hampir setara, itu bisa berarti saya hanya secara reaktif memecah kelas karena mereka "terlalu besar" - yang bagi saya juga merupakan tanda pemodelan yang tidak memadai. Ini harus menjadi jawaban terpilih teratas.
nclark
10

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

Brian Agnew
sumber
Fowler adalah referensi yang bagus untuk saya tetapi GOF adalah rekomendasi yang bagus.
Lazarus
Maafkan ketidaktahuan saya. Buku Fowler mana yang Anda maksud?
Brian Agnew
19
Hmm, kadang-kadang ini berhasil (misalnya seperti Pabrik atau Strategi) tetapi di lain waktu saya merasa bahwa ini mengkomunikasikan cara implementasi (saya menggunakan pola!) Lebih dari maksud dan pekerjaan kelas. Misalnya, Singleton adalah hal terpenting yang mewakili - dan bukan Singleton. Jadi penamaan yang ketat setelah pola yang digunakan terasa seperti penamaan yang ketat setelah jenis yang digunakan. Misalnya notasi Hongaria sebagai salah diterapkan oleh kelompok Sistem Windows (menggambarkan tipe data C alih-alih "tipe niat")
froh42
1
Untuk kelas infrastruktur teknis, biasanya diinginkan untuk membuat implementasi transparan - dan sebagian besar nama pola desain kanonik mengkomunikasikan implementasi dan niat. Kelas model domain adalah masalah lain.
Jeff Sternal
10

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.

Jasper van den Bosch
sumber
8

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 Userkelas yang menjelaskan hanya satu pengguna, dan Userskelas yang melacak "kumpulan pengguna" saya. Saya tidak memanggil kelas UserManagerkarena 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.

Droozle
sumber
Saya juga sangat suka pendekatan ini karena memudahkan ide manajemen top-down objek. Sekelompok pengguna lebih cenderung menyiratkan bahwa pekerjaan dilakukan antara pengguna dan bukan dari UserManager ke bawah. Juga, memiliki Pengguna memiliki referensi ke Pengguna tidak terasa seaneh memiliki UserManager. Ini lebih terbuka untuk berpikir relatif, daripada hanya OOP.
Seph Reed
Masalah dengan pendekatan ini adalah menjadi sangat sulit untuk mencari kode Anda Users, terutama jika Anda melewati objek manajer. this.users = new Users()Tetapi kemudian selalu di tempat lain dalam kode Anda usersakan merujuk ke array Users.
Snowman
Seperti yang Anda katakan, Pengguna memang menyiratkan "kumpulan pengguna" - kumpulan entitas yang stateful. Tetapi SRP berarti Anda tidak ingin menggabungkan manajemen pengguna (fungsionalitas dan logika bisnis) dengan data pengguna (status). Tidak mengatakan Anda salah, hanya saja UserManager sesuai jika kelas bertanggung jawab untuk mengelola pengguna dan tidak hanya menyimpan status dan CRUD dasar mereka.
Richard Moore
5

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 SuchAndSuchManagerharus benar-benar dipecah menjadi beberapa kelas, dan kemudian nama kelas yang sudah usang itu menjadi bukan masalah. .

AaronLS
sumber
3

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.

Lazarus
sumber
1
Namun, sebuah konvensi yang konsisten jika sedikit tidak intuitif lebih baik daripada hanya memulai konvensi Anda sendiri. Orang-orang yang mengerjakan suatu proyek akan mempelajari konvensi yang konsisten dengan sangat cepat dan segera lupa bahwa fungsinya tidak seperti yang diharapkan pada pandangan pertama.
Mr. Boy
@ John, itulah yang saya katakan. Konvensi perlu diterima oleh grup dan jika Anda bekerja di perusahaan, lihat apakah ada konvensi perusahaan. Untuk perusahaan saya sedang memikirkan kelompok mana pun, baik itu tim proyek sumber terbuka atau kumpulan programmer yang longgar. Jika semua orang hanya mengambil apa yang tersedia yang hampir sesuai dengan kebutuhan mereka, maka saya pikir kita akan sangat kurang dalam inovasi.
Lazarus
2

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!

Caroline
sumber
Saya telah mengomentari itu pada jawaban Brian Agnew. Saya tidak merasa nama-nama pola membuat nama kelas yang baik hanya dalam beberapa kasus (Pabrik, Strategi) tetapi tidak dalam kasus lain (Singleton). Saya ingin nama-nama untuk mencerminkan pekerjaan kelas bukan cara saya mengimplementasikannya.
froh42