Saat menggunakan bahasa yang mendukung argumen bernama dan opsional, apakah pola pembangun tidak lagi memiliki penggunaan praktis?
Pembangun:
new Builder(requiredA, requiredB).setOptionalA("optional").Build();
Argumen opsional / bernama:
new Object(requiredA, requiredB, optionalA: "optional");
design-patterns
builder-pattern
Paul Nikonowicz
sumber
sumber
Jawaban:
Pembangun paling berguna ketika objek Anda membutuhkan banyak argumen / dependensi untuk menjadi berguna, atau Anda ingin mengizinkan berbagai cara membangun objek.
Dari atas kepala saya, saya bisa membayangkan seseorang mungkin ingin "membangun" objek dalam game 3D seperti ini:
Saya berpendapat contoh ini lebih mudah dibaca dengan metode builder yang saya buat sekarang dibandingkan dengan parameter opsional:
Secara khusus, informasi yang tersirat oleh nama metode pembangun harus diganti dengan lebih banyak parameter, dan jauh lebih mudah untuk melupakan satu parameter dalam kelompok parameter yang terkait erat. Sebenarnya, shader fragmen hilang, tetapi Anda tidak akan menyadarinya kecuali Anda tahu untuk mencarinya.
Tentu saja, jika objek Anda hanya membutuhkan satu hingga lima argumen untuk dikonstruksikan, tidak perlu melibatkan pola pembangun, terlepas apakah Anda telah menamai atau parameter opsional.
sumber
Selain apa yang dikatakan Ixrec, konstruktor atau metode bernama parameter tidak akan memungkinkan Anda untuk memiliki objek Anda dalam kondisi yang akan dibangun di mana ia masih dapat dimodifikasi sebelum membangunnya. Ini adalah keindahan dari Builder, di mana Anda dapat mendelegasikan bagian dari konstruksinya ke metode atau kelas yang berbeda:
Pada dasarnya, Anda juga dapat melemparkan pembangun Anda di sekitar sistem Anda sampai siap untuk membangun objek akhir, memungkinkan Anda untuk mengurangi jumlah pengetahuan yang perlu dimiliki oleh pembangun-konsumen Anda.
sumber
Itu tergantung pada apa yang Anda lakukan dengan pembangun.
Jika Anda menggunakan builder hanya untuk mengatur (dan memvariasikan) properti objek dan (menunda) pembuatan objek, itu bisa diganti dengan param bernama.
Mengganti pembangun Anda mungkin memiliki tradeoff keterbacaan / penggunaan yang @decrec mentoned (atau mungkin tidak memilikinya, itu tergantung pada apa yang Anda lakukan dengan pembangun).
Namun, jika pembuat Anda tidak hanya memegang properti dan setiap langkah konstruksi melibatkan logika, itu tidak dapat diganti.
MockBuilder adalah contoh di mana ia tidak bisa diganti dengan param bernama. Dari halaman:
sumber
Pola pembangun sangat penting ketika bekerja dengan benda yang tidak dapat diubah. Ada banyak manfaat bekerja dengan objek yang tidak dapat diubah, terutama dalam membuat program Anda menjadi lebih kuat dieksekusi di lingkungan bersamaan (yaitu, utas)
sumber
new Integer(42)
,new BigDecimal("42.000")
dannew String("foobar")
semua konstruktor untuk immutables yang ... baik, pembangun akan sia-sia kompleks untuk hal ini. Jadi pembangun tidak penting untuk bekerja dengan kekal ketika konstruktor dapat bekerja dengan baik.