CLASE 10: MÁS PATRONES Universidad Simón Bolívar. Ing. de Software. Prof. Ivette C. Martínez Patrones GRASP Polimorfismo Problema: ¿Cómo manejar las alternativas basadas en el tipo? ¿Cómo crear componentes conectables? Solución: Cuando las alternativas o comportamientos relacionados varian según la clase asigne la responsabilidad para el comportamiento utilizando operaciones polimórficas. Patrones GRASP Polimorfismo Corolario: NO UTILIZAR COMPROBACION DE TIPOS NI LOGICA CONDICIONAL PARA IDENTIFICAR LAS OPERACIONES SEGÚN EL TIPO. Condiciones: El uso de lógica condicional dificulta la mantenibilidad Componentes conectables: Contemplar como sustituir un componente servidor por otro sin que afecte al cliente. Ventajas: Se añaden fácilmente extensiones necesarias para nuevas variaciones. Las nuevas implementaciones se pueden añadir sin afectar a los clientes. Patrones GRASP Polimorfismo Patrones GRASP Fabricación Pura Problema: ¿Qué objetos deberían tener la responsabilidad cuando no se quiere violar los objetivos de Alta cohesión y Bajo Acoplamiento, u otros, pero las soluciones que ofrece el Experto (por ejemplo) no son adecuadas? Solución: Asignar un conjunto de responsabilidades altamente cohesivas a una clase artificial o de conveniencia que no representa un concepto del dominio del problema – algo inventado para soportar alta cohesión, bajo acoplamiento y reutilización - . Patrones GRASP Fabricación Pura Ventajas: Soporta Alta cohesión puesto que las responsabilidades se factorizan en una clase de grano fino que solo se centra en un conjunto muy específico de tareas relacionadas. El potencial para reutilizar podría aumentar debido a la presencia de clases Fabricación Pura de grano fino cuyas responsabilidades tienen aplicación en otras aplicaciones. Patrones GRASP Fabricación Pura Patrones GRASP Indirección Problema: ¿Dónde asignar una responsabilidad para evitar el acoplamiento directo entre dos (o más) cosas? ¿Cómo desacoplar los objetos de manera que se soporte el bajo acoplamiento y el potencial para reutilizar permanezca más alto? Solución: Asignar la responsabilidad a un objeto que medie entre otros componentes o servicios de manera que no se acoplen directamente. Use patrón Adaptador. Ventaja: Disminuye el acoplamiento entre los componentes. Patrones GRASP Indirección Indirección por medio de un adaptador Patrones GRASP Variaciones Protegidas Problema: ¿Cómo diseñar objetos, subsistemas y sistemas de manera que las variaciones o inestabilidades en estos elementos no tengan un impacto no deseable en otros elementos? Solución: Identificar los puntos de variaciones previstas o de inestabilidad asignando responsabilidades para crear una interfaz estable alrededor de ellos. Patrones GRASP Variaciones Protegidas Variaciones Protegidas (VP) es un principio fundamental que motiva la mayoría de los mecanismos y patrones en la programación y el diseño destinados a proporcionar flexibilidad y protección frente a las variaciones. Patrones GRASP Variaciones Protegidas – Mecanismos Básicos: Diseño dirigido por los datos Se protege al sistema del impacto de las variaciones de los datos registrando exactamente la variante. (Parametrización) Búsqueda de servicios Se protegen los clientes de las variaciones en la ubicación de los servicios, utilizando una interfaz estable de la búsqueda del servicio (Jini, UDDI, etc). Patrones GRASP Variaciones Protegidas – Mecanismos Básicos Diseño dirigido por un intérprete Se protege al sistema del impacto de las variaciones lógicas registrando externamente la lógica, leyéndola, y utilizando un intérprete. Diseño reflexivo o de meta-nivel Se protege al sistema del impacto de la lógica o variaciones del código mediante algoritmos reflexivos que utilizan introspección y servicios de metalenguaje (Ej: Method.invoke). Patrones GRASP Variaciones Protegidas – Mecanismos Básicos Principio de sustitución de Liskov (PSL) El software (métodos, clases, ...) que hace referencia a un tipo T (alguna interfaz o superclase abstracta) debería trabajar correctamente, o como se espera, con cualquier implementación o subclase de T . Ejemplo: Public void otrosImpuestos(AdaptadorCalculadordeImpuestos calculador, Venta venta) { List lineasdeImpuestos = calculador.getImpuestos(venta); .... } Patrones GRASP Variaciones Protegidas – Mecanismos Básicos Diseño de ocultación de la estructura (no hable con extraños) Un método solo debería enviar mensajes a los siguientes objetos: El objeto this o self; Un parámetro del método; Un atributo de this; Un elemento de una colección que es un atributo de this; Un objeto creado en el método. Los objetos directos son “conocidos” del cliente, los objetos indirectos son “extraños”. Un cliente debería hablar solo con conocidos y “evitar hablar con extraños”. Patrones GRASP Variaciones Protegidas – Mecanismos Básicos Diseño de ocultación de la estructura (no hable con extraños) Class Registro { private Venta venta; public void metodoAlgoFragil() { dinero cantidad = venta.getPago().getCantidadEntregada(); . . . } } venta.getPago() envía un mensaje a un “conocido” pero en venta.getPago().getCantidadEntregada() el mensaje getCantidadEntregada() se aplica a un Pago “extraño”. Patrones GRASP Variaciones Protegidas Punto de variación: Variaciones en el sistema actual, existente o en los requisitos. Puntos de evolución: Puntos especulativos de variación que podrían aparecer en el futuro, pero que no están están presentes en los requisitos actuales. Ventajas de Variaciones Protegidas: Se añaden fácilmente las extensiones que se necesitan para nuevas variaciones; Se pueden introducir nuevas implementaciones sin afectar a los clientes; Se reduce el acoplamiento; Puede disminuirse el impacto o coste de los cambios. Clasificación de los patrones de diseño GoF Patrones de Creación Para tratar en problema de la inicialización y configuración de objetos Cómo voy a crear mis objetos? Patrones Estructurales Para tratar con el desacoplamiento entre la interfaz y la implementación de las clases y los objetos Cómo las clases y los objetos se ¨componen¨ para formar estructuras más grandes y complejas? Patrones de Comportamiento Para tratar con las interacciones dinámicas entre clases y objetos Cómo manejar flujos de control complejos (comunicaciones)? Catálogo de Patrones de diseño - GoF Propósito Creacional Estructural Clase • Factory Method • Adapter Objeto • Abstract Factory • Builder • Prototype • Singleton • • • • • • • Alcance Adapter Bridge Composite Decorator Facade Flyweight Proxy Comportamental • Interpreter • • • • • • • • • Chain of Responsibility Command Iterator Mediator Momento Observer State Strategy Vistor Beneficios de los patrones de diseño Inspiración Los patrones no proveen soluciones, inspiran soluciones Los patrones capturan explícitamente conocimientos de expertos y tradeoffs de diseño, y hacen que esta experticia esté disponible ampliamente. Facilitan la transición a las tecnologías orientadas a objetos. Beneficios de los patrones de diseño Los patrones mejoran la comunicación entre los desarrolladores Los nombres de los patrones forman el vocabulario Ayudan a documentar la arquitectura de un sistema Mejoran la comprensión de los sistemas Los patrones de diseño habilitan la reutilización en gran escala de las arquitecturas de software Debilidades de los patrones de software Los patrones no conducen a una reutilización del código directa. Los equipos pueden sufrir de sobrecarga de patrones. La integración de patrones en un proceso de desarrollo de software es una actividad de gran participación humana.