Diseño de patrones

Preview:

Citation preview

CLASE 9: DISEÑO CON PATRONES

Universidad Simón Bolívar. Ing. de Software. Prof. Ivette C. Martínez

Diseño de Objetos

  Identificar requerimientos, crear un modelo del dominio, agregar métodos a las clases de software, definir mensajes para cumplir los requerimientos…

  Simple?!?  Qué métodos pertenecen a cada clase?  Como asignamos responsabilidades a las clases

  La herramienta crítica de diseño de software es una mente bien educada en los principios de diseño y en patrones de diseño

Diseño de Objetos: entradas

  PDV entradas al proyecto:  Texto del Caso de Uso Procesar Venta

 Definir el comportamiento  Diagrama de Secuencia del Sistema

 Identificar los mensajes del sistema  Los contratos de las operaciones

 Establecer los eventos a diseñar y detallar las post-condiciones a satisfacer

Diseño de Objetos: entradas

  PDV entradas al proyecto:  Especificaciones adicionales

 Define objetivos no-funcionales

 Glosario  Formato de los datos, datos relacionados con la interfaz de

usuario y la base de datos.  Modelo del Dominio

 Esquema inicial de los objetos de software en la capa del dominio de la arquitectura del software

Diseño Dirigido por Responsabilidades

  Una responsabilidad es un contrato u obligación de una clase.   Qué debe “conocer” una clase? [responsabilidad de

conocimiento]   Datos encapsulados privados   Objetos relacionados   Cosas que puede derivar o calcular

  Qué debe “hacer” una clase? [responsabilidad de acción]   Realizar una acción (crear un objeto, realizar un cálculo)   Iniciar una acción en otros objetos   Controlar/coordinar acciones en otros objetos

  Las responsabilidades se le asignan a los objetos durante el diseño de objetos

Ejemplos de Responsabilidades

  “Una venta es responsable de crear una VentaLineaDeProducto” (hacer)

  “Una venta es responsable de conoces su total” (conocer)   Las responsabilidades de conocimiento están relacionadas con

los atributos y las asociaciones en el modelo del dominio.   Las responsabilidades de acción pueden ser expresadas en

diferentes granularidades.   Las responsabilidades de acción son implementadas mediante

métodos.

Modelo del Dominio y Responsabilidades

  El modelo del Dominio ilustra los atributos y las asociaciones => inspira las responsabilidades de “conocimiento”

  Los métodos cumplen las responsabilidades  Solo (dentro del objeto mismo)  Mediante la colaboración con otros objetos y métodos

Patrones de Aprendizaje

  Las soluciones exitosas en muchas áreas del esfuerzo humano tienen sus raices en patrones.

 Un objetivo importante de la educación es transmitir patrones de aprendizaje de generación en generación.

  Ejemplos: Patrones usados para aprender ajedrez   Aprende a desarrollar buen software es parecido

a aprender a jugar bien ajedrez.

Qué es un patrón ?

•  Cada Patrón describe un problema que ocurre una y otra vez en nuestro ambiente, y luego describe el núcleo de la solución a ese problema, de forma tal que esa solución puede ser usada un millón de veces, sin hacerlo de la misma manera dos veces.

C. Alexander, “The Timeless Way of Building”, 1979

Visión de patrones de Alexander

  Regla de tres partes que expresa una relación entre cierto contexto, un problema y una solución.

  Elemento del mundo – una relación entre  un contexto  un sistema de fuerzas que ocurren repetidamente

en el contexto  una configuración espacial que permite que las

fuerzas se resuelvan ellas mismas

Visión de patrones de Alexander

  Elemento de lenguaje ��� – una instrucción  Describe como la configuración espacial puede se

usada repetitivamente.  para resolver el sistema de fuerzas dado  en cualquier lugar en que el contexto la hace

relevante   La dualidad “objeto – proceso”

 Un objeto que ocurre en el mundo  Un proceso (regla) que genera ese objeto

Por qué usar patrones ?

 “Los patrones te ayudan a aprender de los éxitos de otros en lugar de aprender de tus errores”

Mark Johnson (citado por B. Eckel)

Por qué usar patrones ?

 Una capa de abstracción adicional  Separar las cosas que cambian de las cosas que

permanecen iguales  Extraer los factores comunes entre una familia de

problemas similares  Una forma inteligente y profunda de resolver

una clase particular de problemas  Soluciones más generales y flexibles

Patrones de diseño

  Los patrones de diseño representan soluciones a problemas que surgen cuando se desarrolla software en un contexto particular.  Patrones = par Problema/Solución dentro de

un Contexto

Patrones de Diseño

  Capturan la estructura estática y dinámica, y la colaboración entre los participantes claves del diseño del software  participante clave – abstracción principal que ocurre

en un problema de diseño  Útil para articular el cómo y el por qué resolver las

