Patrón de diseño

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 19 de diciembre de 2021; las comprobaciones requieren 6 ediciones .

Un patrón de diseño o patrón ( patrón de diseño en inglés  ) en el desarrollo de software es un diseño arquitectónico  repetible , que es una solución a un problema de diseño dentro de un contexto que ocurre con frecuencia .

Por lo general, una plantilla no es un ejemplo completo que se pueda convertir directamente en código ; este es solo un ejemplo de una solución de problema que se puede usar en varias situaciones. Los patrones orientados a objetos muestran relaciones e interacciones entre clases u objetos , sin especificar qué clases finales u objetos de aplicación se utilizarán.

Los patrones de "bajo nivel" que tienen en cuenta las características específicas de un lenguaje de programación en particular se denominan modismos . Estas son buenas decisiones de diseño que son específicas de un lenguaje o plataforma de software en particular y, por lo tanto, no son universales.

En el nivel más alto, existen patrones arquitectónicos que cubren la arquitectura de todo el sistema de software .

Los algoritmos son inherentemente también patrones, pero no patrones de diseño, sino cálculos , ya que resuelven problemas computacionales.

Historia

En la década de 1970 , el arquitecto Christopher Alexander compiló un conjunto de patrones de diseño. En el campo de la arquitectura, esta idea no se desarrolló tanto como más tarde en el campo del desarrollo de software.

En 1987, Kent Beck y Ward Cunningham tomaron las ideas de Alexander y desarrollaron plantillas para el software de desarrollo de GUI de Smalltalk .

En 1988, Erich Gamma comenzó a escribir su tesis doctoral en la Universidad de Zúrich sobre la portabilidad general de esta técnica para el desarrollo de software.

Entre 1989 y 1991, James Coplien trabajó en el desarrollo de lenguajes de programación C++ y publicó Advanced C++ Idioms en 1991.

En el mismo año, Erich Gamma completa su tesis doctoral y se muda a los EE . UU ., donde, en colaboración con Richard Helm (Richard Helm), Ralph Johnson (Ralph Johnson) y John Vlissides (John Vlissides), publica el libro Design Patterns - Elementos del Software Orientado a Objetos Reutilizable . Este libro describe 23 patrones de diseño. Además, el equipo de autores de este libro es conocido por el público con el nombre de "Gang of Four" ( eng.  Gang of Four , a menudo abreviado como GoF ). Fue este libro el que provocó el aumento de la popularidad de los patrones de diseño.

Ventajas

En comparación con el diseño completamente independiente, las plantillas tienen una serie de ventajas. El principal beneficio de usar plantillas es reducir la complejidad del desarrollo a través de abstracciones preparadas para resolver toda una clase de problemas. La plantilla da nombre a la solución, lo que facilita la comunicación entre los desarrolladores al permitir referencias a plantillas conocidas. Así, gracias a las plantillas, se unifican los detalles de las soluciones: módulos, elementos del proyecto y se reduce el número de errores. La aplicación de plantillas es conceptualmente similar al uso de bibliotecas de código listas para usar. Un patrón de diseño bien formulado permite, habiendo encontrado una buena solución, usarlo una y otra vez. Un conjunto de plantillas ayuda al desarrollador a elegir la opción de diseño posible y más apropiada. [una]

Contras

Si bien modificar fácilmente el código para que se ajuste a un patrón conocido puede hacer que el código sea más fácil de entender, según Steve McConnell , existen dos problemas con el uso de patrones. Primero, seguir ciegamente algún patrón elegido puede llevar a la complejidad del programa. En segundo lugar, un desarrollador puede verse tentado a probar un determinado patrón sin ningún motivo en particular (ver Golden Hammer ). [2]

