Apakah pernah merupakan ide yang baik untuk menggunakan nama pola desain di kelas implementasi? [Tutup]

28

Baru-baru ini saya datang di basis kode python cukup besar dengan banyak MyClassAbstractFactory, MyClassManager, MyClassProxy, MyClassAdapterdll kelas.

Sementara di satu sisi nama-nama menunjuk saya untuk penelitian dan mempelajari pola yang sesuai, mereka tidak sangat deskriptif apa kelas tidak .

Juga, mereka tampaknya jatuh dalam daftar terlarang kata dalam pemrograman: variable, process_available_information, data, amount, compute: nama terlalu luas, yang tidak menceritakan apa-apa tentang fungsi bila digunakan sendiri .

Jadi haruskah ada CommunicationManageratau lebih tepatnya PortListener? Atau mungkin saya tidak mengerti masalahnya sama sekali ...?

Vorac
sumber
jika Anda terbiasa dengan apa yang dilakukan pola maka nama pola adalah deskripsi yang layak, namun hanya nama pola adalah ide yang buruk, lebih baik memiliki MyClassFactory, FooAdapter, dll.
ratchet freak
Mengedit pertanyaan untuk menunjukkan bahwa kelas tidak hanya disebut "AbstractFactory", tetapi beberapa kata deskriptif juga ada di sana.
Vorac
1
... apakah mereka serius menyebutnya Fctorybukan Factory, atau itu hanya salah ketik?
Izkata
@Izkata, lol, salahku. Namun, ada Adaptor dan Adaptor!
Vorac

Jawaban:

47
  • AbstractFactorymemang pilihan yang buruk untuk sebuah nama. Tidak ada cara untuk mengetahui apa yang dibuat oleh pabrik ini , dan ketika Anda akan mencari entitas yang membuat Animals, Anda tidak akan pernah menemukan pabrik yang sesuai dengan namanya.

  • AnimalAbstractFactoryjuga bukan pilihan yang bijak, karena di sebagian besar bahasa, itu akan berlebihan dengan abstractkata kunci dalam tanda tangan.

    Makhluk ini mengatakan, ada beberapa alasan bagus, disorot oleh komentar, untuk benar-benar dimasukkan Abstractdalam nama: tidak hanya ada beberapa konteks di mana Anda tidak memiliki tanda tangan lengkap, tetapi hanya nama, tetapi juga, menjaga AnimalFactoryantarmuka mungkin merupakan pilihan bijak (kecuali, sayangnya, konvensi bahasa / kerangka adalah untuk awalan antarmuka dengan I).

  • AnimalCreationUtilityjuga akan menjadi pilihan yang buruk: jika itu adalah pabrik , buat segalanya lebih mudah bagi orang-orang yang akan membaca kode, dan menyebutnya sebuah pabrik .

  • abstract AnimalFactorytidak apa-apa. Ia tidak memiliki redundansi, dan jelas bahwa itu adalah sebuah abstrak pabrik yang delegasi penciptaan hewan untuk anak-anaknya.

Jadi ya, termasuk nama pola desain adalah ide yang bagus, tetapi seharusnya hanya bagian dari nama, dan tidak boleh berlebihan dengan bagian lain dari tanda tangan.

Arseni Mourzenko
sumber
2
Mengapa ini lebih baik daripada menulis komentar di tempat yang menonjol "Dalam modul ini, kami menerapkan MVC. Alasan: ... Model: ... Tampilan: ... Pengontrol: ... Struktur peta: ... API :. .. "
Vorac
37
@Vacac: Memiliki nama yang jelas selalu lebih baik daripada mengandalkan komentar.
Arseni Mourzenko
2
@Vorac cepat atau lambat seseorang akan menambahkan kelas baru tanpa memperbarui komentar yang menonjol (atau bahkan mengetahui tentang keberadaannya). Meskipun jauh lebih sulit untuk mengabaikan konvensi penamaan yang digunakan secara konsisten di seluruh aplikasi.
Konrad Morawski
2
Saat Anda menelusuri melalui solusi proyek Anda, apakah Anda akan membuka setiap file kelas untuk menemukan apa yang dilakukannya? Tidak. Karena itu, selalu lebih baik memiliki kelas / file nama deskriptif.
matrix
2
Saya dengan senang hati tidak setuju dengan poin kedua: Saya pikir AnimalAbstractFactory adalah pilihan yang baik, karena meskipun berlebihan dalam deklarasi kelas, akan sangat membantu dalam deklarasi kelas anak: LionFactory memperluas AnimalAbstractFactory yang, saya pikir, adalah informasi yang bagus.
Igor
11

Tergantung pada contoh spesifik. Pola Builder hampir selalu dilayani dengan menamai kelas Anda * Builder, sementara Singleton biasanya tidak perlu dinamai demikian.

Jika Anda tidak memasukkan nama pola di nama kelas Anda, dan mungkin bahkan jika Anda melakukannya, Anda biasanya harus memberikan komentar di kelas yang menjelaskan bahwa itu menerapkan pola tertentu.

MikeFHay
sumber
3
Konsistensi sangat penting di sini, karena sekali hanya beberapa pabrik yang dipanggil ...Factory, itu menjadi mental yang cukup untuk menyadari kelas adalah pabrik jika penamaannya melanggar konvensi itu.
Konrad Morawski
10

Inti dari menggunakan nama pola di kelas adalah untuk membuatnya mudah untuk memahami apa yang dikerjakan kelas. Jika Anda menamai kelas AnimalFactory, jelaslah bahwa kelas menciptakan instance Animal. Jika nama kelas Anda menyertakan nama suatu pola dan itu tidak menjelaskan apa yang dilakukannya, Anda telah memilih pola yang salah atau menerapkannya secara tidak benar.

Pavels
sumber
1

Saya pikir itu bisa bekerja dengan sangat baik. Sebagai contoh:

// Command for retrying card entry with CVN.
public class RetryCardEntryWithCVNCommand { ... }

// Query for getting expired accounts
public class GetExpiredAccountsQuery { ... }

// Decorator for logging exception. Implies that it's an additional 
//mechanism for logging exceptions.
public class LogExceptionToDbDecorator { ... }

// Factory for creating account filters
public class AccountFilterFactory { ... }
CodeART
sumber
1
bagaimana ini menjawab pertanyaan yang diajukan? Per bacaan saya, "contoh" Anda hanya menunjukkan duplikasi nama kelas dan komentar kode yang tidak berguna
agas
Komentar adalah untuk membenarkan tujuan masing-masing kelas jika nama kelas tidak jelas bagi sebagian orang. Dengan melihat ini, saya langsung tahu bahwa saya memiliki perintah yang melakukan sesuatu, permintaan yang mengembalikan data, dekorator yang menambahkan perilaku tambahan ke mekanisme pencatatan pengecualian yang ada dan pabrik yang membuat filter akun. Menurut pendapat saya, semakin deskriptif Anda dengan nama kelas Anda, semakin mudah bagi orang lain untuk membaca kode Anda. Jika Anda menggunakan pola desain, maka katakanlah - pada akhirnya tujuan keseluruhan pola desain adalah untuk memudahkan orang lain membaca kode Anda
CodeART