fuerzas no funcionales.

  Facilita la reutilización de arquitecturas y diseños de software exitoso

Ejemplo: Vistas de datos, problema de consistencia

El patrón Observer

  Propósito  Definir una dependencia de uno-a-muchos entre objetos

de manera que cuando un objeto cambia de estado, todas sus dependencias son notificadas y actualizadas automáticamente.

  Fuerzas  Puede haber muchos observadores  Cada observador puede reaccionar de forma diferente

a la misma notificación  La fuente de datos (sujeto) debe estar tan desacoplada

como sea posible del observador.

Estructura del patrón Observer

Colaboración en el patrón Observer

Qué lo hace un patrón?

  Un patrón debe:  Resolver un problema, i.e., debe ser útil  Tener un contexto, i.e., describir cuando la solución puede

ser utilizada  Reutilizarse, i.e., debe ser relevante en otras situaciones  Enseñar, i.e, debe proporcionar suficiente información

para la elaboración de la solución  Tener un nombre, para referirse a él de forma

consistente.

Formato GoF de un Patrón de Diseño

Nombre del patrón y clasificación Propósito qué hace el patrón También conocido como

otros nombres del patrón (opcional) Motivación el problema de diseño Aplicabilidad situaciones donde el patrón puede

ser aplicado

Formato GoF de un Patrón de Diseño

Estructura Una representación gráfica de las clases dentro del patrón

Participantes Las clases y objetos participantes y sus responsabilidades

Colaboraciones De los participantes para llevar a cabo sus responsabilidades

Consecuencias trade-offs, preocupaciones, …

Formato GoF de un Patrón de Diseño

Implementación Hints, Técnicas

Código de Ejemplo Fragmento de código que muestra una implementación posible

Usos conocidos Patrones que se encuentran en sistemas reales

Patrones relacionados Patrones estrechamente relacionados

Diseño con patrones

 Patrones de diseño GRASP  Patrones de diseño GoF  Enterprise patterns

Diseño con patrones

 Patrones de diseño GRASP  General Responsability Assignment Software

Patterns.  Patrones de Principios Generales para Asignar

Responsabilidades  “Describen los principios fundamentales de diseño

de objetos y la asignación de responsabilidades, expresados como patrones”. Craig Larman.

 Constituyen la base del CÓMO se diseñará el sistema.

 Se aplican en los primeros momentos del diseño

Patrones GRASP

  Responsabilidades  UML define una responsabilidad como “un contrato u

obligación de un clasificador”.  Las responsabilidades están relacionadas con las obligaciones

de un objeto en cuanto a su comportamiento.  Básicamente, estas responsabilidades son de los siguientes

dos tipos:  Conocer:

  Conocer los datos privados encapsulados;   Conocer los objetos relacionados   Conocer las cosas que puede derivar o calcular.

 Hacer:   Hacer algo él mismo, como crear un objeto o hacer un cálculo;   Iniciar una acción en otros objetos;   Controlar y coordinar actividades en otros objetos.

Patrones GRASP

  Patrones de diseño GRASP  Experto en información  Creador  Alta cohesión  Bajo Acoplamiento  Controlador  Polimorfismo  Fabricación Pura   Indirección  Variaciones Protegidas

Patrones GRASP

 Experto en información  Problema:

¿ Cuál es el principio general para asignar responsabilidades a los objetos ?

 Solución : Asignar una responsabilidad al experto en información – la clase que tiene la información necesaria para realizar la responsabilidad. Un Experto es una clase que tiene toda la información necesaria para implementar una responsabilidad.

 Ventajas:  Encapsulamiento de la información;  Distribución del comportamiento del manejo de la

información

Patrones GRASP

  Experto en información

Patrones GRASP

  Creador  Problema:

¿Quién debería ser el responsable de la creación de una nueva instancia de alguna clase?

 Solución: B es un Creador de A si se asigna a la clase B la responsabilidad de crear una instancia de la clase A y si se cumple uno o más de los casos siguientes:  B agrega objetos de A;  B contiene objetos de A;  B registra instancias de objetos de A;  B utiliza más estrechamente objetos de A;  B tiene los datos de inicialización que se pasarán a un objeto de A

cuando sea creado( por lo tanto, B es un Experto con respecto a la creación de A)

Patrones GRASP

  Creador  El patrón Creador guía la asignación de responsabilidades

relacionadas con la creación de objetos (una tarea muy común). La intención básica del patrón es encontrar un creador que necesite conectarse al objeto creado en alguna situación.

 Ventajas:  Bajo acoplamiento logrando mayor mantenibilidad y

reutilización.  Desventajas:

 Puede ser muy compleja la operación de creación de instancia. Se puede aplicar el patrón de diseño Factory.

Patrones GRASP

  Creador

Patrones GRASP

 Bajo Acoplamiento  Problema:

