Questo è motivato da questa risposta a una domanda separata .
Il modello di build viene utilizzato per semplificare l'inizializzazione complessa, in particolare con i parametri di inizializzazione facoltativi). Ma non so come gestire correttamente le configurazioni reciprocamente esclusive.
Ecco una classe Image
. Image
può essere inizializzato da un file o da una dimensione, ma non entrambi . Usare i costruttori per rafforzare questa mutua esclusione è ovvio quando la classe è abbastanza semplice:
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
}
}
Ora supponiamo che Image
sia effettivamente configurabile in modo che il pattern del builder sia utile, improvvisamente questo potrebbe essere possibile:
Image image = new ImageBuilder()
.setStuff(stuff)
.setRange(range)
.setSize(size) // <---------- NOT
.setFilename(filename) // <---------- COMPATIBLE
.build();
Questi problemi devono essere rilevati in fase di esecuzione piuttosto che in fase di compilazione, il che non è la cosa peggiore. Il problema è che il rilevamento coerente e completo di questi problemi all'interno della classe ImageBuilder
potrebbe diventare complesso, soprattutto in termini di manutenzione.
Come devo gestire configurazioni incompatibili nel modello di build?