2009-03-26 17 views
6

Tuve una discusión geek con alguien sobre cuál es el patrón de estrategia realmente y necesito un experto para resolver el asunto.¿Cuál es la definición exacta del patrón de diseño de la estrategia?

Ambos estamos de acuerdo en que el patrón de estrategia permite que las agallas de una clase (por ejemplo, el comportamiento) se intercambien en el tiempo de ejecución mientras se mantiene la misma interfaz. Sin embargo, su argumento es que "para que [los algoritmos] sean una estrategia, tendrías que obtener los mismos resultados". Mi opinión es que intercambiar un "algoritmo" o lógica de una clase podría significar que los resultados de la operación anulada son diferentes, pero que aún cumple con el propósito, intención (y clasificación) del patrón de estrategia.

Su ejemplo de código con comentarios:


Por su definición, cualquier subclase de una clase sería una estrategia. Tienen las mismas definiciones de método (firmas) y, por lo tanto, son intercambiables.

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 

Las dos primeras son estrategias. Porque para cualquier aporte, le darán la misma respuesta EXACTA. el último no es El hecho de que te dé un int no lo convierte en una estrategia. Tienen que "HACER" lo mismo.

No se puede utilizar un término de abstracción "superior" solo para convertirlos en una estrategia.

Todos estos hacen "MATH" pero no todos hacen lo "mismo" de otra manera. Esa es la esencia de una estrategia.

Entonces, ¿quién es?

Respuesta

11

Usted señor tiene razón y su compañero de trabajo necesita leer el GoF.

"El patrón de estrategia permite que los algoritmos varíen independientemente de los clientes que los utilizan".

Ver:

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

+1

permite que los algoritmos varíen, pero ¿deja que varíe el resultado? es decir: permite variar la implementación, pero ¿qué pasa con la interfaz? De eso se trata la pregunta. –

+0

?? la pregunta expresada específicamente "Ambos acordamos que el patrón de estrategia permite que las agallas de una clase (por ejemplo, el comportamiento) se intercambien en tiempo de ejecución mientras se mantiene la misma interfaz" –

+0

"varían independientemente de los clientes" está bien, pero ¿cómo lo hacen? varían entre ellos (estrategia vs. estrategia)? Esa es la pregunta. – eljenso

4

apoyo su opinión. Las diferentes estrategias pueden hacer cosas muy diferentes, siempre y cuando se puedan usar en el mismo contexto.

Por ejemplo, si usted quiere visitar cada nodo en un árbol, estrategias válidas podrían ser:

  • Profundidades-primera búsqueda pre-orden
  • DFS posterioridad a la orden
  • BFS
  • aleatorios
  • ...

Todas las estrategias visitarían el nodo s en un orden diferente, pero el objetivo (visitar cada nodo) sería el mismo. Entonces, si el orden no importa, cualquiera de las estrategias se ajusta a sus necesidades.

0

También estoy de acuerdo. Un buen ejemplo sería una estrategia de cálculo de precios. Podría tener diferentes estrategias para calcular el importe final de una factura en función de varias variables, como la cantidad de artículos, el tipo de cliente, el destino del envío, etc. Definitivamente, se esperaría que cada una de esas estrategias arrojara un resultado diferente y aún se consideraría un patrón de Estrategia.

2

De acuerdo con "Cabeza Patrones primer diseño" (see here) página 24

"El patrón de estrategia define una familia de algoritmos,
encapsula cada uno, y los hace intercambiables.
estrategia permite que el algoritmo de variar independientemente de
clientes que lo utilizan. "

Así señor, tiene razón, al menos según las personas que definieron el patrón, pero qué saben ellos.

6

Técnicamente, las estrategias pueden hacer lo que quieran.

Solo cuando el "contexto externo" impone un comportamiento fijo y repetible que no se puede capturar en la interfaz programática (denomínelos "propiedades deseables"), debe tener cuidado de que sus estrategias sean realmente sustituibles a la Liskov con respecto a estas propiedades deseables.

2

Usted es. El objetivo de la estrategia es sustituir el algoritmo. Que entreguen el mismo resultado es un subproducto del comportamiento deseado.

3

Las dos primeras son estrategias. Debido a cualquier entrada, le darán la misma respuesta EXACTA. el último no es Solo porque te da un int no lo convierte en una estrategia. Tienen que "HACER" lo mismo.

Tienen que hacer lo mismo, pero eso no significa que den exactamente el mismo resultado. El ejemplo motivador del GoF es uno de los diferentes algoritmos de diseño o diferentes algoritmos de asignación de registros. Las estrategias tienen el mismo objetivo: diseñar bloques de texto e imágenes en una página, o asignar registros virtuales a registros de hardware, pero no tienen que crear exactamente el mismo resultado.

lo tanto, si el objetivo de la Strategy en su ejemplo es hacer cualquier aritmética con la entrada, a continuación, cada ejemplo es una estrategia para ese objetivo. Si el objetivo era sumar la matriz que se aprobó, DoArithmatic se habría llamado CalculateSum, y el ejemplo final no se ajustaría al contrato de la estrategia, por lo que violaría LSP.

2

Creo que sería más correcto decir que la cuestión de si las estrategias deben ser determinísticamente idénticas está fuera del alcance de la definición del patrón de estrategia.

Si una función siempre devuelve el mismo resultado para las entradas dadas, es determinista. Si dos funciones son deterministas y siempre devuelven el mismo valor para las mismas entradas, entonces son determinísticamente equivalentes. Pueden o no tener los mismos efectos secundarios; si lo hacen, entonces son simplemente equivalentes.

Normalmente este no es el caso. Consideremos un ejemplo que parece requerir una equivalencia determinista: clasificación. Podría pensar que si dos implementaciones del comparador no devuelven el mismo resultado para las mismas entradas, entonces al menos una de ellas debe estar defectuosa, pero este no es necesariamente el caso.

Los órdenes de ordenar varían de país a país. Algunos lugares se clasifican de manera insensible a los acentos. Algunos ponen a McDuck con MacDuck, y así sucesivamente.Estas son estrategias, esta es una aplicación perfecta del patrón de estrategia, y las estrategias son ciertamente no determinísticamente equivalentes.

Usted gana.

Cuestiones relacionadas