Muchos patrones de diseño en el diseño orientado a objetos pueden considerarse reproducciones idiomáticas de elementos de lenguajes funcionales [3] . Peter Norvig afirma que 16 de los 23 patrones descritos en Gangs of Four son mucho más fáciles de implementar en lenguajes de escritura dinámica que en C++ o son invisibles [4] . Paul Graham considera que la idea misma de los patrones de diseño es un antipatrón , una señal de que el sistema no tiene un nivel suficiente de abstracción y necesita ser reelaborado cuidadosamente [5] . Es fácil ver que la definición misma de una plantilla como " una solución lista para usar, pero no una llamada directa a una biblioteca " significa esencialmente el rechazo de la reutilización a favor de la duplicación . Esto obviamente puede ser inevitable para sistemas complejos cuando se usan lenguajes que no soportan combinadores y polimorfismo de tipos , y en principio puede ser excluido en lenguajes que tienen la propiedad de homoiconicidad (aunque no necesariamente de manera eficiente), ya que cualquier patrón puede implementarse en código ejecutable [6] .

Tipos de patrones de diseño

Básico

Nombre nombre original Descripción Descrito en Patrones de diseño
Plantillas básicas (Fundamental)
Patrón de delegación patrón de delegación Un objeto expresa externamente algún comportamiento, pero en realidad transfiere la responsabilidad de realizar este comportamiento a un objeto asociado. n / A
plantilla de diseño funcional Diseño funcional Asegura que cada módulo de un programa de computadora tenga una sola responsabilidad y la realice con un mínimo de efectos secundarios en otras partes del programa. n / A
Interfaz inmutable Interfaz inmutable Creación de un objeto inmutable . n / A
Interfaz Interfaz Un método general para estructurar programas de computadora para que sean más fáciles de entender. n / A
Marcador de interfaz Interfaz de marcador Como atributo (como marca de una entidad), se utiliza la presencia o ausencia de una implementación de la interfaz del marcador. Los lenguajes de programación modernos pueden usar atributos o anotaciones en su lugar. n / A
Contenedor de propiedades contenedor de propiedades Le permite agregar propiedades adicionales para la clase al contenedor (dentro de la clase), en lugar de extender la clase con nuevas propiedades. n / A
Canal de eventos canal de eventos Amplía el patrón de publicación/suscripción para crear un canal centralizado para eventos. Utiliza un proxy para suscribirse y un proxy para publicar el evento en el canal. El representante existe por separado del editor o suscriptor real. Un suscriptor puede recibir eventos publicados de más de una entidad, incluso si está registrado en un solo canal. n / A
Los patrones de creación son patrones  de diseño que abstraen el proceso de creación de instancias. Permiten independizar el sistema del método de creación, composición y presentación de los objetos. La plantilla que genera clases usa la herencia para modificar la clase que se está instanciando, mientras que la plantilla que genera objetos delega la instanciación a otro objeto.
Fábrica abstracta fábrica abstracta Una clase que representa una interfaz para crear componentes del sistema.
Constructor Constructor Una clase que representa una interfaz para crear un objeto complejo.
método de fábrica método de fábrica Define una interfaz para crear un objeto, pero deja que las subclases decidan qué clase instanciar.
Inicialización perezosa Inicialización perezosa Un objeto que se inicializa la primera vez que se accede a él. No
multitono multitono Garantiza que la clase tenga instancias de objetos con nombre y les proporciona un punto de acceso global. No
Grupo de objetos grupo de objetos Una clase que representa una interfaz para trabajar con un conjunto de objetos inicializados y listos para usar. No
Prototipo prototipo Define una interfaz para crear un objeto mediante la clonación de otro objeto en lugar de crearlo mediante un constructor.
La adquisición de recursos es la inicialización La adquisición de recursos es inicialización (RAII) La obtención de algún recurso se combina con la inicialización y liberación, con la destrucción del objeto. No
Solitario único Una clase que solo puede tener una instancia.
Las plantillas estructurales (Structural) definen varias estructuras complejas que cambian la interfaz de los objetos existentes o su implementación, lo que facilita el desarrollo y la optimización del programa.
Adaptador Adaptador/Envoltura Un objeto que permite que otros dos objetos interactúen, uno de los cuales usa y el otro proporciona una interfaz que es incompatible con el primero.
Puente Puente Una estructura que le permite cambiar la interfaz de llamada y la interfaz de implementación de clase de forma independiente.
enlazador Compuesto Un objeto que combina objetos similares a sí mismo.
Decorador o Envoltorio decorador Una clase que extiende la funcionalidad de otra clase sin usar herencia.
Fachada fachada Un objeto que abstrae el trabajo con múltiples clases combinándolas en una sola entidad.
Único punto de entrada controlador frontal Proporciona una interfaz unificada para las interfaces de un subsistema. El Front Controller define una interfaz de alto nivel que simplifica el uso del subsistema. No
oportunista peso mosca Este es un objeto que se presenta como una instancia única en diferentes lugares del programa, pero en realidad no lo es.
Diputado apoderado Un objeto que media entre otros dos objetos y que implementa/restringe el acceso al objeto al que se accede a través de él.
Los patrones de comportamiento definen la interacción entre los objetos, aumentando así su flexibilidad.
Cadena de Responsabilidades Cadena de responsabilidad Diseñado para organizar los niveles de responsabilidad en el sistema.
Comando , Acción, Transacción dominio Representa una acción. El objeto de comando contiene la acción en sí y sus parámetros.
Interprete Interprete Resuelve un problema común, pero sujeto a cambios.
iterador , cursor iterador Representa un objeto que le permite obtener acceso secuencial a los elementos del objeto agregado sin usar descripciones de cada uno de los objetos que forman parte de la agregación.
Mediador mediador Proporciona la interacción de muchos objetos, al tiempo que forma un acoplamiento flexible y elimina la necesidad de que los objetos se refieran explícitamente entre sí.
El arquero Recuerdo Permite, sin violar la encapsulación , arreglar y guardar los estados internos de un objeto para que luego pueda ser restaurado en esos estados.
Objeto nulo Objeto nulo Evita los punteros nulos proporcionando un objeto "predeterminado". No
Observador o Editor-Suscriptor Observador Define una dependencia de uno a muchos entre objetos, de modo que cuando cambia el estado de un objeto, todos los dependientes reciben una notificación del evento.
sirviente Servidor Se utiliza para proporcionar una funcionalidad común a un grupo de clases. No
Especificación Especificación Se utiliza para vincular la lógica empresarial. No
Estado Estado Se utiliza en aquellos casos en que, durante la ejecución del programa, el objeto debe cambiar su comportamiento en función de su estado.
Estrategia estrategia Se pretende definir una familia de algoritmos, encapsular cada uno de ellos y asegurar su intercambiabilidad.
método de plantilla método de plantilla Define la base del algoritmo y permite a los descendientes redefinir algunos pasos del algoritmo sin cambiar su estructura como un todo.
Visitante Visitante Describe una operación que se realiza en objetos de otras clases. Cuando cambia la clase Visitante, no hay necesidad de cambiar las clases atendidas.
Política sencilla política sencilla No
detector de eventos detector de eventos No
Visitante único Visitante de una sola porción Optimiza la implementación del patrón de visitante, que se inicializa, se usa una vez y luego se desecha. No
Visitante jerárquico Visitante jerárquico Proporciona una forma de atravesar todos los vértices de una estructura de datos jerárquica (por ejemplo, árbol). No

