Domanda

Il modello di strategia funziona bene per evitare enormi costrutti se ... altrimenti e semplificare l'aggiunta o la sostituzione della funzionalità. Tuttavia, lascia ancora un difetto secondo me. Sembra che in ogni implementazione ci sia ancora un costrutto di ramificazione. Potrebbe essere una fabbrica o un file di dati. Ad esempio, prendere 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 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 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 caldaia per elaborare il file di dati - concesso più facilmente un unità testimoniabile e un codice relativamente stabile, ma una complessità aggiuntiva, tuttavia.

Inoltre, questo tipo di costrutto non si verifica bene l'integrazione. Ogni singola strategia può essere più facile da testare ora, ma ogni nuova strategia che aggiungi è una complessità di aggiunta da testare. È meno di quanto avresti se tu non lo aveva fatto Usò il modello, ma è ancora lì.

C'è un modo per implementare il modello di strategia che mitiga questa complessità? O è così semplice come si ottiene, e cercare di andare oltre aggiungerebbe solo un altro livello di astrazione per poco o nessun vantaggio?

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top