Patrones GRASP: polimorfismo, fabricación pura, indirecta, variaciones protegidas

¡Hola, Habr! Mi nombre es Vladislav Rodin. Actualmente soy el Director del curso Heavy Duty Architect en OTUS, y también doy cursos de arquitectura de software.



Especialmente para el inicio de un nuevo conjunto para el curso "Arquitectura y Patrones de Diseño" , continúo mi serie de publicaciones sobre patrones GRASP.










Introducción



Descrito en el libro de Craig Larman "Applying UML and patterns, 3rd edition", los patrones GRASP son generalizaciones de los patrones de GoF y también son una consecuencia directa de los principios de OOP. Complementan el paso que falta en la escalera lógica que le permite derivar patrones de GoF de los principios de OOP. Los patrones GRASP no son patrones de diseño (como los de GoF), sino los principios fundamentales de asignación de responsabilidades entre clases. Como muestra la práctica, no son muy populares, sin embargo, el análisis de las clases diseñadas utilizando el conjunto completo de patrones GRASP es un requisito previo para escribir un buen código.



La lista completa de plantillas GRASP consta de 9 elementos:



  • Experto en información
  • Creador
  • Controlador
  • Acoplamiento bajo
  • Alta cohesión
  • Polimorfismo


La última vez hablamos del patrón del controlador . Hoy propongo considerar los patrones restantes de la lista.



Polimorfismo



Se deben manejar diferentes comportamientos según el tipo, lo que permite el reemplazo de piezas del sistema.



Se propone distribuir responsabilidades entre clases mediante operaciones polimórficas, dejando cada sistema externo con su propia interfaz. Como ejemplo, podemos citar bibliotecas estandarizadas o configuración de aplicaciones conectando ciertos complementos para diferentes clientes según sus necesidades.



La presencia de una construcción de interruptor en el código es una violación de este principio, los interruptores y están sujetos a refactorización.



El uso excesivo de polimorfismo conduce a una complejidad excesiva del código y, en general, se desaconseja.



Fabricación pura



Debe garantizarse un bajo acoplamiento y una alta cohesión. Para ello, puede ser necesario sintetizar una esencia artificial. El patrón Pure Fabrication sugiere que no debe dudar en hacer esto. Como ejemplo, considere la fachada de la base de datos. Este es un objeto puramente artificial que no tiene análogos en el área temática. En general, cualquier fachada es Pure Fabrication (salvo que sea, por supuesto, una fachada arquitectónica en la aplicación correspondiente).



Indirección



Es necesario distribuir responsabilidades entre objetos, evitando la vinculación directa. Para hacer esto, puede asignar responsabilidades para la comunicación entre componentes o servicios a un objeto intermedio.



Traducido al ruso, el patrón implica lo siguiente: cualquier objeto en el código debe ser llamado a través de su interfaz (el mismo objeto intermedio).



La indirecta es el patrón más clave que se enumera en este artículo. Primero, es muy simple en términos de seguridad. En segundo lugar, le da al código una tremenda flexibilidad sin ser optimizaciones prematuras debido al primer punto. Si todas las clases se llaman entre sí a través de interfaces, esto conduce a la capacidad de "extraer" cualquier pieza del sistema y reutilizarla en otro lugar. Además, el uso de Indirección le permite agregar casi cualquier plantilla de una pandilla de cuatro sin demasiado esfuerzo o clases de refactorización.



Variaciones protegidas



Es necesario diseñar el sistema para que los cambios en algunos de sus elementos no afecten a otros. Como solución, se propone identificar puntos de posibles cambios o inestabilidad y distribuir responsabilidades de tal forma que se asegure un funcionamiento estable del sistema.



De hecho, esto no es un patrón, sino un objetivo que se logra siguiendo el resto de patrones.



Salida



Las plantillas GRASP constan de 8 patrones:



  1. Experto en información: procesamos la información donde está contenida.
  2. Creador: creamos objetos donde se necesitan.
  3. Controlador: movemos la lógica de subprocesos múltiples a una clase o componente separado.
  4. Acoplamiento bajo 5) Cohesión alta: diseñamos clases con una lógica empresarial homogénea y un número mínimo de conexiones entre ellos.
  5. Polimorfismo: organizamos varias opciones para el comportamiento del sistema como llamadas polimórficas, si es necesario.
  6. Pure Fabrication — , , Low Coupling High Cohesion.
  7. Indirection — .
  8. Protected Variations — , .






:






All Articles