Los Patrones de Software de Asignación de Responsabilidad General (o Principios ), abreviados como GRASP , son un conjunto de "nueve principios fundamentales en el diseño de objetos y la asignación de responsabilidad" [ 1 ] : 6 publicados por primera vez por Craig Larman en su libro de 1997 , Applying UML and Patterns .
Los diferentes patrones y principios utilizados en GRASP son controlador, creador, indirección, experto en información, bajo acoplamiento , alta cohesión , polimorfismo , variaciones protegidas y fabricación pura. [ 2 ] Todos estos patrones resuelven algunos problemas de software comunes a muchos proyectos de desarrollo de software . Estas técnicas no se han inventado para crear nuevas formas de trabajar, sino para documentar y estandarizar mejor los principios de programación antiguos y probados en el diseño orientado a objetos.
Larman afirma que "la herramienta de diseño fundamental para el desarrollo de software es una mente bien formada en principios de diseño. No es UML ni ninguna otra tecnología". [ 3 ] : 272 Por lo tanto, los principios GRASP son realmente un conjunto de herramientas mentales, una ayuda para el aprendizaje que facilita el diseño de software orientado a objetos.
Patrones
En el diseño orientado a objetos, un patrón es una descripción con nombre de un problema y su solución, que puede aplicarse en nuevos contextos. Idealmente, un patrón nos indica cómo aplicar su solución en diversas circunstancias y considera las ventajas y desventajas. Muchos patrones, para una categoría específica de problema, guían la asignación de responsabilidades a los objetos.
Experto en información
Problema: ¿Cuál es el principio básico para asignar responsabilidades a los objetos? Solución: Asignar la responsabilidad a la clase que posee la información necesaria para cumplirla.
El experto en información (también conocido como experto o principio experto ) es un principio que se utiliza para determinar dónde delegar responsabilidades como métodos, campos calculados, etc.
Aplicando el principio del experto en información, un enfoque general para asignar responsabilidades consiste en analizar una responsabilidad determinada, determinar la información necesaria para cumplirla y, a continuación, determinar dónde se almacena esa información.
Esto llevará a que la responsabilidad recaiga en la clase con la mayor cantidad de información necesaria para cumplirla. [ 3 ] : 17:11
Patrón o principio relacionado : Acoplamiento bajo, cohesión alta.
Creador
La creación de objetos es una de las actividades más comunes en un sistema orientado a objetos. La clase responsable de crear los objetos es una propiedad fundamental de la relación entre objetos de clases específicas.
Problema: ¿Quién crea el objeto A? Solución: En general, asigne a la clase Bla responsabilidad de crear el objeto Asi se cumple una o, preferiblemente, varias de las siguientes condiciones:
- Las instancias de
Bcontienen o agregan compuestamente instancias deA - Instancias de
Bregistro instancias deA - Instancias de
Buso cercano instancias deA - Las instancias de
Btienen la información de inicialización para las instancias deAy la pasan al crearse. [ 3 ] : 16:16.7
Patrón o principio relacionado : Acoplamiento bajo, patrón de fábrica
Controlador
El patrón controlador asigna la responsabilidad de gestionar los eventos del sistema a una clase que no pertenece a la interfaz de usuario y que representa el sistema en general o un caso de uso específico . Un objeto controlador es un objeto sin interfaz de usuario responsable de recibir o gestionar un evento del sistema.
Problema: ¿Quién debería ser responsable de gestionar un evento del sistema de entrada? Solución: Se debe utilizar un controlador de casos de uso para gestionar todos los eventos del sistema de un caso de uso, y puede utilizarse para más de un caso de uso. Por ejemplo, para los casos de uso Crear usuario y Eliminar usuario , se puede tener una única clase llamada UserController , en lugar de dos controladores de casos de uso separados. Alternativamente, se podría utilizar un controlador de fachada ; esto se aplica cuando el objeto responsable de gestionar el evento representa el sistema general o un objeto raíz.
El controlador se define como el primer objeto más allá de la capa de interfaz de usuario que recibe y coordina ("controla") una operación del sistema. El controlador debe delegar el trabajo necesario a otros objetos; coordina o controla la actividad. No debe realizar mucho trabajo por sí mismo. El controlador GRASP puede considerarse parte de la capa de aplicación/servicio [ 4 ] (suponiendo que la aplicación haya establecido una distinción explícita entre la capa de aplicación/servicio y la capa de dominio ) en un sistema orientado a objetos con capas comunes en una arquitectura lógica de sistema de información.
Patrón o principio relacionado : Comando , Fachada , Capas , Fabricación pura
Indirección
El patrón de indirección favorece un bajo acoplamiento y reutiliza el potencial entre dos elementos al asignar la responsabilidad de la mediación entre ellos a un objeto intermedio. Un ejemplo de esto es la introducción de un componente controlador para la mediación entre los datos (modelo) y su representación (vista) en el patrón modelo-vista-controlador. Esto garantiza que el acoplamiento entre ellos se mantenga bajo.
Problema: ¿Dónde asignar la responsabilidad para evitar el acoplamiento directo entre dos (o más) elementos? ¿Cómo desacoplar los objetos para que se mantenga un bajo acoplamiento y un mayor potencial de reutilización?
Solución: Asignar la responsabilidad a un objeto intermedio para que actúe como mediador entre otros componentes o servicios, evitando así su acoplamiento directo. El intermediario crea una capa de abstracción entre los demás componentes.
Acoplamiento bajo
El acoplamiento es una medida de cuán fuertemente un elemento está conectado a otros elementos, tiene conocimiento de ellos o depende de ellos. Un acoplamiento bajo es un patrón de evaluación que determina cómo asignar responsabilidades para los siguientes beneficios:
- menor dependencia entre las clases,
- un cambio en una clase tiene un menor impacto en otras clases,
- mayor potencial de reutilización.
Alta cohesión
La alta cohesión es un patrón evaluativo que busca mantener los objetos adecuadamente enfocados, manejables y comprensibles. Generalmente, se utiliza para favorecer un bajo acoplamiento. Una alta cohesión implica que las responsabilidades de un conjunto de elementos están fuertemente relacionadas y se centran en un tema específico. La división de programas en clases y subsistemas, si se realiza correctamente, es un ejemplo de actividades que aumentan la cohesión de las clases y subsistemas. Por otro lado, la baja cohesión se da cuando un conjunto de elementos, por ejemplo, un subsistema, tiene demasiadas responsabilidades no relacionadas. Los subsistemas con baja cohesión entre sus elementos constituyentes suelen ser difíciles de comprender, reutilizar, mantener y modificar en su conjunto. [ 3 ] : 314–315
Polimorfismo
Según el principio de polimorfismo , la responsabilidad de definir la variación de comportamientos en función del tipo recae en el tipo para el que se produce dicha variación. Esto se logra mediante operaciones polimórficas . El usuario del tipo debe utilizar operaciones polimórficas en lugar de ramificaciones explícitas basadas en el tipo.
Problema: ¿Cómo gestionar alternativas basadas en el tipo? ¿Cómo crear componentes de software conectables? Solución: Cuando las alternativas o comportamientos relacionados varían según el tipo (clase), asigne la responsabilidad del comportamiento —mediante operaciones polimórficas— a los tipos para los que varía dicho comportamiento. (El polimorfismo tiene varios significados relacionados. En este contexto, significa «dar el mismo nombre a servicios en diferentes objetos»).
Variaciones protegidas
El patrón de variaciones protegidas protege los elementos de las variaciones en otros elementos (objetos, sistemas, subsistemas) al envolver el foco de inestabilidad con una interfaz y utilizar el polimorfismo para crear diversas implementaciones de esta interfaz.
Problema: ¿Cómo diseñar objetos, subsistemas y sistemas de manera que las variaciones o la inestabilidad en estos elementos no tengan un impacto indeseado en otros elementos? Solución: Identificar los puntos de variación o inestabilidad previstos; asignar responsabilidades para crear una interfaz estable a su alrededor.
Pura fabricación
Una clase de fabricación pura es aquella que no representa un concepto en el dominio del problema, creada específicamente para lograr un bajo acoplamiento, una alta cohesión y el potencial de reutilización derivado de ello (cuando una solución presentada por el patrón Experto en Información no lo hace). Este tipo de clase se denomina "servicio" en el diseño dirigido por el dominio .
Patrones y principios relacionados • Acoplamiento bajo. • Cohesión alta.
Véase también
Referencias
- ↑ Craig Larman (2001). Aplicación de UML y patrones: Introducción al análisis y diseño orientado a objetos y al proceso unificado (PDF) (2.ª ed.). Prentice Hall. ISBN 0-13-092569-1.
- ↑ Muhammad Umair (26 de febrero de 2018). "SOLID, GRASP y otros principios básicos del diseño orientado a objetos" . DZone .
- 1 2 3 4 Craig Larman (2004). Aplicación de UML y patrones: Introducción al análisis y diseño orientado a objetos y al desarrollo iterativo (3.ª ed.). Pearson. ISBN 978-0131489066.
- ↑ "¿Capa de aplicación como fachada empresarial?" . Yahoo! Groups (domaindrivendesign) . Archivado del original el 07-08-2020 . Recuperado el 15-07-2010 .
- Diseño de software
- Principios de programación