Concurrencia  - Concurrencia

Privado

Patrones de Programación Paralela ( Concurrencia )

Se utiliza para escribir programas de subprocesos múltiples de manera más eficiente y proporcionar soluciones listas para usar para los problemas de sincronización .

Nombre nombre original Descripción
Objeto activo objeto activo Sirve para separar el hilo de ejecución de un método del hilo en el que fue llamado. Utiliza la llamada de método asíncrono y los patrones del programador.
Balking Obstaculizando Se utiliza para realizar una acción en un objeto solo cuando está en el estado correcto.
Propiedades de enlace Combina múltiples observadores para mantener las propiedades sincronizadas entre diferentes objetos [7] .
Mensajería Patrón de mensajería, patrón de diseño de mensajería (MDP) Permite que componentes y aplicaciones intercambien información (mensajes).
Bloqueo de doble verificación Bloqueo doble comprobado Diseñado para reducir los gastos generales asociados con la obtención de un candado.
basado en eventos Asíncrono basado en eventos Abordar problemas con el patrón Asynchronous que surgen en programas con múltiples hilos [8] .
Suspensión vigilada Suspensión vigilada Se utiliza para bloquear la ejecución de una acción en un objeto solo cuando se encuentra en el estado correcto.
Mitad sincronizada/mitad asíncrona
Líderes/seguidores
bloqueando cerrar Un subproceso bloquea un recurso para evitar que otros subprocesos accedan a él o lo modifiquen [9] .
Monitor Monitor Un objeto destinado a ser utilizado de forma segura por más de un subproceso.
reactor_ Reactor Diseñado para la transmisión síncrona de solicitudes al servicio desde una o más fuentes.
de lectura/escritura Bloqueo de lectura/escritura Permite que varios subprocesos lean información del almacenamiento compartido al mismo tiempo, pero solo permite que un subproceso la modifique a la vez.
programador programador Proporciona un mecanismo para implementar una política de programación sin depender de ninguna política en particular.
grupo de hilos Proporciona un grupo de subprocesos para procesar trabajos, generalmente representado como una cola.
Almacenamiento específico de subprocesos Sirve para proporcionar diferentes variables globales para diferentes hilos.
Ejecución de subproceso único ejecución de un solo hilo Impide que se llame a un método al mismo tiempo, lo que evita que ese método se ejecute al mismo tiempo.
patrón cooperativo patrón cooperativo Proporciona un mecanismo para detener de forma segura los subprocesos de ejecución mediante el uso de un indicador común para señalar la finalización del subproceso.
Plantillas de generación de objetos Patrones de programación de objetos flexibles Patrones de ejecución de tareas Patrones de arquitectura del sistema Empresa
  • Active Record  es una forma de acceder a datos de bases de datos relacionales en programación orientada a objetos.
  • delegado comercial .
  • Entidad compuesta .
  • Vista compuesta .
  • DAO (Objeto de acceso a datos) Objeto de acceso a datos.
  • DispatcherView .
  • controlador frontal .
  • Filtro interceptor .
  • registro _
  • Activador de servicios .
  • Localizador de servicios .
  • Servicio al Trabajador .
  • Sesión Fachada .
  • Ensamblador de objetos de transferencia .
  • Objeto de transferencia
  • Manejador de lista de valores .
  • Ver ayudante .
  • Unidad de Trabajo .
