2009-03-26 8 views
6

Ho avuto una lotta geek con qualcuno su ciò che il modello di strategia è davvero e ho bisogno di un esperto per risolvere la questione.Qual è la definizione esatta del modello di progettazione della strategia?

Entrambi concordiamo sul fatto che il modello di strategia consente al budello di una classe (ad es. Il comportamento) di essere scambiato a runtime mantenendo la stessa interfaccia. Tuttavia, la sua tesi è che "Affinché [gli algoritmi] siano una strategia, dovresti ottenere gli stessi risultati". La mia tesi è che lo scambio di un "algoritmo" o di una logica di una classe potrebbe significare che i risultati dell'operazione sovrascritta sono diversi, ma che comunque soddisfa lo scopo, l'intento (e la classificazione) del modello di strategia.

Il suo esempio di codice con i commenti:


Con la vostra definizione, eventuali sottoclassi di una classe sarebbe una strategia. Hanno le stesse definizioni di metodo (firme) e sono quindi intercambiabili.

Interface Strategy 
{ 
    DoArithmatic(int[] a) 
} 

Class A : Strategy 
public int DoArithmatic(int[]a) 
{ 
    int temp = 0; 
    for(int i =0; i< a.length; i++) 
      temp += a[i] 
} 

Class B : Strategy 
public int DoArithmaticB(int[]a) 
{ 
    int temp = 0; 
    for(int i =a.length -1; i>-1; i--) 
      temp += a[i] 
} 

Class C : Strategy 
public int DoArithmatic(int[]a) 
{ 
    int temp = 0; 
    for(int i =0; i< a.length; i++) 
      temp -= a; 
} 

int[] a = { 1,2,3 } 
ClassA.DoArithmatic(a) = 6 
ClassB.DoArithmatic(a) = 6 
ClassC.DoArithmatic(a) = -6//This one is not interchangeable 

Le prime due sono strategie. Perché per qualsiasi input ti daranno la stessa risposta ESATTA. l'ultimo non lo è. Solo perché ti dà un int non lo rende una strategia. Devono "FARE" la stessa cosa.

Non è possibile utilizzare un termine di astrazione "più alto" solo per renderli una strategia.

Questi fanno tutti "MATH", ma non tutti stanno facendo la "stessa" cosa in un modo diverso. Questa è l'essenza di una strategia.

Quindi, chi ha ragione?

risposta

11

Lei signore è corretto e il tuo collega ha bisogno di leggere il GoF.

"Il modello di strategia consente agli algoritmi di variare in modo indipendente dai client che li utilizzano."

Vedi:

http://www.dofactory.com/Patterns/PatternStrategy.aspx

+1

consente agli algoritmi di variare, ma fa variare il loro risultato? vale a dire lascia variare l'implementazione, ma per quanto riguarda l'interfaccia? ecco di cosa si tratta. –

+0

?? la domanda specificava "Siamo entrambi d'accordo sul fatto che il modello di strategia consente che l'intestino di una classe (ad esempio, il comportamento) venga scambiato a runtime mantenendo la stessa interfaccia" –

+0

"variano indipendentemente dai client" ok, ma come fanno variano tra loro (strategia vs. strategia)? Questa è la domanda. – eljenso

4

sostengo la tua opinione. Diverse strategie possono fare cose molto diverse purché possano essere utilizzate nello stesso contesto.

Per esempio, se si desidera visitare ogni nodo in un albero, le strategie valide potrebbero essere:

  • Depths-prima ricerca pre-order
  • DFS post-ordine
  • BFS
  • randomizzati
  • ...

Tutte le strategie avrebbero visitato il nodo s in un ordine diverso, tuttavia l'obiettivo (visitare ogni nodo) sarebbe lo stesso. Quindi, se l'ordine non ha importanza, entrambe le strategie si adattano alle tue esigenze.

0

Devo anche essere d'accordo. Un buon esempio potrebbe essere una strategia di calcolo dei prezzi. Potresti avere diverse strategie per calcolare l'importo finale di una fattura in base a diverse variabili come la quantità di articoli, il tipo di cliente, la destinazione di spedizione, ecc. Ciascuna di queste strategie sarebbe sicuramente destinata a restituire un risultato diverso e sarebbe comunque considerata un modello di strategia.

2

Secondo "testa Patterns primo Design" (see here) pagina 24

"Il pattern Strategy definisce una famiglia di algoritmi,
incapsula ciascuno, e li rende intercambiabili.
strategia consente l'algoritmo variare indipendentemente da
clienti che lo utilizzano. "

quindi signore, siete corretti, almeno secondo le persone che hanno definito lo schema, ma che cosa sanno.

6

Tecnicamente, le strategie possono fare tutto ciò che vogliono.

È solo quando il "contesto esterno" detta un comportamento fisso e ripetibile che non può essere catturato nell'interfaccia di programmazione (chiamiamoli "proprietà desiderabili"), che è necessario fare in modo che le proprie strategie siano veramente sostituibili alla Liskov rispetto a queste proprietà desiderabili.

2

Sei. Il punto della strategia è sostituire l'algoritmo. Se forniscono lo stesso risultato è un sottoprodotto del comportamento desiderato.

3

Le prime due sono strategie. Per qualsiasi input ti daranno la stessa risposta ESATTA. l'ultimo non lo è. Solo perché ti dà un int non lo rende una strategia. Devono "FARE" la stessa cosa.

Devono fare la stessa cosa, ma ciò non significa che danno lo stesso risultato esatto. L'esempio motivante del GoF è uno dei diversi algoritmi di layout o diversi algoritmi di allocazione del registro. Le strategie hanno lo stesso obiettivo: blocchi di layout di testo e immagini su una pagina o assegnazione di registri virtuali ai registri hardware, ma non devono creare esattamente lo stesso risultato.

Quindi, se l'obiettivo del Strategy nel tuo esempio è quello di fare qualsiasi aritmetica con l'ingresso, poi ogni esempio è una strategia per questo obiettivo. Se l'obiettivo era di sommare la matrice che viene passata, DoArithmatic sarebbe stato chiamato CalculateSum e l'esempio finale non sarebbe conforme al contratto della strategia e quindi violerebbe lo LSP.

2

Penso che sarebbe più corretto dire che la questione se le strategie devono essere deterministicamente identiche è al di fuori della portata della definizione del modello di strategia.

Se una funzione restituisce sempre lo stesso risultato per determinati input, è deterministica. Se due funzioni sono deterministiche e restituiscono sempre lo stesso valore per gli stessi input, sono deterministicamente equivalenti. Possono o non possono avere gli stessi effetti collaterali; se lo fanno allora sono semplicemente equivalenti.

In genere questo non è il caso. Consideriamo un esempio che sembra richiedere un'equivalenza deterministica: l'ordinamento. Si potrebbe pensare che se due implementazioni di comparazione non riescono a restituire lo stesso risultato per gli stessi input, almeno uno di essi deve essere difettoso, ma questo non è necessariamente il caso.

Gli ordini di ordinamento variano da paese a paese. Alcuni posti ordinano l'accento in modo insensibile. Alcuni mettono McDuck con MacDuck e così via.Queste sono strategie, questa è una perfetta applicazione del modello strategico, e le strategie sono sicuramente non deterministicamente equivalenti.

Hai vinto.

Problemi correlati