lunes, 4 de febrero de 2008

Estrategia (GoF) - Encapsulemos los algoritmos que varíen

Definamos este útil patrón: "Define una familia de algoritmos, encapsula cada uno y los hace intercambiables. La Estrategia deja que el algoritmo varíe independientemente de los clientes que lo usen".
Su diagrama:
Vamos a nuestro ejemplo de uso, tenemos que modelar el comportamiento de un jugador de fútbol:




Luego de modelar esto, se nos pide agregar la función de atajar , obviamente no para todos los subtipos, sólo el Arquero. Nuestra solución pasaría por agregar la subclase "Arquero" y el método "Atajar()" en mi clase Futbolista.


Ahora bien, le daríamos la posibilidad de atajar a todos los subtipos de futbolistas?, pues no, por lo que deberíamos también sobreescribir el método Atajar() en los demás subtipos, poniendo algún mensaje como "función no disponible" ó retornando null.
Y que pasaría si un futbolista "MedioCentral" decide defender en algún momento como DefensorLateral y atacar como Delantero??, difícil de solucionar con nuestro primer modelo, no?.
Un poco de diseño OO...

La herencia nos trae varios problemas asociados a la extensibilidad y al mantenimiento del código de nuestro modelo.

Nuestro principio básico a recordar aquí es : Encapsular lo que varía. Identifica los aspectos de tu aplicación que puedan variar y sepáralos del resto de tu código que no cambiará; de esta forma podremos alterar ó extender aquellas partes sin afectar al resto.

Todos los patrones de diseño aplican este concepto de una u otra forma, brindando un camino que nos permita variar una parte del sistema independientemente del resto.

Volvamos a nuestro futbolista...

Separemos los comportamientos que varían, sacando los métodos : atajar, defender y atacar, de la clase Futbolista. Luego creamos un grupo de clases que representarán cada comportamiento:

En nuestra clase futbolista, definimos el comportamiento via atributos del tipo de las interfaces definidas, y métodos de seteo (ó propiedades de escritura en C#) para poder configurar el comportamiento del futbolista en cualquier momento de la ejecución.



Por último hagamos un testing, generando un futbolista con cierto comportamiento :














Con la explicación de este patrón, termino esta miniserie de GoF (Decorador y Estrategia). En próximos post veremos algunos GoF creacionales.

4 comentarios:

Anónimo dijo...

Excelente Blog... felicidades... estan super los articulos que has posteado la verdad me parece super interesante la forma que integras la arquitectura en el desarrollo de aplicaciones .net

me gustaria referenciar tu blog desde el mio..

Saludos,

Alexander Jimenez
Maracay - Venezuela

Anónimo dijo...
Este comentario ha sido eliminado por un administrador del blog.
Jorge Ercoli dijo...

Gracias Alex, agradezco mucho tu comentario. Tienes el privilegio de ser el 1er lector que comenta en mi blog!!!
Hace bien darse cuenta que lo que uno escribe le puede servir al otro, nuevamente gracias; y por supuesto que puedes referenciar mi blog, para eso estan, no?.
Entre a ti blog, uff cuantas noticias, veo que sos Fan de .NET!.
Me gustaria me comentes si estas desarrollando algo, cualquier cosa mi msn=jercoli@hotmail.com.
Saludos y nos escribimos...

Anónimo dijo...

jejeje que bien ser el primero :-)

Si efectivamente soy fanatico a la programacion en .net es por ello que la cantidad de post que he realizado ya sean mios propiamente como noticias de interes...

Saludos,

Alexander Jimenez
Maracay - Venezuela
MSN: alex_fox_net@hotmail....