Patrones de diseño de procesamiento de flujo
  • Manejo de eventos individualmente
  • Manejo usando el estado local
  • Procesamiento de varios pasos/re-particionamiento
  • Procesamiento usando un directorio externo: conectando un flujo de datos a una tabla
  • Conexión de flujos de datos
  • eventos extraordinarios
  • reprocesamiento
Patrones de diseño de sistemas distribuidos Plantillas de base de datos
  • mapeador de datos
  • Mapa de Identidad
  • Unidad de Trabajo
  • Carga lenta
Otros
  • Repositorio/Repositorio .

Otros tipos de patrones

También hoy en día hay una serie de otras plantillas.

Véase también

Notas

  1. McConnell, 2005 , pág. 100-101.
  2. McConnell, 2005 , pág. 101.
  3. Patrones de diseño en Haskell
  4. Peter Norvig - Patrones de diseño en lenguajes dinámicos (diapositivas)
  5. La venganza de los nerds . — "En el mundo de la OO se oye hablar mucho de "patrones". Me pregunto si estos patrones no son a veces evidencia del caso (c), el compilador humano, en el trabajo. Cuando veo patrones en mis programas, lo considero una señal de problemas. La forma de un programa debe reflejar solo el problema que necesita resolver. Cualquier otra regularidad en el código es una señal, al menos para mí, de que estoy usando abstracciones que no son lo suficientemente poderosas; a menudo, estoy generando a mano las expansiones de alguna macro que necesito escribir".
  6. Abelson, Sussman. Estructura e Interpretación de Programas de Computador (SICP). . comillas: “ Se pueden construir abstracciones de procedimientos y datos, se pueden usar funciones de orden superior para capturar patrones de uso comunes, … y los lenguajes integrados se pueden implementar fácilmente. "(pág. 16); “ Una de las cosas que debemos esperar de un lenguaje de programación poderoso es la capacidad de construir abstracciones nombrando esquemas comunes y luego trabajar directamente en esas abstracciones. … A menudo se utiliza el mismo esquema de programa con diferentes procedimientos. Para expresar estos esquemas como conceptos, necesitamos construir procedimientos que tomen otros procedimientos como argumentos o los devuelvan como valores. "(pág. 70); “ definir esquemas de plantilla como procedimientos sirve como un medio de abstracción. "(pág. 263); capítulo 4.1.5 "Datos como programas" (p.357-360); el concepto de " medios de abstracción " y su papel se da en la p.25.
  7. Propiedades de encuadernación
  8. Christian Nagel, Bill Evjen, Jay Glynn, Karli Watson y Morgan Skinner. Patrón asíncrono basado en eventos // Professional C# 2008  (neopr.) . - Wiley, 2008. - S.  570 -571. — ISBN 9780470191378 .
  9. Patrón de bloqueo
  10. Entrevista y extracto del libro: Diseño basado en el dominio de Dan Haywood usando objetos desnudos

