View
1
Download
0
Category
Preview:
Citation preview
1
Departamento deDepartamento deLenguajes y Sistemas InformáticosLenguajes y Sistemas Informáticos
escuela técnica superiorde ingeniería informática
Ingeniería del Software II
Tema 3: Patrones de Asignación de
Responsabilidades (GRASP)
Índice
♦ Introducción♦ Experto en Información♦ Creador♦ Alta Cohesión♦ Bajo Acoplamiento♦ Fabricación Pura♦ Indirección♦ Variaciones Protegidas
2
Índice
♦ Introducción♦ Experto en Información♦ Creador♦ Alta Cohesion♦ Bajo Acoplamiento♦ Fabricación Pura♦ Indirección♦ Variaciones Protegidas
Introducción
♦ Principio (RAE)
♦ Cada una de las primeras proposiciones o verdades fundamentales por donde se empiezan a estudiar las ciencias o las artes
♦ Cualquier disciplina con cierto grado de madurez cuenta con un conjunto de principios
♦ (E ) Indique todos los principios relacionados con el DOO que conozca
♦ (E ) Explique claramente los principios identificados.
♦ ¿Es posible comunicar los principios de manera sistemática?
3
Introducción
♦ Durante mucho tiempo estos principios se han transmitido independientemente
♦ ¿Es posible transmitirlos de una manera homogénea, compacta que permita su aplicación sistemática?
♦ Según C. Larman Sí. El ha propuesto un conjunto de principios a los que ha denominado GRASP (General Responsability Assignment Software Pattern)
♦ El diseño de aplicaciones software es una de las actividades en las que aún predomina el arte sobre el método.
Introducción
♦ GRASP (pillar, comprender,…) Larman la eligió para sugerir la importancia de comprender estos principios como paso clave para diseñar con éxito
♦ GRASP: describen los principios fundamentales del DOO y la asignación de responsabilidades expresados como patrones
4
Introducción
♦ Descripción de un GRASP♦ Solución
♦ Problema
♦ Ejemplo
♦ Discusión
♦ Contraindicaciones
♦ Beneficios
♦ Patrones relacionados
♦ También conocido como
Índice
♦ Introducción♦ Experto en Información♦ Creador♦ Alta Cohesion♦ Bajo Acoplamiento♦ Fabricación Pura♦ Indirección♦ Variaciones Protegidas
5
Experto en Información
Modelo del dominio que usaremos en los ejemplos
Experto en Información
1) Problema: ¿un principio general del DOO para la asignación de responsabilidades a las clases?♦ Una buena asignación facilita el mantenimiento, la eficiencia, la
comprensión, …
2) Solución: Asigne una responsabilidad al experto en información (la clase que tiene la información necesaria para llevar a cabo la responsabilidad)
3) Ejemplo: 1) ¿quién debe ser el
responsable de conocer el total de una venta?
Sale
time
SalesLineItem
quantity
ProductDescription
descriptionpriceitemID
Described-by*
Contains
1..*
1
1
6
Experto en Información
♦ La aplicación de este o cualquier otro GRASP permite refinar el diseño
Sale
time...
getTotal()
:Salet = getTotal
New method
Sale
time...
getTotal()
SalesLineItem
quantity
getSubtotal()New method
1 *: st = getSubtotal: Salet = getTotal lineItems[ i ] : SalesLineItem
this notation will imply we are iterating over all elements of a collection
Experto en Información
♦ ¿Qué otro diseño se podría haber propuesto?
Sale
time...
getTotal()
SalesLineItem
quantity
getSubtotal()
ProductDescription
descriptionpriceitemID
getPrice()New method
:ProductDescription
1.1: p := getPrice()
1 *: st = getSubtotal: Salet = getTotal lineItems[ i ] :SalesLineItem
♦ En este caso se ha aplicado en tres ocasiones
7
Experto en Información
4) Discusión:
♦ Expertos de información parcial
♦ Suele conducir a diseños donde los objetos se hacen responsables de las mismas operaciones de los objetos inanimados a los que representan
♦ Analogía en el mundo real. Normalmente se otorgan responsabilidades a los individuos que pueden disponer de toda la información necesaria para llevar a cabo una tarea♦ ¿quién debería ser el responsable de realizar el
informe de cuentas de una empresa?
Experto en Información
5) Contraindicaciones♦ En ocasiones su aplicación puede aumentar
el acoplamiento y reducir la cohesión♦ ¿quién debería de almacenar una Venta en la
BBDD?– Siguiendo el EI se decidiría por la misma clase Venta. Esto podría
llevar a una situación en que cada clase tenga la responsabilidad de acceder a la BBDD (vía JDBC p.e.)» La clase no está centrada únicamente en la lógica» Todas las clases estarían acopladas con las diferentes
clases de acceso a BBDD» Probablemente se duplicaría mucho código
♦ ¿quién debería ser el responsable de autenticar?
8
Experto en Información
6) Beneficios♦ Se mantiene el encapsulamiento de la
información � menor acoplamiento♦ ¿Qué pasaría si la clase Venta averiguara el total
preguntando directamente a todos los Productos involucrados?
♦ Se distribuye el comportamiento entre las clases que contienen la información requerida � clases más ligeras � mayor cohesión
7) Patrones relacionados♦ Bajo acoplamiento y alta cohesión
8) También conocido como♦ Colocar las responsabilidades con los datos♦ Eso que conoces, hazlo♦ Hacerlo yo mismo♦ Colocar los servicios con los atributos que trabaja
Índice
♦ Introducción♦ Experto en Información♦ Creador♦ Alta Cohesion♦ Bajo Acoplamiento♦ Fabricación Pura♦ Indirección♦ Variaciones Protegidas
9
Creador
1) Problema: ¿Quién debe ser el responsable de la creación de una nueva instancia de una clase?
2) Solución: Asigne a la clase B la responsabilidad de crear una instancia de la clase A si se da alguna de las siguientes circunstancias:
1) B agrega (compartidamente o no) a A
2) B tiene los datos de inicialización de A
3) B registra a A
4) B utiliza ‘estrechamente’ a A
3) Ejemplo♦ ¿Quién debería ser responsable de la creación de una
instancia de LineaDeVenta?♦ Según este patrón, debería ser Venta
Creador
♦ ¿Qué otro diseño se podría haber propuesto?
♦ Esto nos llevaría a una situación del tipo
: Register : Sale
makeLineItem(quantity): SalesLineItemcreate(quantity)
10
Creador
4) Discusión:
♦ La intención básica es encontrar un creador que necesite dialogar con el objeto creado en algún momento
♦ Se puede ver como un caso particular del Experto (cuando B tiene los datos de inicialización de A). ♦ No es tan evidente, con frecuencia hay un objeto
principal que construye las partes y se las pasa al contenedor
Creador
5) Contraindicaciones♦ En ocasiones la creación posee una complejidad
significativa resultando más conveniente delegar esta responsabilidad en una clase diseñada a tal efecto
6) Beneficios♦ Favorece el bajo acoplamiento
♦ ¿Qué pasaría si la clase Registro creara las LíneasDeVenta? (“No hables con extraños”)
7) Patrones relacionados♦ Bajo acoplamiento y alta cohesión♦ Fábricas
11
Índice
♦ Introducción♦ Experto en Información♦ Creador♦ Bajo Acoplamiento♦ Alta Cohesion♦ Fabricación Pura♦ Indirección♦ Variaciones Protegidas
Bajo Acoplamiento (evaluativo)
Acoplamiento. Es una medida de la fuerza con que un elemento está conectado a, tiene conocimiento de, confía en, otros elementos
Un elemento fuertemente acoplado♦ Se resiente de los cambios en los elementos relacionados♦ Son difíciles de entender de manera aislada♦ Difíciles de reutilizar (requiere las clases ‘acopladas’)
1) Problema: ¿Cómo evitar estos inconvenientes?2) Solución: Asigne responsabilidades de manera que el
acoplamiento permanezca bajo♦ ¿Es una solución?♦ Principio evaluativo: lo aplica un diseñador cada vez que tiene
que evaluar una decisión de diseño
12
Bajo Acoplamiento
3) Ejemplo: ¿Qué clase debería ser responsable de crear una instancia
de Payment y asociarla con una instancia de Sale?
Bajo Acoplamiento
♦ Puesto que Register registra el pago (Payment) en el dominio del mundo real, el GRASP Creador sugiere ...
♦ Register está acoplado con Payment y con Sale. Sale también está acoplado con Payment.
♦ ¿Cómo podríamos reducir el acoplamiento?
13
Bajo Acoplamiento
4) Discusión: ♦ En la práctica, el nivel de acoplamiento no puede
evaluarse si tener en cuenta otros GRASP como la cohesión o el experto
♦ Una subclase está fuertemente acoplada a su superclase. Esta decisión deber ser estudiada cuidadosamente
♦ ¿Qué inconvenientes encuentra en hacer que todas las clases que requieren persistencia deriven de una superclase PersistentObject?♦ ¿Se resiente de los cambios en los elementos relacionados?
♦ ¿Es difícil de entender de manera aislada?
♦ ¿requiere de las clases acopladas para poder ser reutilizada?
Bajo Acoplamiento
4) Discusión: ♦ No existe medida que indique si el acoplamiento es
demasiado alto � lo que debe tener en cuenta el diseñador es el impacto que provoca una decisión en el grado de acoplamiento
♦ ¿Qué ocurriría si intentáramos reducir el máximo el acoplamiento?♦ … Antipatrón BLOB
14
Bajo Acoplamiento
5) Contraindicaciones♦ Escoger las batallas
♦ El alto acoplamiento no es inherentemente malo, lo es sólo con elementos “inestables” (en su contrato sintáctico, semántico, ... O su simple presencia)– Una aplicación J2EE puede acoplarse con seguridad con
la biblioteca java.util.*
♦ No se debe invertir esfuerzos en reducir el acoplamiento cuando no hay motivos reales para hacerlo (Generalizitis)– Si se preveen diferentes métodos de pago puede merecer
la pena desacoplar Register de Payment y utilizar el PD Strategy para los diferentes pagos
Bajo Acoplamiento
6) Beneficios♦ Se amortigua el impacto de los cambios
en los elementos inestables♦ Se facilita el entendimiento♦ Facilita la reutilización
7) Antecedentes♦ Acoplamiento y cohesión son principios
realmente fundamentales que fueron propuestos por Larry Constantine a finales de los 60 (40 años…)
8) Patrones relacionados♦ Alta Cohesión
15
Índice
♦ Introducción♦ Experto en Información♦ Creador♦ Bajo Acoplamiento♦ Alta Cohesion♦ Fabricación Pura♦ Indirección♦ Variaciones Protegidas
Alta Cohesión (evaluativo)
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.
Un elemento con baja cohesión tiene muchas responsabilidades:
♦ Difíciles de entender, reutilizar y mantener♦ Delicadas, frágiles (muchas probabilidades de verse
afectada en los cambios)
1) Problema: ¿Cómo mantener manejable la complejidad?
2) Solución: Asigne responsabilidades de manera que la cohesión permanezca alta♦ ¿Es una solución?♦ También es un principio evaluativo
16
Alta Cohesión
3) Ejemplo: ¿Qué clase debería ser responsable de crear una instancia
de Payment y asociarla con una instancia de Sale?
Alta Cohesión
♦ Puesto que Register registra el pago (CashPayment) en el dominio del mundo real, el GRASP Creador sugiere ...
: Register : Sale
addPayment( p )
p : Paymentcreate()makePayment()
♦ ¿Qué pasaría si Register siguiera haciéndose responsable de las operaciones de sistema?
♦ Iría perdiendo cohesión progresivamente
♦ ¿Cómo se podría conseguir una mejor cohesión?
: Register : Sale
makePayment() : Paymentcreate()
makePayment()
17
Alta Cohesión
4) Discusión: ♦ No es fácil cuantificar el grado de cohesión de un elemento. Para
G. Booch, un elemento es altamente cohesivo si: ♦ todos sus elementos trabajan juntos para proporcionar algún
comportamiento bien delimitado♦ Escenarios que ilustran diferentes grados de cohesión funcional
♦ Muy baja cohesión. Una clase responsable de muchas cosas en áreas funcionales diferentes (Clase InterfazBDR-RPC)
♦ Baja cohesión. Una clase responsable de una tarea compleja de un área funcional (Clase InterfazBDR). (No es el caso de la fachada JDBC)
♦ Alta cohesión. Una clase con responsabilidad “moderada” en un área funcional que colabora con otras para llevar a cabo las tareas (La fachada de JDBC)
♦ Moderada cohesión. Una clase tiene responsabilidades “ligeras” y únicas en unas pocas áreas diferentes que están lógicamente relacionadas con el concepto de la clase, pero la relación entreellas no es fuerte
Alta Cohesión
4) Discusión: ♦ Una clase altamente cohesiva suele:
♦ tener un número relativamente pequeño de métodos, con funcionalidad altamente relacionada
♦ no realiza mucho trabajo
♦ Colabora con otras clases para compartir el esfuerzo
♦ Una de las posibles analogías en el mundo real
♦ Un trabajador con muchas responsabilidades (que no mucha responsabilidad) suele ser poco efectivo
18
Alta Cohesión
4) Discusión:
♦ Diseño modular
♦ Cohesión y acoplamiento son principios conocidos desde hace mucho. A partir de ellos se define el principio de modularidad♦ Un diseño es modular si se descompone en un
conjunto de módulos cohesivos y débilmente acoplados
♦ Cohesión y acoplamiento: el ying y el yang de la IS♦ Una mala cohesión causa, normalmente, un mal
acoplamiento
♦ La filosofía china los considera como fuerzas opuestas pero complementarias
♦ Un buen diseño siempre logra un buen equilibrio entre cohesión y acoplamiento
Alta Cohesión
5)Contraindicaciones♦ Existen pocas situaciones que
justifiquen la aceptación de una baja cohesión (Fachadas)
6) Beneficios♦ Se incrementa claridad y comprensión♦ Se simplifica el mantenimiento♦ Favorece el bajo acoplamiento♦ Facilita la reutilización
7) Patrones relacionados♦ Bajo acoplamiento
19
Índice
♦ Introducción♦ Experto en Información♦ Creador♦ Bajo Acoplamiento♦ Alta Cohesión♦ Fabricación Pura♦ Indirección♦ Variaciones Protegidas
Fabricación Pura
1) Problema: ¿Cómo proceder cuando las soluciones encontradas comprometen la cohesión y el acoplamiento?
2) Solución: Asigne un conjunto cohesivo de responsabilidades a una clase artificial (no representa ningún concepto del dominio del problema)♦ Tal clase es una fabricación de la imaginación e idealmente
debería ser pura (diseñada exclusivamente para dicho fin)
3) Ejemplo♦ Este problema suele darse cuando se sigue un enfoque
seamless desde el análisis hasta la implementación
♦ Suponga que se necesita dar persistencia a la clase Sale en una BDR. Según el EI se puede justificar la asignación de dicha responsabilidad a la clase Sale. ¿Implicaciones?♦ Las nuevas responsabilidades reducirían la cohesión
♦ Aumenta el acoplamiento con elementos que no son del dominio (interfaces JDBC p.e.)
♦ Probablemente se duplique código
20
Fabricación Pura
3) Ejemplo: ♦ Una solución razonable puede ser definir una clase
(PersistentStore) cuya única responsabilidad es almacenar objetos de cualquier tipo. Esta clase es una invención de la imaginación. Ahora, la clase Sale♦ Tiene mayor cohesión y mejor acoplamiento
♦ La clase PersistentStore es relativamente cohesiva
♦ La clase PersistentStore tiene mayor probabilidad de ser reutilizada
4) Discusión: ♦ Por regla general, además de las clases definidas a partir del
modelo del dominio, los diseñadores definen clases por conveniencia (se inspiran en una descomposición de comportamiento en lugar de una descomposición de la representación)
Fabricación Pura
5) Contraindicaciones♦ El uso desmedido de fabricaciones puras puede
derivar en clases “función” o “algoritmo” (sólo tienen un método). ♦ Un indicio de esta situación es cuando la mayoría
de objetos tienen pasar casi toda su información a otros objetos para poder realizar las responsabilidades
6) Beneficios♦ Las fabricaciones puras suelen ser muy
cohesivas y reutilizables7) Patrones relacionados
♦ Alta Cohesión y Bajo Acoplamiento♦ Suelen asumir las responsabilidades en base al EI♦ Muchos patrones GoF usan fabricaciones puras:
adaptador, estrategia, comando, …
21
Índice
♦ Introducción♦ Experto en Información♦ Creador♦ Bajo Acoplamiento♦ Alta Cohesion♦ Fabricación Pura♦ Indirección♦ Variaciones Protegidas
Indirección
1) Problema: ¿Dónde asignar responsabilidades para evitar/reducir el acoplamiento directo entre elementos y mejorar la reutilización?
2) Solución: Asigne la responsabilidad a un objeto que medie entre los elementos. Ahora el acoplamiento es indirecto
3) Ejemplo♦ En el ejemplo de la “Fabricación Pura”, la clase PersistenObject
desacopla Sale de las clases que gestionan la BBDD
♦ Adaptación del cálculo de impuestos (Sale es ahora más reutilizable)
: Sale :TaxMasterAdapter
taxes = getTaxes( s )
t = getTotal
the adapter acts as a level of indirection to external systems
TCP socket communication
xxx...
«actor»:TaxMasterSystem. . .
22
Indirección
4) Discusión: ♦ “La mayoría de los problemas en diseño se resuelven mediante
indirección”
♦ La mayoría de los problemas en ejecución se pueden resolver eliminando alguna indirección
5) Beneficios♦ Disminuye el acoplamiento
6) Patrones relacionados♦ Variaciones protegidas
♦ Bajo Acoplamiento
♦ Muchos patrones GoF usan indirección: adaptador, fachada, puente, observador, mediador
Índice
♦ Introducción♦ Experto en Información♦ Creador♦ Bajo Acoplamiento♦ Alta Cohesion♦ Fabricación Pura♦ Indirección♦ Variaciones Protegidas
23
Variaciones Protegidas
♦ Un punto de variación representa a una variación contemplada en la especificación de requisitos o documento de entrada del diseño. Por ejemplo:♦ “el formato de compresión podrá ser PCX, GIF, BMP,
TIFF y JPEG”
♦ Un punto de evolución es un punto de variación sobre cuya existencia se conjetura (especula). Por ejemplo, a partir del requisito anterior, el diseñador puede especular sobre la evolución del sistema y tomar la decisión de protegerse sobre la variación del formato de compresión para dar cabida en el futuro a nuevos formatos (p.e a HSI-JPEG). El diseñador experto suele se reconoce, entre otros rasgos, por su acierto a la hora de definir estos puntos.
Variaciones Protegidas
1) Problema: Cómo diseñar un elemento de modo que sus variaciones o inestabilidades afecte lo menos posible en otros elementos
2) Solución: Identifique los puntos de variaciones previstas o de inestabilidad y asigne responsabilidades para crear una interfaz estable alrededor de ellos
3) Ejemplo: El mecanismo de autenticación o la política de fallos en la aplicación desarrollada en el laboratorio son puntos de variación ♦ ¿Cómo se han resuelto estos puntos de variación?
24
Variaciones Protegidas
Variaciones protegidas
4) Discusión: ♦ Este patrón fue propuesto en 1996 por A. Cockburn, aunque
lleva más de 30 años bajo otros nombres
♦ Mecanismos motivados por VP♦ Básicos: encapsulación, interfaces, polimorfismo, indirección, …
♦ Diseños dirigidos por datos: (amplia familia de técnicas) Ficheros de configuración, hojas de estilo, ficheros de propiedades, … Protegen de la variación de los parámetros involucrados– Búsqueda de servicios: JNDI, TraderService, UDDI
– A partir de ficheros de configuración
♦ Ocultación de la estructura. Proteger de los cambios en la estructura aplicando la regla “No hables con extraños” (Ley de Demeter)– Los objetos directos son “conocidos”, los indirectos son “extraños”
Dinero cantidad= venta.getPago().getCantidadEntregada():
Dinero cantidad= venta.getCantidadEntregadaEnPago();
25
Variaciones protegidas
4) Discusión: ♦ Principio de sustitución de Liskov
♦ Formaliza el principio de protección contra las variaciones en implementaciones diferentes de una interfaz, o una subclase que extiende a una superclase– El fragmento de código que hace referencia a un tipo T debería trabajar correctamente con
cualquier implementación o subclase de T que lo sustituya
Variaciones protegidas
public class LiskovTest{
public void run(){
Rectangle r= new Rectangle();test(r);Square s= new Square();test(s);
}void test(Rectangle r){
r.setHeight(5);r.setWidth(4);if (r.getHeight()*r.getWidth()==20)
System.out.println(“Test was ok”);else
System.out.println(“Test wasn’t ok”);}
}
public class Rectangle{
protected float height, width;public void setHeight (float h) {
height= h;}public void setWidth (float w){
width= w;}public float getHeight(){
return height;}public float getWidth(){
return width;}
}public class Square extends Rectangle{……}
26
Variaciones protegidas
public class Square extends Rectangle{
public void setHeight (float h){
super.setHeight(h);super.setWidth(h);
}public void setWidth (float w){
super.setHeight(w);super.setWidth(w);
}}
La semántica intuitiva no coincide con
la real
Variaciones protegidas
5) Contraindicaciones♦ El coste de diseñar la protección de un punto de variación o de
evolución es superior que rehacer un diseño simple♦ inexpertos � diseños frágiles
♦ intermedios � diseños excesivamente flexibles
♦ Expertos � diseño simple y frágil en el que existe un equilibrio entre el coste de cambio y su probabilidad
6) Beneficios♦ Facilita la adición de las extensiones asociadas a las
variaciones
♦ Se reduce el impacto y coste de los cambios (se reduce el acoplamiento)
7) Patrones relacionados♦ La mayoría de los principios y patrones de diseño son mecanismos VP
♦ Puntos de variación y evolución también se conocen como puntos calientes
27
Variaciones protegidas
8) También conocido como♦ Principio de ocultación de la información
♦ “On the criteria to be used in decomposing systems into modules” (Parnas, 1972)– … proponemos en lugar de eso que uno comience con una lista de decisiones de
diseño difíciles o con altas probabilidades de cambio. Cada módulo se diseña entonces para ocultar dichas decisiones a otros …
♦ Principio abierto-cerrado (Meyer, 1988)
♦ Los módulos deberían ser tanto abiertos como cerrados. Abiertos para ser extendidos y cerrados para ser usados– ¿Se preserva este principio con el PD Estrategia?
!Gracias!
♦ ¿Podemos mejorar esta lección?♦ Mándanos un email a aruiz@us.es
♦ Visite la web de la asignatura www.lsi.us.es
Recommended