Patrones de Diseño GRASP
Patrones de Diseño GRASP
Patrones de Diseño GRASP
08.23
Experto en información:
Nos dice que la responsabilidad de crear un objeto o una clase o implementar un método es
responsabilidad de la clase que conoce toda la información para crearlo.
El beneficio de esto es crear un diseño con mayor cohesión y así la información se
mantiene encapsulada y con mayor acoplamiento.
Problema:
Solución:
El principio para que exista un experto en información es que la clase tenga toda la
información necesaria para crear la clase.
Solución:
public class Informe
{
public int[] Parciales { get; set; }
NOTA:
Problema:
¿Quién debería ser el responsable de la creación de una nueva instancia de alguna clase?
Solución:
Beneficios:
Brinda un soporte a un bajo acoplamiento –patrón que será descrito más adelante– lo que
supone menos dependencias respecto al mantenimiento y mejores oportunidades de
reutilización.
Bajo Acoplamiento:
El acoplamiento es una medida de la fuerza con que una clase está conectada a otras
clases, con que las conoce y con que recurre a ellas. Una clase con bajo (o débil)
acoplamiento no depende de muchas otras clases. Una clase con alto (o fuerte)
acoplamiento recurre a muchas otras. Este tipo de clases no es conveniente, ya que
presentan los siguientes problemas:
Problema:
Solución:
Asignar una responsabilidad de manera que el acoplamiento permanezca bajo.
Beneficios:
Con el uso de este patrón los componentes no se afectan por cambios de otros
componentes, son fáciles de entender por separado y fáciles de reutilizar.
Alta cohesión:
En la perspectiva del diseño orientado a objetos, la cohesión es una medida de cuan
relacionadas y enfocadas están las responsabilidades de una clase. Una alta cohesión
caracteriza a las clases con responsabilidades estrechamente relacionadas que no
realicen un trabajo enorme. Una clase con baja cohesión hace muchas cosas no afines o
un trabajo excesivo. No conviene este tipo de clases pues presentan los siguientes
problemas:
Las clases con baja cohesión a menudo representan un alto grado de abstracción o
han asumido responsabilidades que deberían haber delegado a otros objetos.
Problema:
Solución:
Beneficios:
Con el uso de este patrón mejoran la claridad y la facilidad con que se entiende el diseño.
Se simplifican el mantenimiento y las mejoras en funcionalidad. A menudo se genera un
bajo acoplamiento. La ventaja de una gran funcionalidad soporta una mayor capacidad de
reutilización, porque una clase muy cohesiva puede destinarse a un propósito muy
específico.
Controlador:
Un evento del sistema es un evento de alto nivel generado por un actor externo; es un
evento de entrada externa. Se asocia a operaciones del sistema: las que emite en
respuesta a los eventos del sistema.
Un Controlador es un objeto de interfaz no destinada al usuario que se encarga de manejar
un evento del sistema. Define además el método de su operación.
La mayor parte de los Sistemas reciben eventos de entrada externa, los cuales
generalmente incluyen una interfaz gráfica para el usuario operado por una persona. Otros
medios de entrada son los mensajes externos o las señales procedentes de sensores como
sucede en los sistemas de control de procesos. En todos los casos, si se recurre a un
diseño orientado a objetos, hay que elegir los controladores que manejen esos eventos de
entrada. Este patrón ofrece una guía para tomar decisiones apropiadas que generalmente
se aceptan. La misma clase controlador debería utilizarse con todos los eventos sistémicos
de un caso de uso, de modo que se pueda conservar la información referente al estado del
caso.
Problema:
Solución:
Asignar una responsabilidad de recibir o manejar un mensaje de evento del sistema a una
clase que representa una de las opciones siguientes:
Algo en el mundo real que es activo (por ejemplo, el papel de una persona) y que
pueda participar en la tarea (controlador de tareas).
Representa un caso de uso en el que tiene lugar el evento del sistema a menudo
denominado <nombre del caso de uso> Manejador, <nombre del caso de uso>
coordinador, <nombre del caso de uso> Sesión.
•Utilice la misma clase controlador para todos los eventos del sistema en el mismo
escenario de caso de uso.
•Informalmente, una sesión es una instancia de una conversación con un actor. Las
sesiones pueden tener cualquier duración, pero se organizan a menudo en función de casos
de uso.
Beneficios:
Garantiza que la empresa o los procesos de dominio sean manejados por la capa de los
objetos del dominio y no por la de la interfaz. Al delegar a un controlador la responsabilidad
de la operación de un sistema entre las clases del dominio favorece la reutilización de la
lógica para manejar los procesos afines del negocio en aplicaciones futuras.
Polimorfismo:
En patrones GRASP es asignar el mismo nombre a servicios en diferentes objetos cuando
los servicios son parecidos ya que tienen asignados una misma responsabilidad o están
relacionados por la jerarquía de clases
Problema:
Solución:
¿Por qué?
Bien implementado:
public interface IMensajeDelLog
{
string Valor { get; }
}
Problema:
¿Qué Objetos deberían tener la responsabilidad para evitar la baja cohesión y el alto
acoplamiento ocasionados en algunos casos por otros patrones como el Experto?
SOLUCIÓN:
Uso:
disminuye el acoplamiento y aumenta la cohesión, esto ayuda a potenciar la reutilización
del código.
Soluciona que una clase sea poco cohesiva y no tenga otra clases en la que implementar
algunos métodos.
En desventaja del exceso de este principio se puede tener muchas clases de un solo
método como si fueran funciones.
Indirección:
Problema:
Solución:
De ésta forma, si nos entra un nuevo requisito, este debe repercutir lo mínimo. Este
principio introduce el polimorfismo y la indirección.