Literatura

  • Zandstra M. PHP. Objetos, patrones y técnicas de programación. - 5ª ed.- San Petersburgo. : " Dialéctica ", 2019. - S. 736. - ISBN 978-5-907144-54-5 .
  • Fowler, Martín. Refactorización de código JavaScript: mejora del diseño del código existente. - 2ª ed.- San Petersburgo. : " Dialéctica ", 2019. - P. 464. - ISBN 978-5-907144-59-0 .
  • Gamma E., Helm R., Johnson R., Vlissides J. Técnicas para el diseño orientado a objetos. Patrones de diseño = objetos PHP, patrones y práctica, tercera edición. — 3ra edición. - M. : " Williams ", 2015. - S. 368. - ISBN 978-5-496-00389-6 .
  • Jason McColm Smith. Patrones de Diseño Elemental = Patrones de Diseño Elemental. - M. : " Williams ", 2012. - 304 p. — ISBN 978-5-8459-1818-5 .
  • Fowler, Martin, Beck, Kent, Brant, John, Opdike, William, Roberts, Don. Refactorización: mejorar el diseño del código existente. - M. : " Dialéctica ", 2019. - 448 p. - ISBN 978-5-9909445-1-0 .
  • Martín Fowler. Patrones de Arquitectura de Aplicaciones Empresariales (Serie Addison-Wesley Signature). - M. : " Williams ", 2012. - 544 p. - ISBN 978-5-8459-1611-2 .
  • Marcos Gran. Patrones de diseño en JAVA. Un catálogo de patrones de diseño reutilizables ilustrados con UML = Patrones en Java, Volumen 1. Un catálogo de patrones de diseño reutilizables ilustrados con UML. - M .: " Nuevos conocimientos ", 2004. - S. 560. - ISBN 5-94735-047-5 .
  • Craig Larman. Aplicación de UML 2.0 y patrones de diseño = Aplicación de UML y patrones: una introducción al análisis y diseño orientado a objetos y al desarrollo iterativo. - M .: " Williams ", 2006. - S. 736. - ISBN 0-13-148906-2 .
  • Steve McConnell. Código perfecto = Código completo. - San Petersburgo. : Peter, 2005. - S. 896. - (Clase magistral). - ISBN 5-7502-0064-7 , 5-469-00822-3.
  • Nia Narhid, Gwen Shapira, Todd Palino. Apache Kafka. Procesamiento de flujos y análisis de datos. Peter, 2019. - Pág. 320. - (O'Reilly Bestsellers) - ISBN 978-5-4461-0575-5 .

Enlaces