Ini dimotivasi oleh jawaban ini untuk pertanyaan yang terpisah .
The pola pembangun digunakan untuk menyederhanakan inisialisasi yang kompleks, terutama dengan parameter inisialisasi opsional). Tapi saya tidak tahu bagaimana mengelola dengan benar konfigurasi yang saling eksklusif.
Ini Image
kelasnya. Image
dapat diinisialisasi dari file atau dari ukuran, tetapi tidak keduanya . Menggunakan konstruktor untuk menegakkan pengecualian bersama ini jelas ketika kelas cukup sederhana:
public class Image
{
public Image(Size size, Thing stuff, int range)
{
// ... initialize empty with size
}
public Image(string filename, Thing stuff, int range)
{
// ... initialize from file
}
}
Sekarang anggaplah Image
sebenarnya cukup dapat dikonfigurasi untuk pola builder menjadi berguna, tiba-tiba ini mungkin:
Image image = new ImageBuilder()
.setStuff(stuff)
.setRange(range)
.setSize(size) // <---------- NOT
.setFilename(filename) // <---------- COMPATIBLE
.build();
Masalah-masalah ini harus ditangkap pada saat dijalankan daripada pada waktu kompilasi, yang bukan hal terburuk. Masalahnya adalah bahwa secara konsisten dan komprehensif mendeteksi masalah ini di dalamImageBuilder
kelas bisa menjadi kompleks, terutama dalam hal pemeliharaan.
Bagaimana saya harus menangani konfigurasi yang tidak kompatibel dalam pola builder?
Range
danStuff
harus diinisialisasi pada awalnya, bukan pada waktu yang sewenang-wenang.RangeAndStuffBuilder
) dapat dipanggil pada tipe aktual. Pembatasan lebih lanjut dapat diimplementasikan dengan mengembalikan lebih banyak tipe dasar untuk beberapa metode (meskipun ini akan menyebabkan peningkatan tipe yang eksponensial), yang secara efektif menghilangkan operasi. Selama hasil metode tidak kembali ke hierarki, Anda tidak akan mendapatkan kesalahan ketik. ThesetHeight
/setWidth
Skenario dapat diterapkan dengan hirarki saudara yang tidak memilikibuild
metode.