Contexto
La humanidad ha seguido patrones a través de su historia. Basta con mirar expresiones de arte, como la pintura, la literatura, la arquitectura o la música. En cada una de estas actividades se puede observar la presencia de patrones que se aprenden y se replican. Así, por ejemplo, los pintores siguen las reglas de sus maestros como el impresionismo, realismo o el arte abstracto; los escritores mantienen un estilo como la tragedia, la novela romántica, o la ciencia ficción y los arquitectos han mantenido estilos que siguen patrones del diseño que pueden ser identificados a través de la historia.
En todos estos casos y en otras actividades humanas, seguir patrones es una constante, después de todo prometen obtener resultados siguiendo una serie de pasos preestablecidos.
Ésta es justamente la idea de los patrones en el diseño del software, tomar una estructura que ha sido exitosa al ser utilizada en diferentes escenarios, sin la necesidad de tener que pasar por los mismos errores cometidos por otros. Al fin y al cabo, ¿para qué reinventar la rueda, si alguien ya se tomó la molestia de fabricarla y darnos las instrucciones del proceso de fabricación?
Algunos autores consideran que estos diseños son parte de la etapa de construcción ya que ofrecen especificaciones de bajo nivel de abstracción que llega hasta proponer estructuras de código concretas, sin embargo, estos patrones deben ser considerados dentro de la etapa del diseño porque tienen un impacto en la arquitectura general del software.
Explicación
6.1 Conceptos generales
Replicar un método o proceso científico permite confirmar que los resultados esperados no varían. Por ejemplo, puedes verificar la velocidad de los cuerpos en caída libre por la fuerza de gravedad. Sabes que al aplicar la ecuación de la fuerza de gravedad los resultados serán consistentes e incluso predecibles, hecho que permitió que el hombre pisara la luna. Esa es la misma idea que se aplica a los patrones arquitectónicos: reutilizar diseños de arquitectura que fueron probados en múltiples ocasiones y con resultados exitosos, facilitando el diseño en escenarios diversos.
“El patrón es una descripción del problema y la esencia de su solución, de modo que la solución puede reutilizarse en diferentes configuraciones” (Sommerville, 2011).
A continuación analizarán los conceptos en los que se fundamentan los patrones del software.
Para ejemplificar los niveles de detalle que describen los patrones del diseño del software puedes revisar el siguiente diagrama:
Haz clic en cada concepto para conocer más detalle.
Diagrama adaptado de Welicki, L. (s.f.). Patrones y Antipatrones: una Introducción - Parte I. Recuperado de https://msdn.microsoft.com/es-es/library/bb972242.aspx
GoF o “Gang of four”
La “banda de los cuatro” o GoF por sus siglas en inglés, hace referencia a los cuatro autores del libro Design Patterns: Elements of Reusable Object-Oriented Software, publicado en 1995: Gamma, Helm, Johnson y Vlissides. Este libro se volvió un referente en la industria del software ya que recopila 23 patrones de diseño a modo de catálogo. Para el año 2000, Linda Rising catalogó más de 1000 patrones que habían sido documentados.
“Estoy seguro que sus 1000 (patrones) son sólo una fracción de lo que Rising pudiera encontrar hoy si ella repitiera su esfuerzo” (Hanmer, 2013).
Por otro lado, el antipatrón de diseño describe los errores más comunes que se comenten al diseñar un software que llevan inevitablemente al fracaso, por lo que han de evitarse. La idea es ofrecer información sobre sus características con el fin de reconocerlos a tiempo.
Existen dos formas de agrupar los patrones de diseño:
Haz clic en cada concepto para conocer más detalle.
Un lenguaje de patrón describe la interrelación de un conjunto de patrones haciendo uso de un formato estándar. Tienen la ventaja de describir las buenas prácticas de diseño para resolver problemas derivados de un dominio particular.
Pressman (2010) propone el siguiente formato:
Nombre del patrón |
Describe la esencia del patrón con un nombre corto. |
Problema |
Descripción del problema que resuelve. |
Motivación |
Proporciona un ejemplo del problema |
Contexto |
Describe el ambiente en el que reside el problema. |
Fuerzas |
Análisis de las limitaciones y restricciones que deben ser tomadas en cuenta. |
Solución |
Descripción detallada de la solución propuesta para el problema. |
Objetivo |
Describe el patrón y lo que hace. |
Colaboraciones |
Describe la manera en la que otros patrones contribuyen a la solución. |
Consecuencias |
Describe los intercambios potenciales que deben de ser considerados cuando se implementa el patrón y las consecuencias de uso. Nota: Shalloway y Trott (2005) aclaran que el término consecuencias no tiene una connotación negativa, sino que se refiere al efecto de una causa. |
Implementación |
Identifica los aspectos especiales que deben considerarse cuando se implementa el patrón. |
Usos conocidos |
Da ejemplos de usos reales del patrón de diseño en aplicaciones reales. |
Patrones relacionados |
Menciona referencias a patrones de diseño relacionados. |
En la práctica encontrarás que no todos estos atributos son descritos para cada patrón, sin embargo te da una buena idea de la información que puedes esperar al buscar patrones que den solución al diseño del software.
Ejemplo:
Nombre del patrón |
Facade |
Problema |
Necesidad de utilizar un subconjunto de componentes de un sistema más complejo, o se requiere interactuar con el sistema en una forma particular. |
Fuerzas |
No debe de ser diseñado para proveer información adicional. Nunca debe devolver componentes del subsistema de los métodos de Facade a los clientes. |
Solución |
El patrón Facade presente una nueva interface para el cliente de un sistema existente. |
Colaboraciones |
Presenta una interfaz simplificada para el cliente, que es más fácil de usar. |
Consecuencias |
El patrón Facade simplifica el uso de un subsistema requerido. Sin embargo, dado que Facade no es completo, ciertas funcionalidades podrían no estar disponibles para el cliente. |
Implementación |
Definir una nueva clase (clases) que tiene la interfaz requerida. Tener esta nueva clase en el sistema existente. |
Estructura general |
Ejemplo tomado del libro: Shallowar, A y Trot, J (2005). Design patterns explained. (2ª ed.). Addison – Wesley. Sólo para fines educativos. |
Es una agrupación de una serie de patrones que permite entender sus relaciones a través del uso de hipervínculos.
6.2 Diseño basado en patrones
En general, el diseño basado en patrones aparece en varias industrias: automotriz, aeronáutica, transformación de bienes, agricultura, minería, medicina, por mencionar algunas, y ha sido una forma de asegurar los resultados y disminuir el riesgo.
Si se sabe que la aplicación de un método ofrece resultados exitosos, por qué no reutilizar el mismo método en lugar de crear una solución desde cero. Esa es la misma idea que se tiene al construir productos de software.
Un ingeniero de diseño software basa su trabajo de las especificaciones de requerimientos del software, después debe buscar alguna técnica de abstraer la información y generar el diseño más adecuado. En esta labor es posible que el ingeniero encuentre un patrón de diseño que se ajuste al problema que se enfrenta y así conducirlo hacia la construcción de un modelo de diseño. Si no encuentra un patrón que se ajuste, hará uso de las herramientas de modelado y generará una solución aplicando métodos y notaciones de diseño.
Este proceso de diseño Pressman (2010), lo describe a través del siguiente diagrama. Observa que incluye los atributos de calidad porque determinan en buena medida las características del diseño del software.
Diseño basado en patrones. Figura tomada del libro: Pressman, R. (2010). Ingeniería de Software. Un enfoque práctico. (7ª ed). México: McGraw Hill. Sólo para fines educativos.
Shalloway y Trott (2005) proponen los siguientes pasos para que un diseñador piense en patrones:
El primer paso en el diseño debe ser comprender el contexto del software a partir del trabajo realizado en la ingeniería de requerimientos. Después identificar los patrones que pudieran servir para resolver el problema que plantea el desarrollo del sistema. Utilizar un patrón de diseño e ir refinando el diseño hasta reconocer que se ha encontrado la solución del problema. Finalmente deberá realizar los ajustes necesarios para mejorar el diseño.
Al utilizar varios patrones en un diseño de software es frecuente que el diseñador pueda perder el control de los patrones seleccionados. Para ello puede hacer uso de una tabla de organización de patrones en la que se pueden ir registrando los problemas identificados y el patrón de diseño utilizado.
Pressman (2010) sugiere hacer uso de una hoja de cálculo con hipervínculos a sitios web que provean de una descripción completa de los patrones de la tabla.
Tabla de organización de patrones. Toma del libro de Pressman, R. (2010). Ingeniería de Software. Un enfoque práctico. (7ª ed). México: McGraw Hill.
Sin lugar a dudas hacer uso de patrones de diseño es una gran ventaja, sin embargo también es posible caer en errores que pueden llevar al diseño a una callejón sin salida. Algunos de los errores comunes en el diseño basado en patrones son los siguientes:
Pressman (2010) sugiere que para evitar este tipo de errores se busque una segunda opinión a través de técnicas de revisión, en la que compañeros del equipo técnico analicen el diseño y la aplicación de los patrones, corroborando así su aplicación al dominio particular del proyecto.
6.3. Estructura y patrones de diseño
La estructura es un esqueleto de una infraestructura específica que puede complementar un patrón de diseño, permitiendo así describir de manera más completa el diseño del software.
Pressman (2010) afirma que una estructura es una “miniarquitectura reutilizable” y que sirve como base para aplicar uno o varios patrones de diseño, y que es posible adaptarla para resolver un problema de un dominio específico haciendo uso de “puntos de conexión” de los que se pueden integrar otras clases o funciones específicas.
Para entender mejor las diferencias entre un patrón de diseño y una estructura, Pressman (2010) considera lo siguiente:
Patrones de diseño |
Estructuras |
Son más abstractos que las estructuras. |
Son descritas mediante lenguajes de programación que pueden ser ejecutadas y reutilizadas directamente. |
Son más pequeños que las estructuras y no pueden contener varias estructuras. |
Pueden incluir varios patrones de diseño. |
Son menos especializados que las estructuras, por lo que pueden utilizarse en un ámbito más amplio de aplicaciones. |
Siempre tienen un dominio particular de aplicación, que para lograr una mayor eficacia deben ser aplicados sin cambios. |
Ejemplo de la estructura del patrón de diseño Factory Method haciendo uso del diagrama de clases UML.
Imagen obtenida de http://patronesdediseno.net16.net/. Sólo para fines educativos.
La misma estructura puede ejemplificarse a través del código. En el siguiente ejemplo se muestra una estructura para el patrón de Factory Method en código Java.
Código Factory Method
public interface ProductReader {
public DecodedProduct getDecodedProduct();
}
public class Product1Reader implements ProductReader {
public DecodedProduct getDecodedProduct() {
// ...
return decodedProduct;
}
}
public class Product2Reader implements ProductReader {
public DecodedProduct getDecodedProduct() {
// ...
return decodedProduct;
}
}
public class ProductReaderFactory {
public static ProductReader getProductReader(InputStream is) {
int ProductType = determineProductType(is);
A partir de la publicación de GoF se pueden obtener las siguientes clases de patrones orientados a objetos:
Haz clic en cada concepto para conocer más detalle.
Ofrecen patrones que ayudan a tomar la decisión de crear, generar o representar un objeto. Según Pressman (2010), este tipo de patrones facilitan obtener información de las instancias de los objetos y al mismo tiempo restringen la cantidad de objetos creados en un sistema.
Permiten encontrar maneras en las que los objetos y las clases que los describen, forman estructuras más complejas, ya sea combinándolos o integrándolos en estructuras más grandes.
Establecen la forma en cómo se relacionan, se comunican y se asigna responsabilidades entre las clases y los objetos
Los 23 patrones de diseño se clasifican a través de dos criterios: propósito y alcance. El propósito refleja lo que el patrón hace, mientras que el alcance se refiere a si aplica a la clase o a un objeto.
Catálogo de patrones de diseño. Tabla tomada del libro: Gamma, E., Helm, R., Johnson R. y Vlissides J. (1995). Design Patterns, Elements of Reuseable, Object-Oriented Software. EEUU: Addison.Wesley. Sólo para fines educativos
Cierre
Los patrones de diseño ofrecen un camino para solucionar problemas que enfrenta el diseño del software, sin embargo, no son la panacea. Será necesario hacer un análisis del patrón que ayude a identificar si puede o no aplicarse a la circunstancia particular del diseño y en muchos casos hacer algunos ajustes necesarios.
Como diseñador podrás ir generando tu propio catálogo de patrones conforme los vayas aplicando y serán una buena base para solucionar otros problemas del diseño que pertenecen al mismo dominio. Por ejemplo, si en tu proyecto desarrollaste una tienda virtual para una compañía, es muy posible reutilizar el patrón del diseño para algún otro proyecto similar, sólo bastará con realizar pequeños ajustes para asegurarte que cubra con los requerimientos funcionales y no funcionales de tus nuevos clientes.
Los patrones son una fuente de información muy valiosa para explicar la configuración, uso e implementación de tus diseños al grupo técnico de desarrollo, además de que pueden ser una herramienta de entrenamiento muy eficaz para nuevos integrantes del equipo.
Checkpoint
Asegúrate de poder:
Glosario
GoF: “Gang of four” título aplicado al libro Design Patterns, Elements of Reuseable, Object-Oriented Software y que hace alusión a sus cuatro autores: Gamma, Helm, Johnson y Vlissides
Reusabilidad: La propiedad de los patrones más importante es la reusabilidad, pues te permite reutilizarlos para resolver diferentes problemas del diseño en diferentes escenarios.
Referencias