Il modello di strategia funziona bene per evitare enormi se ... altro costrutti e rendere più facile aggiungere o sostituire funzionalità. Tuttavia, a mio avviso lascia ancora un difetto. Sembra che in ogni implementazione ci sia ancora bisogno di un costrutto ramificato. Potrebbe essere una fabbrica o un file di dati. Ad esempio, prendi un sistema di ordinazione.
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 c'è solo un posto dove aggiungere un nuovo tipo di ordine ora, ma questa sezione di codice non è ancora estendibile. Estraerlo in un file di dati aiuta in qualche modo 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 codice boilerplate per elaborare il file di dati - concesso, più facilmente testabile dall'unità e codice relativamente stabile, ma comunque ulteriore complessità.
Inoltre, questo tipo di costrutto non verifica bene l'integrazione. Ogni singola strategia può essere più facile da testare ora, ma ogni nuova strategia che aggiungi è una complessità aggiuntiva da testare. È meno di quello che avresti se non avessi usato il modello, ma è ancora lì.
C'è un modo per attuare il modello strategico che mitiga questa complessità? O è semplicemente così semplice, e provare ad andare oltre aggiungerebbe un altro livello di astrazione per poco o nessun beneficio?
eval
... potrebbe non funzionare in Java ma forse in altre lingue?