Penamaan pola apa yang ada? [Tutup]


35

Ada beberapa nama, di mana jika Anda menemukan diri Anda meraih nama-nama itu, Anda tahu Anda telah mengacaukan sesuatu.

Sebagai contoh:

XxxManager
Ini buruk karena kelas harus menjelaskan apa yang dilakukan kelas. Jika kata paling spesifik yang dapat Anda temukan untuk apa yang dikerjakan kelas adalah "kelola," maka kelas itu terlalu besar.

Apa anti-pola penamaan lain yang ada?

Untuk memperjelas, saya tidak bertanya "nama apa yang buruk" - pertanyaan itu sepenuhnya subyektif dan tidak ada cara untuk menjawabnya. Saya bertanya, "nama apa yang menunjukkan masalah desain keseluruhan dengan sistem." Yaitu, jika Anda mendapati diri Anda ingin memanggil komponen Xyz, itu mungkin mengindikasikan komponen tersebut tidak terselesaikan. Perhatikan juga di sini bahwa ada pengecualian untuk setiap aturan - Saya hanya mencari bendera peringatan ketika saya benar-benar harus berhenti dan memikirkan kembali desain.


1
Bagaimana dengan Konvensi Penamaan Smurf ?
back2dos

4
Bagi mereka yang memilih untuk ditutup sebagai "tidak konstruktif" - apakah Anda bersedia menjelaskan alasannya? Satu-satunya hal yang tidak terlalu baik adalah bahwa jawabannya bisa singkat, tetapi tentu saja memenuhi lima pedoman lainnya ...
Billy ONeal


2
@Aaronaught: Ada saran? Saya telah mengartikulasikan hal ini sebaik yang saya bisa di edit ....
Billy ONeal

1
@jhocking - Saya setuju dengan beberapa tautan itu - terutama sedikit tentang "Manajer" dan "Handler" yang terlalu berharga untuk dilepaskan. Dan saya tidak menjual pada desain berbasis pola dan alternatif lain, yang tampaknya paling tidak jelas dalam banyak kasus. Terkadang, "Antrian" atau apa pun yang sesuai, tetapi sering kali fakta bahwa manajer menyimpan (atau referensi) item dalam antrian hanya satu aspek dari mengelola item-item itu. Sama seperti sesuatu yang bermanfaat diungkapkan oleh "manajer" sebagai jabatan, IMO juga berlaku di OOP.
Steve314

Jawaban:


22

Penamaan anti-pola berikut ini terkait dengan .NET dan, terutama, C #:

  • Inkonsistensi . Jika Anda memutuskan untuk memulai setiap nama bidang dengan garis bawah utama, patuhi itu .
  • Singkatan Ambiguos dengan vokal yang hilang . Saya serius melihat nama bidang seperti cxtCtrlMngr. Anda tidak bisa menebak apa yang seharusnya diperjuangkan.
  • Nama variabel terlalu panjang dan verbose . ILoginAttemptRepositorybaik dan deskriptif - ILoginAttemptRepositoryUsingEntityFrameworkForObjectRelationalMappingdeskriptif, tapi jelas tidak baik.

7
Apakah yang Idimaksudkan di interfacesini implementer,, atau orang pertama tunggal? Karena sebagian besar kelas mengimplementasikan antarmuka, memiliki terlalu banyak kelas / interign yang diawali dengan modal Iadalah sesuatu yang baru, dan menghambat keterbacaan, dan kode berbau sendiri.
pengguna tidak diketahui

3
+1 untuk "Singkatan Ambiguos dengan vokal yang hilang" itu membuatku gila!
FrustratedWithFormsDesigner

6
@Billy ONeal: C ++ memiliki antarmuka; mereka tidak dipisahkan secara artifisial dari kelas. ;)
Jon Purdy

4
@ Billy ONeal: Itulah maksud saya.
Jon Purdy

2
@MariusSchulz: oh yeah, saya setuju dengan Anda :) Saya pikir itu bukan singkatan yang sangat buram.
amara

9

Salah satu yang sering saya temui adalah, tidak menggunakan pola penamaan sama sekali. Biasanya menunjukkan ketidaktahuan pengembang (bahwa pola penamaan adalah hal yang baik ) dan juga anti-pola ini cenderung sangat melanggar SRP dengan memasukkan semua jenis metode yang agak / agak terkait dengan kelas ke kelas itu sendiri, jadi misalnya Pelanggan kelas memiliki properti, metode CRUD, apa pun yang terkait dengan Pelanggan yang dibutuhkan sebagian dari aplikasi.

