escuela técnica superior de ingeniería informática Introducción a los Patrones de Diseño Departamento de Lenguajes y Sistemas Informá Informáticos Ingeniería del Software II El Camino ♦ Qué es un Patrón de Diseño (PD) ♦ Qué no es un PD 1 Qué es un Patrón de Diseño ♦ ¿Qué es el diseño?¿Qué es un patrón? ¿Qué es un patrón de diseño? ♦ El diseño es una actividad ♦ El cómo frente al qué ♦ Hacerlo correcto frente a hacer lo correcto ♦ Asignar responsabilidades a las clases ♦ ¿Es una actividad difícil? ♦ Debe serlo pues está bien remunerada ♦ “Un martillo no te hace un buen arquitecto”. Conocer un lenguaje OO no te hace un buen diseñador (aunque es imprescindible) ♦ Los requisitos no funcionales son “conflictivos” Qué es un Patrón de Diseño ♦ Por lo tanto el diseñador debe … ♦ Encontrar una solución que consiga el equilibrio óptimo entre las propiedades no funcionales ♦ Si damos el mismo documento de requisitos a 10 diseñadores, obtendremos 10 diseños diferentes ♦ ¿Qué diferencia hay entre los diseñadores expertos y los novatos? ♦ Recetas para los problemas habituales. No están reinventando la rueda continuamente ♦ Utilizan recetas exitosas ♦ ¿Cómo se describen estas recetas? 2 Qué es un Patrón de Diseño ♦ Orígenes de los PP.DD ♦ Definiciones ♦ Clasificación ♦ Ejemplo: PD Singleton Qué es un Patrón de Diseño Orígenes de los PP.DD ♦ Definiciones ♦ Clasificación ♦ Ejemplo: PD Singleton 3 Qué es un PD Orígenes de los PP.DD ♦ Christopher Alexander (Viena, 1936) 1977 1979 Qué es un PD Orígenes de los PP.DD Ward Cunnighan OOPSLA 87 Kent Beck 1. 2. 3. 4. 5. Window per Task Few Panes Standard Panes Nouns and Verbs Short Menus 4 Qué es un PD Orígenes de los PP.DD ♦ 1990. Erich Gamma asiste a una charla de Bruce Andersen en un taller del OOPSLA, titulada “Architecture Handbook”. Esta realizando su tesis doctoral y necesita desarrollar un Framework C++ para aplicaciones gráficas multiplataforma (ET++) ♦1991. Andersen organiza un taller donde Gamma coincide con: Richard Helm Ralph Johnson John Vlissides Qué es un PD Orígenes de los PP.DD ♦ 1993. Beck y Booch “sufragan” un retiro en las montañas de colorado. Nace el HillSide ♦1994. Hillside organiza la primera edición del PLOP (Patterns Languages of Program Design). La banda de los cuatro venden más de 750 ejemplares de su libro (10 veces más que cualquier libro hasta entonces) 5 Qué es un PD Orígenes de los PP.DD Lecciones aprendidas ♦ Los PP.DD han surgido tomando ideas de otras disciplinas (la arquitectura las toma a su vez de la Biología) ♦ Los PP.DD han tenido su origen en la Academia y no en la industria (es de los pocos ejemplos) ♦ Las tesis doctorales sirven para algo ♦ El mundo anglosajón suele hacer un uso intensivo de los grupos de presión en todos los ámbitos Qué es un PD ♦ Orígenes de los PP.DD Definiciones ♦ Clasificación ♦ Ejemplo: PD Singleton 6 Qué es un PD Definiciones ♦ De manera general Patrón: Modelo que sirve de muestra para sacar otra cosa igual (RAE) Patrón de diseño: Una solución general a un problema general que puede adaptarse a un problema concreto http://www.textile-creation-club.com/esp/patrones.htm Qué es un PD Definiciones ♦ En Arquitectura Cada patrón describe un problema que ocurre una y otra vez en nuestro entorno. También describe el núcleo de la solución al problema, de forma que puede utilizarse un millón de veces sin hacer dos veces lo mismo • • • • • Técnica de descripción Par problema-solución Recurrente Sólo el núcleo, no es una solución completa Reutilizable 7 Qué es un PD Definiciones ♦ En Ingeniería del Software (Gamma95, pág. 360) A design pattern systematically names, motivates, and explains a general design that addresses a recurring design problem in OO systems. It describes the problem, the solution, when to apply the solution, and its consequences. It also gives implementation hints and examples. The solution is a general arrangement of object and classes that solve the problem. The solution is customized and implemented to solve the problem in a particular context. Qué es un PD Definiciones ♦ En Ingeniería del Software (Larman, pag. 204) Un patrón es un par problema/solución con nombre que se puede aplicar en nuevos contextos con consejos acerca de cómo aplicarlo en nuevas situaciones y discusiones sobre sus compromisos ♦ Existe consenso en: ♦ Par (problema, solución) ♦ Reutilizar conocimiento vs reutilizar software ♦ Problemas recurrentes (¿Cuándo se considera recurrente?) 8 Qué es un PD ♦ Orígenes de los PP.DD ♦ Definiciones Clasificación ♦ Ejemplo: PD Singleton Clasificación Plantilla de descripción de la GoF 1. Nombre y clasificación: expresa sucintamente la esencia del patrón 2. Intención: frase corta que responde a qué hace y qué resuelve 3. También conocido como: otros nombres conocidos para el PD 4. Motivación: un escenario que ilustra como el PD resuelve un problema concreto 5. Aplicabilidad: otras situaciones en las que resulta aplicable el PD 6. Estructura: diagramas de clases 7. Participantes: responsabilidad de cada clase participante 8. Colaboraciones: diagrama de colaboración y/o de secuencias 9. Consecuencias: ventajas e inconvenientes 10.Implementación: dificultades, técnicas y trucos a tener en cuenta al aplicar el PD 11.Código de ejemplo: ejemplo de implementación y de uso del PD 12.Usos conocidos: ejemplos de uso en sistemas reales 13.Patrones relacionados: diferencias con los patrones más relacionados 9 Clasificación Catálogo de la GoF Creacional Fábrica Abstracta, Método Fábrica, Constructor, Prototipo, Singular Estructural Adaptador, Puente, Compuesto, Decorador, Fachada, Peso Mosca, Apoderado De Comportamiento Cadena de Responsabilidad, Comando, Iterador, Mediador, Memento, Observador, Estado, Estrategia, Visitante, Método Plantilla Clasificación Relaciones entre patrones 10 Clasificación Catálogo de Grand ♦ Parte de la de Gamma y la extiende con 9 categorías más: ♦ Fundamentales ♦ Particionamiento ♦ Concurrencia ♦ GRASP ♦ GUI ♦ Organización del código ♦ Optimización del código ♦ Robustez ♦ Prueba Qué es un PD ♦ Orígenes de los PP.DD ♦ Definiciones ♦ Clasificación Ejemplo: PD Singleton 11 Facade 1. Nombre/Clasificación: Facade (Fachada). Estructural. 2. Intención: Proporcionar una interfaz unificada para un conjunto de interfaces en un subsistema, haciéndolo más fácil de usar 3. Motivación: Reducir la complejidad y minimizar dependencias clases clientes Fachada Fachada clases del subsistema Facade ♦ Motivación ♦ Estructurar un entorno de programación Linkador Linkador Editor Editor Depurador Depurador Clases del Clases del subsistema de subsistema de compilación compilación Compilador Compilador Compilar() Compilar() AnaSin AnaSin ASA ASA AnaLex AnaLex TabSim TabSim Token Token 12 Facade 4) 5) Aplicabilidad: ♦ Se quiera proporcionar una interfaz sencilla para un subsistema complejo ♦ Se quiera desacoplar un subsistema de sus clientes y de otros subsistemas, haciéndolo mas independiente y portable ♦ Se quiera dividir los sistemas en niveles: las fachadas serían el punto de entrada a cada nivel Estructura Clases Clasesdel del subsistema subsistema Fachada Fachada BB AA CC DD EE Facade 6) Participantes ♦ Fachada: delegar las peticiones de los clientes en los objetos del subsistema ♦ Clases del subsistema: implementar la funcionalidad del subsistema 7) Colaboraciones ♦ Los clientes se comunican con el subsistema a través de la fachada, que reenvía las peticiones a los objetos del subsistema apropiados y puede realizar también algún trabajo de traducción ♦ Los clientes que usan la fachada no necesitan acceder directamente a los objetos del sistema 13 Facade 8. Ejemplo: Fachada para el acceso a BBDD vía JDBC ♦ Para consultar una base de datos es necesario colaborar con objetos de al menos cinco clases diferentes 1. Connection. Conexión a la BBDD 2. DatabaseMetadata. Acceso a nombres de tablas y campos 3. Statement. Crea la sentencia SQL 4. ResultSet. Recuperar la información en crudo 5. ResultSetMetaData. Accede a los campos del ResultSet ♦ Es más que evidente que se puede simplificar la colaboración Facade 9) Consecuencias ♦ Oculta a los clientes de la complejidad del subsistema y lo hace más fácil de usar ♦ Favorece un acoplamiento débil entre el subsistema y sus clientes, consiguiendo que los cambios de las clases del sistema sean transparentes a los clientes ♦ Facilita la división en capas y reduce dependencias de compilación ♦ No se impide el acceso a las clases del sistema 14 Facade 10) Implementación ♦ Se puede reducir aún más el acoplamiento haciendo que la fachada sea una clase abstracta, de forma que se pueda escoger entre distintas implementaciones del subsistema ♦ Java y las últimas versiones de C++ facilitan la definición de clases privadas a un subsistema. 11) Patrones relacionados ♦ Las fachadas suelen ser Singletons ♦ Indirección (GRASP) ♦ Controlador (GRASP). Los controladores suelen actuar como puntos de entrada (fachadas) de la capa lógica El Camino ♦ Qué es un Patrón de Diseño (PD) Qué no es un PD 15 El camino Bibliotecas ♦ Frameworks ♦ Idioms ♦ Antipatrones ♦ Refactorizaciones Bibliotecas (Toolkits) ♦ También conocidas como librerías y Toolkits ♦ Conjunto de clases diseñado para ser reutilizados: TADs, manejo de periféricos, gráficos, gestión de documentos XML, … Pueden verse como el equivalente en OO de las bibliotecas de subrutinas ♦ Influencia baja/local en el diseño de la aplicación cliente ♦ Una cuestión clave de su diseño reside en conseguir facilidad de uso para el máximo número de escenarios sin complicar la interfaz ni reducir el rendimiento ♦ Bibliotecas vs PP.DD ♦ ¿Son comparables? ♦ ¿Qué contienen? ♦ ¿Cuál es su tamaño medio? 16 El Camino ♦ Bibliotecas Frameworks ♦ Idioms ♦ Antipatrones ♦ Refactorizaciones En el origen de los tiempos ♦ Un framework era un entorno de desarrollo (IDE) ♦ “Componentes” habituales: ♦ Editor de textos ♦ Ayuda integrada ♦ Compilador ♦ Biblioteca de controles visuales ♦ Biblioteca de controles datos ♦ Constituían un marco de trabajo para el desarrollo de aplicaciones ♦ Visual Basic popularizó el concepto en la industria 17 Qué es un framework hoy ♦ Conjunto de clases parcialmente funcional (no es una aplicación) para un dominio de aplicación ♦ Les falta aquello que es propio de la aplicación ♦ Ejemplos: AWT, Swing, Struts, Junit, Compact Framework, James (genuinamente andaluz), … ♦ Gran influencia en el diseño de la aplicación cliente ♦ Frameworks vs PP.DD ♦ ¿Son comparables? ♦ ¿Qué contienen? ♦ ¿Cuál es su tamaño medio? El principio de Hollywood 18 El principio de Hollywood Main() { i1 = new I1(); i2 = new I2(); i1 = i2.m(i1.g()); } Ventajas e inconvenientes ♦ Reutilización de diseño y código ♦ Es difícil encontrar el framework apropiado ♦ Experiencia del diseñador ♦ Es difícil usar más de un framework al mismo del framework tiempo ♦ Costes de producción ♦ Son difíciles de construir y reducidos de aprender a usar 19 El camino ♦ Bibliotecas ♦ Frameworks Idioms ♦ Antipatrones ♦ Refactorizaciones Idioms ♦ Una forma característica de utilizar un LP [Fiadeiro] ♦ Patrón de bajo nivel específico de un LP. Describen soluciones a problemas de implementación de un determinado LP [Buschmann] ♦ gestión de memoria en C++ ♦ Idiom K-R: while (*dest++=*src++) ♦ Para algunos, el Singleton no es un patrón de diseño ♦ Una colección de idioms conforman un estilo ♦ Las diferencias entre PP.DD e idioms son difusas ♦ Algunos PP.DD de hoy serán idioms mañana ♦ Iterator, singleton [Gamma] ♦ interface [Grand] ♦ Los PP.DD son casi independientes del L.P 20 El camino ♦ Bibliotecas ♦ Frameworks ♦ Idioms Antipatrones ♦ Refactorizaciones Antipatrones ♦ Se aprende de los errores más que de los aciertos ♦ Recetas que no deben emplearse ♦ Intentan reutilizar conocimiento de modo similar a los PP.DD ♦ Ejemplos ♦ The blob ♦ Poltergeists ♦ Cut and paste ♦ Spaguetti code ♦ …. ♦ http://www.antipatterns.com/ 21 El camino ♦ Bibliotecas ♦ Frameworks ♦ Idioms ♦ Antipatrones Refactorizaciones Refactorizaciones ♦ M. Fowler las ha popularizado ♦ No siempre se consigue un diseño adecuado ¿qué hacer en tales situaciones? ♦ Nada. En ocasiones es lo más rentable ♦ Refactorizar en las sucesivas operaciones de mantenimiento ♦ La refactorización mantiene invariable la funcionalidad ♦ Están organizadas en catálogos ♦ Muchas de ellas están muy relacionadas con PP.DD ♦ Pull-up. Muy relacionada con el PD Template Method 22 Bibliografía ♦ Se recomienda revisar los siguientes enlaces: ♦ WIKIPEDIA (design patterns, antipatterns, framework, idioms) ♦ Historia de los patrones (http://c2.com/cgi-bin/wiki?HistoryOfPatterns) ♦ Refactorización (http://c2.com/cgi-bin/wiki?HistoryOfPatterns) Cuestiones ♦ Resolver los test de exámenes de convocatorias anteriores 23 Cuestiones !Gracias! ♦ ¿Podemos mejorar esta lección? ♦ Mándanos un email a aruiz@us.es ♦ Visite la web de la asignatura www.lsi.us.es 24