Diseñando con Patrones, una vista al COMPOSITE
Para este artículo les traigo un análisis sobre patrones de diseño, la idea es repasar un poquito el tema de forma genérica y esta actividad que sea disparador para aplicar un patrón particular, "El Composite".
Introducción
Si vamos a hablar de patrones de diseño, es necesario definir:
- ¿Qué es diseño? (dentro del proceso de desarrollo de software)
- ¿Qué es un patrón?
- Finalmente ¿Qué es un patrón de diseño?
Veamos, el diseño es una actividad, definir el "como" frente al "qué", hacerlo correcto frente a hacer lo correcto… ¿Somos consientes de estos puntos descriptos cuando diseñamos? Sin duda el diseño es una actividad compleja, sabemos que los requerimientos no funcionales son conflictivos.
Cuales serian nuestras propiedades no funcionales a realizar:
- Reutilización
- Facilidad de modificación
- Facilidad de comprensión
- Robustez
- Eficiencia
- ….
¿Suenan lindas no?
Lo concreto es que las técnicas para conseguir la calidad están menos desarrolladas que las usadas para conseguir funcionalidad, lamentablemente en ocasiones es más importante el aspecto de la calidad que el aspecto funcional.. ups!
Bien… en este contexto… los invito… ¿Aplicamos patrones de diseño?
Para esta práctica voy a utilizar como lenguaje C# y como IDE de desarrollo Visual Studio 2008. Vamos al Composite!!
El interrogante que nos surge inmediatamente es:
¿Qué nos permite realizar el composite?
"Este patrón permite construir objetos de complejidad mayor mediante otros más sencillos de forma recursiva."
Veamos el diagrama de clases del patrón:
(Realizado en EA – Herramienta de modelado)
Figura 1
Como vemos los participantes son:
Client: manipula los objetos indistintamente
Leaf: define comportamiento de los objetos primitivos
Composite: define comportamiento de los objetos compuestos
Component: define el protocolo.
Como ventajas tenemos:
- Permitir a los clientes manejar estructuras complejas y simples de manera uniforme
- El cliente no se preocupa por saber qué tipo de objetos está trabajando.
- Es simple y fácil agregar nuevos componentes.
Como principal problema tenemos la restricción de componentes con respecto a objetos compuestos. (Como marca el siguiente diagrama)
Figura 2
Implementación
Vamos a la herramienta:
Figura 3
Como muestra el explorador de solucione, he realizado la creación de un proyecto Web, donde tengo a mi cliente, el "default.aspx" luego como muestra el diagrama tengo el component, el composite y el leaf.
Veamos el Component:
Figura 4
Como podemos observar importante es la declaración de la clase como abstracta, la variable "nombre" con su ámbito protegido y los tres métodos, dos para agregar y eliminar y una operación en este caso de "Mostrar".
Veamos El Composite:
Figura 5
Para este caso vemos la declaración de un vector "ArrayList" donde voy a almacenar los components, se ven las implementaciones de cada uno de los métodos "Agregar", "Eliminar" y "Mostrar", presten atención a la palabra clave "override" que explica la reescritura del método abstracto, y el método mostrar que muestra un render recursivo sobre una página web de lo que tiene el composite.
Veamos el Leaf:
Figura 6
En la figura anterior vemos que no están implementados los métodos "Agregar", "Eliminar" ya que no es de característica composite, sino un primitivo y si tiene detallado la operación en este caso "Mostrar".
Veamos el Cliente Web:
Figura 7
Como podemos ver, la implementación es muy simple y la visualización recursiva también, veamos el resultado por pantalla:
Figura 8
Este patrón es muy utilizado y con este sencillo ejemplo quería compartir una implementación concreta, donde solo grafico la solución sin optimizar, tengan en cuenta que cada plataforma puede según sus bondades mostrar más flexibilidad para estas implementaciones…
Espero les sea de utilidad y recuerden "Diseñen con Criterio"!!
Vinculo con el código de la práctica:
Video demostrativo:
hola nico, che llegue a tu blog buscando otra cosa, pero me parece muy buenos mmuchos de los temas q tratas, este post particularmente esta muy claro, asiq voy a recomendarlo a mis compañeros. saludos, y supongo q tal vez nos crucemos en el cneisi en estos dias. saludos!
ResponderBorrarNacho.
Excelente post, me agrada tu blog, solo una cosa, los métodos Agregar y Eliminar, podrían ser parte de una interfaz y Mostrar parte de lo abstracto, para no tener que implementar métodos no necesarios dentro de la clase leaf.
ResponderBorrarSaludos.
Desde luego Luis, esta es una versión basica del concepto :) Gracias por los comentarios.
ResponderBorrar