Di beberapa proyek kami, ada hierarki kelas yang menambahkan lebih banyak parameter saat menuruni rantai. Di bagian bawah, beberapa kelas dapat memiliki hingga 30 parameter, 28 di antaranya baru saja diteruskan ke konstruktor super.
Saya akan mengakui bahwa menggunakan DI otomatis melalui sesuatu seperti Guice akan menyenangkan, tetapi karena beberapa alasan teknis, proyek khusus ini dibatasi untuk Java.
Konvensi pengorganisasian argumen menurut abjad menurut tipe tidak berfungsi karena jika sebuah tipe difaktor ulang (Lingkaran yang Anda berikan untuk argumen 2 sekarang menjadi Bentuk) itu bisa tiba-tiba rusak.
Pertanyaan ini mungkin spesifik dan penuh dengan kritik "Jika itu masalah Anda, Anda salah melakukannya pada tingkat desain", tetapi saya hanya mencari sudut pandang apa pun.
buildStudent()
metode melempar pengecualian.Dapatkah Anda merangkum parameter terkait di dalam suatu objek?
misalnya, jika parameternya seperti
maka Anda dapat memiliki:
sumber
Apa yang mungkin ingin Anda lakukan adalah memiliki kelas Builder. Kemudian Anda akan melakukan sesuatu seperti ini:
Lihat halaman 8 dan setelah presentasi Josh Bloch (PDF) ini, atau ulasan tentang Java Efektif ini
sumber
Nah, menggunakan pola builder mungkin bisa menjadi salah satu solusinya.
Tetapi begitu Anda sampai pada 20 sampai 30 parameter, saya akan menebak bahwa ada hubungan yang tinggi antara parameter tersebut. Jadi (seperti yang disarankan) membungkusnya menjadi objek data yang logis mungkin paling masuk akal. Dengan cara ini objek data sudah dapat memeriksa validitas batasan antara parameter.
Untuk semua proyek saya di masa lalu, begitu saya sampai pada titik memiliki terlalu banyak parameter (dan itu 8 bukan 28!) Saya dapat membersihkan kode dengan membuat model data yang lebih baik.
sumber
Karena Anda dibatasi pada Java 1.4, jika Anda menginginkan DI maka Spring akan menjadi pilihan yang sangat layak. DI hanya membantu di tempat-tempat di mana parameter konstruktor adalah layanan atau sesuatu yang tidak berbeda selama waktu proses.
Jika Anda memiliki semua konstruktor yang berbeda karena Anda menginginkan opsi variabel tentang cara membuat objek, Anda harus mempertimbangkan secara serius untuk menggunakan pola Builder.
sumber
Solusi terbaik adalah tidak memiliki terlalu banyak parameter dalam konstruktor. Hanya parameter yang benar-benar diperlukan dalam konstruktor, adalah parameter yang diperlukan untuk menginisialisasi objek dengan benar. Anda dapat memiliki konstruktor dengan beberapa parameter, tetapi juga memiliki konstruktor dengan hanya parameter minimum. Konstruktor tambahan memanggil konstruktor sederhana ini dan setelah itu penyetel untuk menyetel parameter lainnya. Dengan cara ini Anda dapat menghindari masalah rantai dengan semakin banyak parameter, tetapi juga memiliki beberapa konstruktor kenyamanan.
sumber
Saya benar-benar dapat merekomendasikan menggunakan Immutables atau POJOBuilder saat menggunakan pola pembangun.
sumber
Refactoring untuk mengurangi jumlah parameter dan kedalaman hierarki warisan Anda cukup banyak yang dapat saya pikirkan karena, tidak ada yang benar-benar akan membantu menjaga parameter 20-sesuatu tetap lurus. Anda hanya perlu melakukan setiap panggilan sambil melihat dokumentasi.
Satu hal yang dapat Anda lakukan, adalah mengelompokkan beberapa parameter yang dikelompokkan secara logis ke dalam objek tingkat yang lebih tinggi, tetapi itu memiliki masalahnya sendiri.
sumber