Il modello di strategia funziona bene per evitare enormi se ... altrimenti costruisce e semplifica l'aggiunta o la sostituzione di funzionalità. Tuttavia, lascia ancora un difetto a mio parere. Sembra che in ogni implementazione debba ancora esserci un costrutto ramificato. Potrebbe essere una fabbrica o un file di dati. Ad esempio prendi un sistema di ordinazione.
di fabbrica:
// All of these classes implement OrderStrategy
switch (orderType) {
case NEW_ORDER: return new NewOrder();
case CANCELLATION: return new Cancellation();
case RETURN: return new Return();
}
Il codice dopo questo non deve preoccuparsi, e ora c'è solo un posto dove aggiungere un nuovo tipo di ordine, ma questa sezione di codice non è ancora estensibile. Tirarlo fuori in un file di dati aiuta un po 'la leggibilità (discutibile, lo so):
<strategies>
<order type="NEW_ORDER">com.company.NewOrder</order>
<order type="CANCELLATION">com.company.Cancellation</order>
<order type="RETURN">com.company.Return</order>
</strategies>
Ma questo aggiunge ancora il codice boilerplate per elaborare il file di dati - concesso, più facilmente unità testabile e codice relativamente stabile, ma comunque complessità aggiuntiva.
Inoltre, questo tipo di costrutto non integra bene i test di integrazione. Ogni singola strategia può essere più semplice da testare ora, ma ogni nuova strategia che aggiungi è una complessità aggiuntiva da testare. È inferiore a quello che avresti se non avessi usato il pattern, ma è ancora lì.
C'è un modo per implementare il modello di strategia che attenua questa complessità? O è così semplice come si ottiene, e cercando di andare oltre aggiungerebbe solo un altro livello di astrazione per poco o nessun vantaggio?