Busqueda local

Loading

jueves, 24 de marzo de 2011

Command Pattern

En programación no cabe duda, que podemos hacer las cosas de muchas maneras; cuando daba clase de programación, le permitía a mis alumnos presentar diferentes soluciones para el mismo problema. Sin embargo conforme van madurando el código debe ser más eficiente, mas escalable, más robusto. Esto requiere que antes de inventar la rueda, investiguemos a ver si no ha sido inventada aun.
Un patrón es como una plantilla predefinida, pero que puede ser ajustada durante la implementación, esta versatilidad, nos permite utilizar la misma solución para diferentes situaciones.
El patrón Command pertenece al grupo de los de comportamiento, los cuales identifican patrones de comunicación entre objetos, al usarlo agregamos flexibilidad a nuestro código. En este patrón un objeto se usa para representar acciones; este objeto encapsula una acción específica y sus parámetros.
 

Actores

Interface: define el único método que se requiere.
Comando: Implementa la interface y lleva a cabo la acción específica en la clase receptora.
Receptor: Esta clase es la que conoce la implementación y sabe cómo realizar la acción.
Invocadora: Esta clase es la que se encarga de solicitar que se ejecute un comando sobre una clase receptora.
 

Requerimientos

Tenemos componentes que atienden todas las acciones relacionadas a una entidad, por ejemplo Las entradas del Blog, las noticias, las preguntas frecuentes, el clima. Las páginas del sitio tienen áreas donde se debe presentar esta información, la cual se encuentra configurada en el administrador de contenido. La idea es que un administrador del sitio pueda cambiar el contenido de una de las áreas, sin que sea necesaria la intervención de un programador.
 

Análisis

El proyecto necesita un mecanismo central desde el cual se puedan ejecutar acciones configuradas sobre otros componentes. Este mecanismo realizara las tareas necesarias para obtener la información que se requiere en un área de una página, y construirá un objeto complejo que contendrá la información necesaria.
 

Manos a la obra

Como siempre nuestro primer paso es una interface que deben implementar todos aquellos componentes que vamos a controlar con este mecanismo, la interface define un único método en el cual se deberá codificar la lógica necesaria para crear registros en la tabla correspondiente, de la cual será leída por nuestra clase constructora:
cmd1
Todos los componentes implementaran esta interface, estos componentes son nuestra clase receptora, como en el siguiente ejemplo:
cmd2
Ahora crearemos la interface que servirá para los comandos específicos:
cmd3
Esta interface define un único método, que recibe como parámetro un objeto que implementa la interface IComponente, o sea cualquiera de los componentes que definimos.
Una vez que tenemos esta interface, podemos codificar nuestro comando específico:
cmd4
Debido a que todos nuestros componentes implementan la misma interface, es posible que el mismo comando se pueda llevar a cabo sobre cualquiera de ellos, sin que sea necesario establecer el tipo.
Lo único que nos falta es una clase invocadora, esta clase debe ser capaz de recibir la lista de comandos y la lista de objetos receptores y poder ejecutar los comandos; este mecanismo tan simple nos permite agregar nuestros comandos a una lista para poder ejecutarlos todos de una vez:
cmd5
Para terminar crearemos una aplicación de consola que nos servirá de aplicación de pruebas, necesitamos dos listas genéricas para almacenar los comandos y los componentes; es importante que los agreguemos en el mismo orden, ya que nuestra clase invocadora, parte de esa idea, al realizar el recorrido, nuestro código quedaría así:
cmd6
Lo que nos da como resultado la siguiente pantalla:
cmd7

 

Comentario final

Lo interesante de la forma en que se implemento este patrón es la posibilidad de poder agregar más componentes, así como omitir que se ejecute alguno según alguna lógica de negocios. Lo que sirve perfectamente para solucionar nuestro problema expuesto en los requerimientos.
El poder del código solo es completo, si tenemos el conocimiento de como usarlo.

No hay comentarios:

Publicar un comentario