Berapa batasan jumlah metode kelas?


22

Dalam buku desain berbeda yang saya baca, terkadang penekanan besar diberikan pada sejumlah metode yang harus dimiliki suatu kelas (mempertimbangkan bahasa OO, sebagai java atau C # misalnya). Seringkali contoh-contoh yang dilaporkan dalam buku-buku itu sangat rapi dan sederhana, tetapi jarang yang mencakup kasus "serius" atau kompleks.
Namun kisarannya berkisar antara 5 dan 8.

Dalam sebuah proyek saya mengembangkan kelas "Note", dengan atributnya sebagai properti: Judul, Desctiption, CreateDate, dll.
Kemudian beberapa metode dasar seperti: getRelations (jika catatan ditugaskan ke dokumen yang berbeda), getExpiryDate, dll.

Namun melanjutkan pengembangan aplikasi, lebih banyak fungsi diperlukan, dan, karena itu, lebih banyak metode.

Saya tahu bahwa semakin sedikit metode yang dimiliki sebuah kelas, semakin longgar pula itu. Itu memang keuntungan yang baik dalam hal modularitas dan usabilitas, ditambah lebih mudah untuk diedit.
Ngomong-ngomong jika dalam konteks kita tidak perlu (atau bahkan akal) untuk membuat sub-kelas dan semua fungsi yang diperlukan terkait dengan kelas itu, berapa banyak metode yang bisa kita lampirkan lebih lanjut?

Saya setuju bahwa memiliki lebih dari 15 metode, maka mungkin sedikit desain ulang mungkin diperlukan.
Tetapi bahkan dalam kasus itu, jika menghapus beberapa metode atau warisan bukanlah suatu pilihan, mana yang akan menjadi cara yang tepat?


3
Manusia tampaknya memiliki rentang lupa bawaan. Setelah Anda melewati tujuh opsi, beberapa awal mulai dilupakan. Jadi jangan beri orang lebih dari 7 opsi per antarmuka.
Martin York

+ 1 @ Martin- 7 + atau- 2
Morgan Herlocker

Batasan ini hanya untuk memori jangka pendek. Kalau tidak, bagaimana mungkin kita bisa mengingat semua huruf dan kata yang berbeda itu? Serius, jika kelas akan digunakan dengan berat, Anda dapat menganggapnya sebagai bahasa mini, dan memiliki banyak metode yang Anda butuhkan untuk mengekspresikan apa pun yang harus Anda lakukan dengannya.
artem


Jawaban:


30

Miliki metode sebanyak yang Anda butuhkan. Saya akan mencoba untuk menekan jumlah metode publik untuk aturan 5-8 jika memungkinkan. Sejujurnya, kebanyakan orang memiliki masalah yang berlawanan di mana mereka memiliki metode super gila yang perlu dipecahkan lebih banyak, bukan lebih sedikit. Tidak masalah berapa banyak metode pembantu pribadi yang Anda miliki. Bahkan, jika Anda tinggal di bawah 8 metode di Jawa Anda bisa mencapai batas dengan kelas yang hanya memiliki konstruktor, toString, dan pengambil / penyetel untuk 3 properti ... yang bukan kelas yang benar-benar kuat. Intinya adalah, jangan khawatir tentang berapa banyak metode kelas Anda. Khawatir memastikan kelas Anda tidak menghadapi masalah yang tidak terkait, dan bahwa Anda memiliki antarmuka publik yang masuk akal yang memiliki metode yang mudah dipahami.


Benar, tetapi jika itu adalah kelas utilitas, hingga 10-15 baik-baik saja.
Sid

1
@SidCool - Saya tidak mengatakan saya tidak pernah menggunakannya, tetapi kelas utilitas sebenarnya bukan praktik terbaik. Mereka biasanya hanya kelas dewa mini yang menyatukan banyak masalah yang tidak terkait. Dengan mengingat hal itu, kelas utilitas seharusnya tidak ada sama sekali, apalagi dengan 15 metode.
Morgan Herlocker

1
Kelas saya "Catatan" bukan kelas utilitas. Ini mewakili objek bisnis (catatan yang dapat menambahkan komentar dan deskripsi ke dokumen). Namun saya setuju dengan ironcode tentang bahaya kelas "utilitas". Mereka datang membantu ketika kita sedang terburu-buru dengan tenggat waktu pengiriman kami, tetapi saya pikir seringkali ada solusi / desain yang lebih baik untuk mereka.
Francesco

13

Jawabannya sangat sederhana: Letakkan segala sesuatu di kelas yang menjadi tanggung jawabnya, tapi hati-hati saat menetapkan tanggung jawab.

Terkadang kelas besar adalah gabungan dari kelas yang lebih kecil dengan tanggung jawab yang berbeda.

Secara umum, saya mencoba untuk membagi tanggung jawab ke dalam kelas yang lebih kecil ketika kelas menjadi sulit digunakan atau dalam pemeliharaan. Saya jarang memiliki kelas yang lebih dari 500 baris. Kelas terbesar saya memiliki sekitar 1.5k locs.

Anda tidak bisa menyatakan aturan umum seperti "kelas harus memiliki antara metode n dan m".


8

Tidak ada alasan (dalam desain OO) untuk hanya memiliki begitu banyak metode. Juga tidak benar bahwa kelas dengan metode yang lebih sedikit dipisahkan lebih baik.

Lihatlah kelas java.lang.String, misalnya. Banyak metode, karena ada begitu banyak hal yang dapat dilakukan dengan sebuah string. Meskipun demikian tidak digabungkan dengan kuat.

Saya bertanya-tanya mengapa angka ajaib seperti 15 dapat memisahkan desain yang baik dan yang buruk. Tidak, itu tidak mudah.


Saya setuju, jumlah 15 hanyalah perkiraan yang berasal dari membaca buku-buku desain (sebagai "Kode Lengkap" oleh Steven McConnell, sebagai contoh). Memang kelas String memiliki miriad metode dan semua realted ke entitas yang sama.
Francesco

@Luca: Masalah dengan beberapa buku itu adalah bahwa contoh-contohnya sering dibuat-buat dan karena itu lebih kecil daripada banyak contoh di dunia nyata.
FrustratedWithFormsDesigner

Tepat ... mungkin untuk membuat konsep lebih jelas untuk sebagian besar dan untuk memperbesar basis potensial pembeli juga ...
Francesco

Saya ingin melihat segala jenis DataGrid atau bahkan kontrol UI dengan hanya 15 metode. Jika Anda memecah kelas-kelas itu menjadi yang lebih kecil maka antarmuka akan menjadi mimpi buruk.
Falcon

6

Dalam PMD, perilaku default aturan TooManyMethods adalah untuk mengidentifikasi dan menandai kelas dengan 10 metode atau lebih sebagai potensi kesalahan. Ini hanya angka acak. Mudah diubah dalam konfigurasi. Terlepas dari apa nomor ini, itu hanya bendera bagi pengembang untuk melihat kelas dan melihat apakah ada masalah, bukan berarti ada masalah dengan itu.

Sesuatu yang sedikit lebih konkret mungkin adalah aturan 7 plus / minus 2 . Ini menyatakan bahwa pikiran manusia dapat memegang dan memahami antara 5 dan 9 "objek" dalam memori. Saat membaca kelas tertentu, objek kemungkinan besar adalah metode dan bidang yang membentuk kelas itu. Namun, kelas sering memiliki lebih dari 9 bidang dan metode, bahkan jika Anda tidak menghitung accesor, mutator dan setiap operasi standar (misalnya, toString(), hashCode(), dan equals()di Jawa).

Langkah-langkah yang paling relevan adalah fan-in dan fan-out dan diskusi tentang coupling dan kohesi . The prinsip tanggung jawab tunggal dan pemisahan keprihatinan harus diterapkan - kelas harus melakukan atau mewakili satu hal dan satu hal saja. Ini jauh lebih baik daripada mencoba menetapkan angka ke metode maksimum / minimum ketika menilai suatu desain atau implementasi.


+1 - aturan 7 + -2 adalah aturan untuk dihuni di mana kegunaan terkait.
Morgan Herlocker
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.