¿Cómo soportar bajas dependencias, bajo impacto del cambio e incremento de la reutilización?

 Solución: Asignar una responsabilidad de manera que el acoplamiento permanezca bajo.

 El acoplamiento es una medida de la fuerza con que un elemento está conectado a, tiene conocimiento de, confía en, otros elementos.

Un elemento con bajo (o débil) acoplamiento no depende demasiado de otros elementos.

Patrones GRASP

 Bajo Acoplamiento  El patrón Bajo Acoplamiento es un principio a tener

en mente en todas las decisiones de diseño. Es un principio evaluativo que aplica un diseñador mientras evalúa todas las decisiones de diseño.

 El Bajo Acoplamiento soporta clases más independientes

 Ventajas:  No afectan los cambios en otros componentes;  Fácil de entender de manera aislada;  Conveniente para reutilizar

Patrones GRASP

  Bajo Acoplamiento  ¿Qué diseño, basado en la asignación de

responsabilidades, soporta Bajo Acoplamiento?

Patrones GRASP

  Bajo Acoplamiento  ¿Qué diseño, basado en la asignación de

responsabilidades, soporta Bajo Acoplamiento?  Desde el punto de vista puramente del acoplamiento, es

preferible el segundo diseño porque mantiene el acoplamiento global más bajo.

 Este es un ejemplo en el que dos patrones- Bajo Acoplamiento y Creador – podrían sugerir soluciones diferentes.

Patrones GRASP

 Alta cohesion  Problema:

¿Cómo mantener la complejidad manejable?  Solución:

Asignar una responsabilidad de manera que la cohesión permanezca alta.

 En cuanto al diseño de objetos, la cohesión (cohesión funcional) es una medida de la fuerza con la que se relacionan y del grado de focalización de las responsabilidades de un elemento.

Patrones GRASP

 Alta cohesion

 Una clase con baja cohesión hace muchas cosas no relacionadas, o hace demasiado trabajo:  Clases difíciles de entender;  Difíciles de reutilizar;  Difíciles de mantener;  Delicadas, constantemente afectadas por los

cambios.

Patrones GRASP

 Alta cohesion  Como regla empírica, una clase con alta cohesión

tiene:  Un número relativamente pequeño de métodos, con

funcionalidad altamente relacionada,  No realiza mucho trabajo.  Colabora con otros objetos para compartir el esfuerzo si

la tarea es extensa.

 No es conveniente recargar el trabajo o incluir funcionalidad en la clase que responde a los eventos del sistema.

Patrones GRASP

 Alta cohesion  Ventajas:

 Incrementa la claridad y facilita la comprensión del diseño;

 Simplifica el mantenimiento y las mejoras;  Soporta a menudo bajo acoplamiento  Incrementa la reutilización

Patrones GRASP

 Controlador  Problema:

¿Quién debe ser el responsable de gestionar un evento de entrada del sistema?

 Solución: Asignar la responsabilidad de recibir o manejar un mensaje de evento del sistema a una clase que representa una de las siguientes operaciones:  Representa el sistema global, dispositivo o subsistema (Controlador

de Fachada);  Representa un escenario de caso de uso en el que tiene lugar el

evento del sistema (controlador de Sesión de Caso de Uso).   Utilizar la misma clase controlador para todos los eventos del sistema

en el mismo escenario de caso de uso;   Una sesión es una instancia de una conversación con un actor

Patrones GRASP

  Controlador  Las clases “ventana”, “applet”, “vista”, etc., no están en la

lista debido a que tales clases no deben abordar las tareas asociadas con los eventos del sistema, sino que, reciben estos eventos y los delegan a un controlador.

 Evento del sistema de entrada   Es un evento generado por un actor externo. Se asocian con

operaciones del sistema – operaciones del sistema como respuesta a los eventos del sistema -, tal como se relacionan los mensajes y los métodos.

 Un Controlador   Es un objeto que no pertenece a la interfaz de usuario, responsable

de recibir o manejar un evento del sistema. Un Controlador define los métodos para las operaciones del sistema.

Patrones GRASP

Patrones GRASP

 Controlador  Normalmente un controlador delega en otros

objetos el trabajo que se necesita hacer; coordina o controla la actividad. No realiza mucho trabajo por sí mismo.

 Tipos de controladores:  Controlador de Fachada:

 Representa al sistema global, dispositivo o subsistema.

 Controlador de casos de uso:  Construcción artificial para dar soporte al sistema.

Se utilizan cuando los Controladores de Fachada conduce a diseños con baja cohesión o alto acoplamiento.

Patrones GRASP

 Controlador  Ventajas:

 Aumenta el potencial para reutilizar las interfaces;  Razonamiento sobre el estado (secuencia de pasos) de los

casos de uso.

Patrones GRASP

 Controlador