Saya juga akan menambahkan bahwa menggunakan "Engine" sebagai suffix hampir sama dengan menggunakan "Manager". Ini sangat samar dan kelas yang dipanggil XxxEnginecenderung seperti Modul VB-style yang berisi banyak metode sehingga berada dalam satu tempat "mudah digunakan", tanpa pengetahuan atau gagasan pemrograman berorientasi objek.


7

Nah, jawaban sederhana pertama: ketik hungarian ( http://mindprod.com/jgloss/unmainnaming.html , juga memiliki beberapa ide hebat lainnya. Pandangan yang lebih seimbang tentang kapan hungaria tidak jahat, http://www.joelonsoftware.com /articles/Wrong.html )


7
Notasi Hongaria SELALU jahat :)
Wayne Molina

12
@Wayne: Sebenarnya, itu tidak selalu jahat. Saya bekerja untuk Charles di Xerox pada akhir 70-an dan sistem penamaan aslinya adalah penyelamat. Kami bekerja di BCPL yang memiliki 1 tipe: integer. Segala sesuatu tentang tipe disampaikan dengan menggunakan dan penamaan konvensi. Kami memiliki 7 programmer + Charles dan salah satu dari kami dapat masuk ke kode orang lain dan segera menjadi produktif. Ini bukan untuk mengatakan bahwa itu tidak dapat dipelintir / salah diterapkan (bahkan oleh Charles), hanya saja dalam konteks yang tepat itu adalah solusi yang tepat.
Peter Rowell

3
@Marius: Baca artikel Joel. Sistem tipe tidak selalu dapat memaksakan semua perbedaan semantik antar variabel. Intellisense juga tidak membantu dalam kasus seperti itu.
Billy ONeal

4
Jenis lebih mudah disimpulkan daripada digunakan, esp. dengan editor modern. Namun, itu membutuhkan disiplin. Anda tidak harus mengawali semuanya . Saya bekerja di Jawa, dan sebagian besar aplikasi waktu Hungaria tidak diperlukan, tetapi ketika saya melakukan sesuatu yang memerlukan beberapa jenis variabel yang sama (seperti fromX dan toX) dalam sistem koordinat itu adalah penyelamat.
Michael K

3
Yang menyenangkan adalah kemampuan umum untuk membuat tipe baru dengan mudah. "Yang ini seperti int, kecuali itu berlaku untuk nomor baris."
David Thornley

6

Awalan 'I' ke nama antarmuka, atau 'Abstrak' ke nama kelas abstrak. Ini bisa dimaafkan dalam bahasa yang tidak memiliki konsep kelas abstrak, atau yang tidak membedakan antara antarmuka dan kelas abstrak - tetapi di Jawa, misalnya, itu selalu merupakan ide yang buruk.

Juga, saya tidak setuju dengan Anda tentang hal Manajer. Saya menggunakan pola itu kadang-kadang, dan itu hanya berarti bahwa jika saya mencoba untuk menamainya sesuatu yang lain, maka namanya tidak akan lebih deskriptif daripada XxxxxManager. Ada beberapa tugas (tidak harus yang rumit) yang tidak dapat diringkas dengan rapi dalam satu atau dua kata.


@ Mike: Saya sepenuhnya tidak setuju dengan pernyataan Anda, maaf. Menurut pendapat saya, XxxxManageradalah nama terburuk yang mungkin dimiliki sebuah kelas. Tentu saja itu mengelola sesuatu! Itulah alasan mengapa ini ditulis. Manageradalah kata pengisi yang tidak berarti yang tidak menambah nilai pada pemahaman - dengan namanya - apa yang bertanggung jawab atas kelas.
Marius Schulz

1
Bagaimana dengan, katakanlah TabManager,? Punya nama yang lebih baik untuk kelas yang mengontrol mekanisme tab JSP? Atau terkesiap TabController ... Sejauh awalan dengan Abstract, saya merasa itu terlalu sering digunakan tetapi sering berlaku (lihat perpustakaan Java untuk contoh). Saya rasa saya bisa mengatakan dengan aman bahwa saya belum pernah melihat Iantarmuka di tempat di mana seseorang tidak mencoba memprogram terhadap antarmuka yang seharusnya tidak ada. Seperti, hanya satu kelas yang mengimplementasikan antarmuka.
Michael K

1
@Darien (Dan lainnya): Either way - tidak masalah. Tak satu pun dari nama-nama itu yang anti-pola (dan karena itu tidak termasuk topik untuk pertanyaan ini) Saya tidak berpikir Anda dapat mengatakan apa-apa tentang desain sistem dari apakah mereka menggunakan IXxxatau tidak XxxImpl.
Billy ONeal

