Patrones de diseño Introducción
Patrones de diseño Patrones de diseño Los patrones de diseño son la base para la búsqueda de soluciones a problemas comunes en el desarrollo de software y otros ámbitos referentes al diseño de interacción o interfaces. Un patrón de diseño resulta ser una solución a un problema de diseño.
Patrones de diseño Para que una solución sea considerada un patrón debe poseer ciertas características. Una de ellas es que debe haber comprobado su efectividad resolviendo problemas similares en ocasiones anteriores. Otra es que debe ser reutilizable, lo que significa que es aplicable a diferentes problemas de diseño en distintas circunstancias.
¿Cómo surgen los patrones de diseño? En 1979 el arquitecto Christopher Alexander aportó al mundo de la arquitectura el libro The Timeless Way of Building; en él proponía el aprendizaje y uso de una serie de patrones para la construcción de edificios de una mayor calidad. En palabras de este autor, "Cada patrón describe un problema que ocurre infinidad de veces en nuestro entorno, así como la solución al mismo, de tal modo que podemos utilizar esta solución un millón de veces más adelante sin tener que volver a pensarla otra vez."
Patrones de diseño Los patrones que Christopher Alexander y sus colegas definieron, publicados en un volumen denominado A Pattern Language, son un intento de formalizar y plasmar de una forma práctica generaciones de conocimiento arquitectónico. Los patrones no son principios abstractos que requieran su redescubrimiento para obtener una aplicación satisfactoria, ni son específicos a una situación particular o cultural; son algo intermedio.
Patrones de diseño Un patrón define una posible solución correcta para un problema de diseño dentro de un contexto dado, describiendo las cualidades invariantes de todas las soluciones. Dentro de las soluciones de Christopher Alexander se encuentran cómo se deben diseñar ciudades y dónde deben ir las perillas de las puertas.
Patrones de diseño Más tarde, en 1987, Ward Cunningham y Kent Beck, sobrepasados por el pobre entrenamiento que recibían los nuevos programadores en orientación a objetos, se preguntaban cómo se podían capturar las buenas ideas para, luego de alguna manera, traspasarlas a los nuevos programadores recién instruidos en herencia y polimorfismo. Leyendo a Alexander se dieron cuenta del paralelo que existía entre la buena arquitectura propuesta por Alexander y la buena arquitectura OO, de modo que usaron varias ideas de Alexander para desarrollar cinco patrones de interacción hombre-computadora (HCI) y publicaron un artículo titulado Using Pattern Languages for OO Programs.
Patrones de diseño No obstante, no fue hasta principios de la década de 1990 cuando los patrones de diseño tuvieron un gran éxito en el mundo de la informática a partir de la publicación del libro Design Patterns escrito por el grupo Gang of Four (GoF) compuesto por Erich Gamma, Richard Helm, Ralph Johnson y John Vlisides, en el que se recogían 23 patrones de diseño comunes.
Patrones de diseño No obstante, no fue hasta principios de la década de 1990 cuando los patrones de diseño tuvieron un gran éxito en el mundo de la informática a partir de la publicación del libro Design Patterns escrito por el grupo Gang of Four (GoF) compuesto por Erich Gamma, Richard Helm, Ralph Johnson y John Vlisides, en el que se recogían 23 patrones de diseño comunes.
Hacer software no es fácil… Patrones de diseño Hacer software no es fácil… Chapter 1: Introduction. Design Patterns, The Gang of Four Diseñar software orientado a objetos es difícil, y diseñar software orientado a objetos reutilizable es todavía más difícil. ...y un software capaz de evolucionar tiene que ser reutilizable (al menos para las versiones futuras)
¿Cómo se llega a ser un maestro de ajedrez? Patrones de diseño ¿Cómo se llega a ser un maestro de ajedrez? Primero aprender las reglas del juego Nombres de las piezas, movimientos legales, geometría y orientación del tablero, etc. A continuación aprender los principios relativo valor de las piezas, valor estratégico de las casillas centrales, jaque cruzado, etc. Sin embargo, para llegar a ser un maestro, hay que estudiar las partidas de otros maestros Estas partidas contienen patrones que deben ser entendidos, memorizados y aplicados repetidamente Hay cientos de estos patrones
¿Cómo se llega a ser un maestro del software? Patrones de diseño ¿Cómo se llega a ser un maestro del software? Primero aprender las reglas Algoritmos, estructuras de datos, lenguajes de programación, etc. A continuación aprender los principios Programación estructurada, programación modular, programación OO, programación genérica, etc. Sin embargo, para llegar a ser un maestro, hay que estudiar los diseños de otros maestros Estos diseños contienen patrones que deben ser entendidos, memorizados y aplicados repetidamente Hay cientos de estos patrones
Patrones de diseño Asimismo, no pretenden: Imponer ciertas alternativas de diseño frente a otras. Eliminar la creatividad inherente al proceso de diseño. No es obligatorio utilizar los patrones, solo es aconsejable en el caso de tener el mismo problema o similar que soluciona el patrón, siempre teniendo en cuenta que en un caso particular puede no ser aplicable. "Abusar o forzar el uso de los patrones puede ser un error".
Categorías de los patrones Patrones de diseño Categorías de los patrones Según la escala o nivel de abstracción: Patrones de arquitectura: Aquellos que expresan un esquema organizativo estructural fundamental para sistemas de software. Patrones de diseño: Aquellos que expresan esquemas para definir estructuras de diseño (o sus relaciones) con las que construir sistemas de software. Patrones elementales: Patrones de bajo nivel específicos para un lenguaje de programación o entorno concreto.
Patrones de diseño Ejemplos
Elementos Patrones de diseño En general, un patrón tiene cuatro elementos esenciales: Nombre del patrón: Referencia al patrón Incrementa el vocabulario de diseño Encontrar buenos nombres es una de las mayores dificultades El problema: Cuando aplicar el patrón Explica el problema y el contexto Puede incluir condiciones que se deben cumplir para que el patrón tenga sentido
Patrones de diseño La solución: Las consecuencias: Describe los elementos que componen el diseño, sus relaciones, responsabilidades y colaboraciones Descripción abstracta de cómo una disposición de elementos (clases y objetos) solucionan el problema Se ilustra con un ejemplo de código Las consecuencias: Son los resultados de aplicar el patrón, listarlos ayuda a entender y evaluar. Necesidades (tiempo, memoria), aspectos de implementación y lenguaje de programación, flexibilidad, extensibilidad, portabilidad
Estructura o plantilla de patrones Patrones de diseño Estructura o plantilla de patrones Para describir un patrón se usan plantillas más o menos estandarizadas, de forma que se expresen uniformemente y puedan constituir efectivamente un medio de comunicación uniforme entre diseñadores. Varios autores eminentes en esta área han propuesto plantillas ligeramente distintas, si bien la mayoría definen los mismos conceptos básicos.
Clasificación del patrón: creacional, estructural o de comportamiento. Patrones de diseño La plantilla más común es la utilizada precisamente por el GoF y consta de los siguientes apartados: Nombre del patrón: nombre estándar del patrón por el cual será reconocido en la comunidad (normalmente se expresan en inglés). Clasificación del patrón: creacional, estructural o de comportamiento. Intención: ¿Qué problema pretende resolver el patrón? También conocido como: Otros nombres de uso común para el patrón.
Patrones de diseño Motivación: Escenario de ejemplo para la aplicación del patrón. Aplicabilidad: Usos comunes y criterios de aplicabilidad del patrón. Estructura: Diagramas de clases oportunos para describir las clases que intervienen en el patrón. Participantes: Enumeración y descripción de las entidades abstractas (y sus roles) que participan en el patrón. Colaboraciones: Explicación de las interrelaciones que se dan entre los participantes.
Patrones de diseño Consecuencias: Consecuencias positivas y negativas en el diseño derivadas de la aplicación del patrón. ¿Cómo cumple el patrón sus objetivos? Implementación: Técnicas o comentarios oportunos de cara a la implementación del patrón. Código de ejemplo: Código fuente ejemplo de implementación del patrón. Usos conocidos: Ejemplos de sistemas reales que usan el patrón. Patrones relacionados: Referencias cruzadas con otros patrones.
Patrones de diseño Clasificación El GoF describe 23 patrones, clasificados según su propósito: De creación (Creational): son utilizados para instanciar objetos, y así separar la implementación del cliente de la de los objetos que se utilizan. Con ellos intentamos separar la lógica de creación de objetos y encapsularla. De estructura (Structural): se utilizan a la hora de definir como las clases y objetos interaccionan entre ellos, es decir, se ocupan de resolver problemas sobre la estructura de las clases. De comportamiento (Behavioral): ayudan a resolver problemas relacionados con el comportamiento de la aplicación. Ofrecen soluciones respecto a la interacción y responsabilidad entre objetos y clases
Patrones de diseño Clasificación
¿Cómo seleccionar un patrón de diseño? Patrones de diseño ¿Cómo seleccionar un patrón de diseño? Considerar cómo los patrones de diseño solucionan problemas de diseño Buscar las intenciones de cada patrón Estudiar cómo se interrelacionan los patrones Estudiar patrones de propósito similar Examinar la causa de un rediseño Considerar qué debería ser variable en un diseño
¿Cómo usar un patrón de diseño? Patrones de diseño ¿Cómo usar un patrón de diseño? Leer el patrón completo para tener una visión general Poniendo especial atención a sección la aplicabilidad y consecuencias para asegurarse que es el patrón correcto para el problema Volver y estudiar la estructura, los participantes y las colaboraciones Asegurarse de entender las clases y objetos en el patrón y como se relacionan entre ellos Revisar la sección de ejemplos para ver un ejemplo concreto codificado del patrón Estudiar el código puede ayudar a aprender como implementar el patrón
Patrones de diseño Elegir nombres para los participantes del patrón que sean significativos en el contexto de la aplicación Los nombres de los participantes en el patrón son abstractos para ponerlos en la aplicación, sin embargo, es útil incorporar el nombre del participante en el nombre que aparece en la implementación Definir las clases Declarar sus interfaces, establecer sus relaciones de herencia y definir las variables de instancia que representan datos y referencias a objetos. Identificar clases existentes en la aplicación que el patrón afectará y modificarlas de acuerdo a este.
Patrones de diseño Definir nombres específicos de la aplicación para las operaciones en el patrón Los nombres generalmente dependen de la aplicación. Usar las responsabilidades y colaboraciones asociadas con cada operación como guía. Ser consistente en las convenciones de nomenclatura. Implementar las operaciones que realizarán las responsabilidades y colaboraciones del patrón La sección de implementación ofrece pistas para guiar la implementación y la sección de códigos de ejemplo también pueden ayudar.
Patrones de diseño Con el tiempo se desarrolla la habilidad de trabajar con los patrones de diseño. Es importante saber como NO USARLOS: Los patrones de diseño no deben ser aplicados indiscriminadamente. A menudo se logra la flexibilidad y variabilidad introduciendo elementos que pueden complicar el diseño y/o afectar el performance. Un patrón de diseño solo debería ser aplicado cuando la flexibilidad que proporciona es realmente necesaria. La sección de consecuencias es de gran utilidad al evaluar el uso del patrón.
¿Por qué usarlos? Patrones de diseño Existen muchos patrones, pero lo importante es saber que existen y preocuparnos por entenderlos y usarlos. En un mundo ideal, todo programador debería aprender la sintaxis de la programación y luego los patrones de diseño. Estos servirán como guía para escribir código de la manera correcta y ayudarán a resolver problemas de una manera estándar y profesional.