Patrones de Diseño y Principios GRASP en Programación Orientada a Objetos
Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones
Escrito el en
español con un tamaño de 4,66 KB
¿Qué es un patrón de diseño?
Los patrones de diseño son un conjunto de estrategias o buenas prácticas que facilitan el trabajo al desarrollar aplicaciones orientadas a objetos. Estos patrones constituyen la base para resolver problemas comunes en el desarrollo de software, así como en el diseño de interacción o interfaces.
Como señala el arquitecto Christopher Alexander: "Cada patrón describe un problema que ocurre infinidad de veces en nuestro entorno, así como la solución al mismo, de tal modo que podemos utilizar esta solución un millón de veces más adelante sin tener que volver a pensarla otra vez".
Objetivos de los patrones de diseño
Los patrones de diseño pretenden:
- Proporcionar catálogos de elementos reusables en el diseño de sistemas de software.
- Evitar la reiteración en la búsqueda de soluciones a problemas ya conocidos.
- Formalizar un vocabulario común entre diseñadores.
- Estandarizar el modo en que se realiza el diseño.
- Facilitar el aprendizaje de las nuevas generaciones de diseñadores condensando conocimiento existente.
Asimismo, no pretenden:
- Imponer ciertas alternativas de diseño frente a otras.
- Eliminar la creatividad inherente al proceso de diseño.
Ejemplos de patrones: La Banda de los Cuatro (GoF)
La referencia más utilizada es la Gang of Four (GoF), que clasifica los patrones en:
- Patrones de creación: Se ocupan de la inicialización y configuración de objetos (ej. Abstract Factory, Builder, Singleton).
- Patrones estructurales: Separan la interfaz de la implementación y definen cómo se agrupan clases y objetos (ej. Adapter, Bridge, Composite).
- Patrones de comportamiento: Describen la comunicación entre objetos y clases (ej. Visitor, State, Memento).
Los patrones GRASP
Los patrones GRASP describen los principios fundamentales de la asignación de responsabilidades a objetos. Boch y Rumbaugh definen la responsabilidad como un contrato u obligación de un tipo o clase, categorizadas en:
- Conocer: Estar enterado de datos privados, objetos conexos o valores calculables.
- Hacer: Realizar acciones propias, iniciar acciones en otros objetos o coordinar actividades.
La asignación correcta de responsabilidades es crucial en el diseño orientado a objetos, especialmente durante la creación de diagramas de interacción.
GRASP: Experto
Problema: ¿Cuál es el principio fundamental para asignar responsabilidades?
Solución: Asignar la responsabilidad al experto en información, es decir, a la clase que cuenta con los datos necesarios para cumplirla.
GRASP: Creador
Problema: ¿Quién debe ser responsable de crear una nueva instancia de una clase?
Solución: Asignar a la clase B la creación de A si B agrega, contiene, registra, utiliza o posee los datos de inicialización de A.
GRASP: Bajo acoplamiento
Problema: ¿Cómo reducir la dependencia entre clases?
Solución: El acoplamiento mide la conexión entre clases. Un bajo acoplamiento evita que los cambios en una clase afecten a otras, facilitando la reutilización y el mantenimiento.
GRASP: Alta cohesión
Problema: ¿Cómo mantener la complejidad bajo control?
Solución: La cohesión mide cuán relacionadas están las responsabilidades de una clase. Una alta cohesión asegura que las clases tengan responsabilidades estrechamente relacionadas, evitando clases que hagan demasiadas cosas no afines.
GRASP: Controlador
Problema: ¿Quién debe atender un evento del sistema?
Solución: Un controlador es un objeto (no de interfaz de usuario) que maneja eventos externos. Puede ser un controlador de fachada, de tareas o de casos de uso.
¿Cuándo no utilizar patrones de diseño?
- Retrasar: Al igual que con la optimización, no es aconsejable aplicar patrones de diseño prematuramente.
- Implementación primero: Es preferible asegurar que el sistema funcione y, posteriormente, aplicar patrones para mejorar las debilidades detectadas, especialmente cuando el proyecto aún no está definido en detalle.