2
Ini benar-benar salah sama sekali. Ada sangat alasan yang baik untuk visual membedakan interface dari kelas: (a) mereka tidak dapat dipakai, (b) mereka tidak dapat dibebaskan / dibuang, (c) mereka tidak dapat serial, (d) mereka dapat menjadi proksi / dicegat, dll, dll, dll Anda baru saja dibuang sesuatu yang Anda secara pribadi tidak suka (untuk beberapa alasan aneh dan tidak dapat dijelaskan) sebagai contoh dari anti-pola tanpa apapun pembenaran sama sekali.
Aaronaught

1
Jika memungkinkan, antarmuka harus lebih disukai daripada kelas konkret untuk tipe argumen dan tipe kembali. Oleh karena itu, masuk akal untuk antarmuka untuk mendapatkan nama "bersih", dan implementasi konkret (jenis yang sebenarnya penelepon bahkan mungkin tidak tahu atau peduli) untuk mendapatkan kutil.
Kevin Krumwiede

6

Mengupas:

Saya memiliki ketidakmampuan bersandar dan tidak bisa mengeja. Tanpa pemeriksa ejaan, saya tidak berdaya. Saya mencoba menyalin semua nama yang saya buat ke pengolah kata untuk verifikasi, tetapi saya selalu kehilangan beberapa. Pada proyek terakhir saya, saya menulis sebagian besar api dan saya kira saya tidak mengeja memeriksa saat pertama kali saya menggunakan kata respons dan saya menganggap itu benar karena tidak ada yang memberi tahu saya. Kami memiliki setidaknya 50 fungsi dengan respons di dalamnya. Seseorang yang baru datang di tim dan bertanya mengapa kami menggunakan respons saya merasa sangat bodoh.


2
Saya menggunakan plugin jQuery secara singkat di mana salah satu parameternya affect(bukan efek). Itu membuatku gila dan aku dengan cepat menemukan plugin yang berbeda untuk melakukan hal yang sama.
zzzzBov

4
Masalah terburuk yang saya miliki adalah bahwa, begitu saya melihat nama yang salah eja, itu benar-benar menyakiti kemampuan saya untuk mengingat apa namanya.
David Thornley

1
Semakin buruk ketika hal yang sama dieja secara berbeda di berbagai bagian kode. Seperti ketika Anda memiliki kekuatan bidang Srtength kelas diakses oleh metode getStrenth ().
Eva

5

Yah saya khawatir pendapat saya sedikit kontroversial. Tapi mari kita coba ...

Sejauh yang saya ketahui saya harus setuju dengan Mike Baranczak, nama-nama seperti XxxController, XxxHandler adalah sesuatu yang sangat sering kita gunakan. Bagi kami Pengendali adalah sesuatu seperti titik masuk untuk sesuatu yang "dikemas" misalnya mengelola transaksi, menangani kesalahan yang tidak terduga, memanggil XxxHandler untuk melakukan pekerjaan yang sebenarnya. Saya akan mengatakan XxxManager adalah sinonim untuk controller. Saya pikir ini penting untuk tidak menggunakan Manajer dalam satu kasus dan Pengendali dalam yang lain. Konsisten sangat penting jika Anda bekerja dalam tim.

Akan sangat sulit atau mungkin bahkan tidak mungkin untuk menemukan nama yang lebih baik untuk hal-hal seperti ini. Xxx harus dipilih dengan baik untuk membuat situasi lebih jelas.

Apa yang saya pribadi tidak suka adalah, ketika metode yang disebut get ... atau set ... lebih dari sekadar accessor sederhana. Saya suka det ... untuk menentukan.

Hal lain, yang muncul di benak saya: Menurut paman Bob. "Dan" dalam nama metode adalah tanda melakukan banyak hal. Tetapi hidup tidak selalu hanya hitam dan putih - ada situasi di mana saya pikir itu ok - misalnya. karena masalah kinerja (ketika Anda sudah memiliki data karena untuk memeriksa mengapa tidak memprosesnya) ...

Saya pribadi juga penggemar notasi Hungaria sistem - sebagian besar waktu Anda berurusan dengan kode sumber di IDE ok. Namun seringkali Anda hanya menggunakan editor atau menelusuri repo di browser. Salah satu kelemahannya mungkin dukungan alat karena tipe-awalan ...

Saya pikir yang paling penting adalah beeing consitent - konvensi suboptimal - bagi saya - lebih baik daripada tidak memiliki konvensi ...


1
"Controller" memiliki semantik yang berbeda dari "Manager". Secara pribadi, saya juga tidak suka, tetapi "Controller" bertahan karena merupakan komponen umum dari banyak pola, terutama MVC. XxxHandler sama buruknya. Jika kelas hanya "menangani" sesuatu - maka kelasnya terlalu besar, atau seharusnya hanya disebut bagian "Xxx".
Billy ONeal

