Kami memiliki cukup banyak tempat dalam kode sumber aplikasi kami, di mana satu kelas memiliki banyak metode dengan nama dan parameter yang berbeda. Metode-metode itu selalu memiliki semua parameter metode 'sebelumnya' plus satu lagi.
Ini adalah hasil dari evolusi yang panjang (kode warisan) dan pemikiran ini (saya percaya):
" Ada metode M yang melakukan hal A. Saya perlu melakukan A + B. OK, saya tahu ... Saya akan menambahkan parameter baru ke M, buat metode baru untuk itu, pindahkan kode dari M ke metode baru dengan satu parameter lagi, lakukan A + B di sana dan panggil metode baru dari M dengan nilai default dari parameter baru. "
Berikut ini sebuah contoh (dalam bahasa mirip Java):
class DocumentHome {
(...)
public Document createDocument(String name) {
// just calls another method with default value of its parameter
return createDocument(name, -1);
}
public Document createDocument(String name, int minPagesCount) {
// just calls another method with default value of its parameter
return createDocument(name, minPagesCount, false);
}
public Document createDocument(String name, int minPagesCount, boolean firstPageBlank) {
// just calls another method with default value of its parameter
return createDocument(name, minPagesCount, false, "");
}
public Document createDocument(String name, int minPagesCount, boolean firstPageBlank, String title) {
// here the real work gets done
(...)
}
(...)
}
Saya merasa ini salah. Tidak hanya itu kami tidak dapat terus menambahkan parameter baru seperti ini selamanya, tetapi kode sulit diperluas / diubah karena semua dependensi antara metode.
Berikut adalah beberapa cara untuk melakukan ini dengan lebih baik:
Memperkenalkan objek parameter:
class DocumentCreationParams { String name; int minPagesCount; boolean firstPageBlank; String title; (...) } class DokumentHome { public Document createDocument(DocumentCreationParams p) { // here the real work gets done (...) } }
Atur parameter ke
DocumentHome
objek sebelum kita memanggilcreateDocument()
@In DocumentHome dh = null; (...) dh.setName(...); dh.setMinPagesCount(...); dh.setFirstPageBlank(...); Document newDocument = dh.createDocument();
Pisahkan pekerjaan menjadi berbagai metode dan panggil mereka sesuai kebutuhan:
@In DocumentHome dh = null; Document newDocument = dh.createDocument(); dh.changeName(newDocument, "name"); dh.addFirstBlankPage(newDocument); dh.changeMinPagesCount(new Document, 10);
Pertanyaan saya:
- Apakah masalah yang dijelaskan benar-benar masalah?
- Apa pendapat Anda tentang solusi yang disarankan? Yang mana yang Anda pilih (berdasarkan pengalaman Anda)?
- Bisakah Anda memikirkan solusi lain?