Kapan kelas lem atau manajemen melakukan terlalu banyak?

10

Saya cenderung membangun kelas terpusat yang mengelola kelas lain dalam desain saya. Itu tidak menyimpan semuanya sendiri, tetapi sebagian besar permintaan data akan pergi ke "manajer" terlebih dahulu. Sambil melihat jawaban untuk pertanyaan ini, saya memperhatikan istilah "Obyek Tuhan". Wikipedia mencantumkannya sebagai antipattern, dimengerti.

Di mana garis antara kelas lem yang sah, atau modul, yang meneruskan data dan pesan dari satu tempat ke tempat lain, dan kelas yang melakukan terlalu banyak?

jprete
sumber

Jawaban:

15

Banyak orang mengatakan hal-hal seperti "kelas tidak boleh lebih besar dari kepala Anda".

Namun, saya baru saja berpartisipasi dalam diskusi dengan beberapa programmer kelas dunia yang sangat hebat mengenai hal ini. Saya sudah membicarakannya dengan salah satu Naked Objects guys. Sejauh yang kami tahu, kadang-kadang, ini terjadi, dan tidak ada banyak cara untuk mengatasinya.

Namun, biasanya, satu kelas di mana hal ini terjadi adalah objek domain yang mewakili elemen mendasar dari domain Anda - Akun untuk perbankan, Penjualan untuk ritel, dll. Jika Anda menemukan hal itu terjadi pada kelas lain juga, Anda mungkin ingin mempertimbangkan tanggung jawab kelas itu. Berikut tips saya:

  • Jika itu disebut "Manajer", "Pembantu" atau "Layanan", kemungkinan itu terlalu besar. Setelah Anda benar-benar mengetahui apa tanggung jawab kelas seharusnya, Anda akan merasa lebih mudah untuk mendelegasikan tanggung jawab lainnya.
  • Jika itu disebut "Controller", itu harus bertanggung jawab untuk mengendalikan interaksi antara sekelompok kelas lain ... dan tidak ada yang lain.
  • Jika itu melewati data dan pesan antara node fisik yang berbeda maka baik itu harus berurusan dengan mengkonversi pesan tertentu ke bentuk serial, atau menangani mekanisme transfer. Misalnya, Anda mungkin memiliki satu kelas yang mengubah Transaksi Bank ke XML, dan kelas lain yang mengirim XML itu melalui HTTP.
  • Jika melewati acara antar modul yang berbeda dalam suatu aplikasi, maka itu harus bertanggung jawab untuk memberi tahu pendengar ketika suatu peristiwa dinaikkan, dan tidak ada yang lain.

Sebagai aturan praktis, jika terlalu besar, lihat apakah Anda dapat mendelegasikan tanggung jawab ke kelas lain, dan jika Anda tidak bisa, itu mungkin baik-baik saja.

Lunivore
sumber
Jawaban yang bagus dengan pedoman konkret yang bermanfaat. Saya cenderung membuat kelas seperti ini untuk objek domain di mana semua, atau hampir semua, data mewakili beberapa aspek dari domain dan saya ingin dapat memperlakukannya sebagai satu unit. Kemudian saya cenderung mendelegasikan tanggung jawab aktual ke kelas-kelas yang hanya benar-benar dipakai di dalam kelas besar. Jadi saya cukup dekat dengan garis, dan saya mungkin harus condong ke arah membuat kelas individu lebih kecil ketika saya menulisnya.
jprete