3
"Akan sangat sulit atau mungkin bahkan tidak mungkin untuk menemukan nama yang lebih baik untuk hal-hal seperti ini" - tidak jika Anda mendesain hierarki jenis Anda dengan benar, dengan ketergantungan dan tanggung jawab yang jelas. Tentu saja jika Anda menggunakan "Controller" sebagai bagian dari MVC atau "Handler" untuk event / message handler generik maka itu berbeda - itu adalah contoh jargon - tetapi jika mereka hanya digunakan sebagai nama generik untuk ill- kelas yang didefinisikan maka itu adalah bendera merah utama.
Aaronaught

5

Mungkin penamaan anti-pola terburuk adalah ini:

create table stuff(..., foo1 string, bar1 string,
                        foo2 string, bar2 string, 
                        foo3 string, bar3 string, ...)

Kami memiliki daftar tiga elemen dari pasangan [foo, bar]. Jika kita membutuhkan yang keempat, kita harus menambahkan kolom baru ke tabel.

Mengarah ke kode seperti ini:

'SELECT foo' + i + ', bar' + i + ' FROM stuff'

Tabel terpisah harus dibuat dengan kolom foo dan bar dan ditautkan ke tabel barang:

create table fubar(foo string, bar string, stuff_id long)

Yang terburuk kedua adalah ini:

class Student {
  ...
  String homeStreet;
  String homeCity;
  String homeState;
  String permStreet;
  String permCity;    
  String permState;
  ...
}

Di sini kita memiliki enam bidang alih-alih dua contoh kelas Alamat.

Anti-pola ini ditandai dengan serangkaian nama dua bagian yang mencantumkan setiap kombinasi dua set, misalnya [foo, bar] x [1,2,3] atau [home, perm] x [jalan, kota, negara bagian]


-1 - ini tidak menyebutkan penamaan sama sekali.
Billy ONeal

Anti-pola penamaan tidak dapat menyertakan lebih dari satu nama?
kevin cline

Bagaimana terlalu banyak argumen ==penamaan antipattern? Saya bingung.
Billy ONeal

1
Sejauh yang saya mengerti, konvensi ini adalah yang memungkinkan angka di mana nama sebenarnya harus diambil. Angka-angka ini mengarah pada kesan yang salah, bahwa barang-barang itu adalah semacam daftar atau larik
keppla

3
@ Billy ONeal: Ya mereka lakukan. Masalah desain adalah kurangnya normalisasi, dan sufiks angka adalah pola penamaan yang menunjukkannya.
reinierpost

3

Setiap penamaan kelas atau antarmuka yang merupakan tautologi adalah buruk, tidak hanya di Jawa yang dibicarakan tautan, tetapi dalam bahasa apa pun.

Tautologi (retorika), menggunakan kata-kata yang berbeda untuk mengatakan hal yang sama bahkan jika pengulangan tidak memberikan kejelasan.


2
Menarik. Ada contoh?
Mike Baranczak

2
Saya membaca tautannya, tertulis "tautologi" ...;)
Benjol

10
Aturan pertama klub tautologi adalah aturan pertama klub tautologi.
Cercerilla

Saya membaca tautannya (oke, isi tautannya) dan tidak menemukan contoh
barjak

oke jadi menurut tautan itu kita harus berhenti menggunakan I <InterfaceName> ... benar.
Dal

3

Saya sering menemukan pustaka perangkat lunak dengan nama generik seperti Libraryatau Common. Mereka menunjukkan desain suboptimal: pengembang berusaha untuk menghindari duplikasi kode tetapi tanpa upaya untuk membuat desain terurai berdasarkan fungsi.


+1 - Saya melihat "Biasa" sepanjang waktu.
Morgan Herlocker

1

Dari Microsoft saat penamaan, saya dapat memberikan daftar ini untuk nama-nama buruk:

  1. Mereka bukan semantik, yang berarti bahwa mereka memiliki nama yang bukannya menekankan pada apa yang dilakukannya, menekankan pada teknologi yang digunakannya atau pola yang menjadi dasarnya .
  2. Mereka tidak mengikuti konsistensi sintaksis. Sebagai contoh, sebagian nama dikunci unta, sedangkan bagian lain pascal dikunci.
  3. Mereka adalah singkatan, yang sulit dimengerti, seperti ScrollableX bukan CanScrollHorizontally
  4. Mereka dipilih sedemikian rupa sehingga mereka mengacaukan kata kunci dari lingkungan itu.

2
Saya sebenarnya suka "ScrollableX" setidaknya sebanyak "CanScrollHorizontally". "X" sebenarnya bukan singkatan.
user1172763
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.