Qual è il nome di questo pattern che coinvolge più input e cosa fare in base a un input?

1

Se ho codice simile a questo (anche se forse non è limitato come livelli di avviso):

switch(item.StatusCode)
{
    case StatusCode.SUCCESS:
        CallSuccess(item);
        break;
    case StatusCode.WARNING:
        CallWarning(item);
        break;
    case StatusCode.ERROR:
        CallError(item);
        break;
}

Spesso mi ritrovo a convertirlo in qualcosa di più simile a

var behaviors = new Dictionary<StatusCode, Action<Item>>
{
    {StatusCode.SUCCESS, (item) => CallSuccess(item)},
    {StatusCode.WARNING, (item) => CallWarning(item)},
    {StatusCode.ERROR,   (item) => CallError(item)},
}

behaviors[item.StatusCode](item);

Trovo che in molti casi questo rende il codice più gestibile. È un modello, in realtà aiuta come penso che faccia, e come si chiama?

    
posta Bryan Boettcher 26.07.2012 - 18:06
fonte

2 risposte

1

Schema di strategia e amp; Apri principio chiuso

Sembra che Open Closed Principle risolva problemi di routine descritti. Questa è una parte di S.O.L.I.D. i principi. Una delle sue applicazioni è in modello di strategia , citato anche in (GoF).

Questo principio di solito funziona quando viene scritta una base di codice esistente, ma è più facile scrivere tutto il nuovo codice piuttosto che cambiare il vecchio codice.

Wouldn'tyoulikeextendinganexistingcodebasetobeasproductiveandfrustration-freeaswritingallnewcode?-QuièdoveentraingiocoOpenClosedPrinciple.Perparafrasare,ilprincipioOpenClosedèdichiaratocome:leentitàsoftwaredovrebberoessereaperteperestensionemachiuseperlamodifica.

Qualisonoivantaggichefornisce?

  • Ilcodiceèpiùfaciledaleggere.Nonhobisognodiandarealeggere(oricerca)un'istruzioneswitch"infinita" per comprendere ogni aspetto del codice.
  • Il codice è più gestibile . Devo solo andare alla classe rilevante che implementa la logica per cambiarla o rifattarla quando necessario.
  • È più facile aggiungere più logica. Ho solo bisogno di aggiungere più lezioni alla pila di logica esistente e basta. Questo ci aiuta a sottintendere il Principio Aperto / Chiuso perché nelle istruzioni if / switch stiamo andando avanti dover cambiare il nostro codice (aggiungere un'altra dichiarazione del caso) in opposto alla strategia che non modifica la logica esistente.
  • Il modello di strategia è più testabile . Il test delle unità può essere fatto facilmente.

Alcuni riferimenti:

risposta data 26.07.2012 - 18:23
fonte
3

Credo che questo sia solitamente considerato un'applicazione del Pattern di strategia .

L'intero punto di questo è codice più gestibile - tra le altre cose, rende banale aggiungere nuovi comportamenti in fase di esecuzione (per non parlare del tempo di compilazione). C'è (di solito) una certa perdita in termini di prestazioni, ma questo tende a essere compensato dall'aumento della manutenibilità.

    
risposta data 26.07.2012 - 18:20
fonte

Leggi altre domande sui tag