stringtranslate.com

Patrón de diseño de software

En ingeniería de software , un patrón de diseño de software es una solución general y reutilizable a un problema que ocurre comúnmente dentro de un contexto determinado en el diseño de software . No es un diseño terminado que pueda transformarse directamente en código fuente o de máquina . Más bien, es una descripción o plantilla de cómo resolver un problema que se puede utilizar en muchas situaciones diferentes. Los patrones de diseño son mejores prácticas formalizadas que el programador puede utilizar para resolver problemas comunes al diseñar una aplicación o sistema.

Los patrones de diseño orientado a objetos suelen mostrar relaciones e interacciones entre clases u objetos , sin especificar las clases u objetos de aplicación finales que están involucrados. Los patrones que implican un estado mutable pueden no ser adecuados para lenguajes de programación funcionales . Algunos patrones pueden resultar innecesarios en lenguajes que tienen soporte incorporado para resolver el problema que están tratando de resolver, y los patrones orientados a objetos no son necesariamente adecuados para lenguajes no orientados a objetos.

Los patrones de diseño pueden verse como un enfoque estructurado de la programación informática intermedio entre los niveles de un paradigma de programación y un algoritmo concreto .

Historia

Los patrones se originaron como un concepto arquitectónico por Christopher Alexander ya en 1977 (cf. "The Pattern of Streets", JOURNAL OF THE AIP, septiembre de 1966, Vol. 32, No. 5, págs. 273-278). En 1987, Kent Beck y Ward Cunningham comenzaron a experimentar con la idea de aplicar patrones a la programación (específicamente lenguajes de patrones ) y presentaron sus resultados en la conferencia OOPSLA de ese año. [1] [2] En los años siguientes, Beck, Cunningham y otros continuaron este trabajo.

Los patrones de diseño ganaron popularidad en la informática después de que la llamada "Banda de los Cuatro" (Gamma et al.) publicara en 1994 el libro Patrones de diseño: elementos de software orientado a objetos reutilizables , que con frecuencia se abrevia como "GoF". Ese mismo año, se celebró la primera Conferencia sobre lenguajes de programación de patrones y al año siguiente se creó el Repositorio de patrones de Portland para la documentación de patrones de diseño. El alcance del término sigue siendo motivo de controversia. Los libros notables en el género de patrones de diseño incluyen:

Aunque los patrones de diseño se han aplicado prácticamente desde hace mucho tiempo, la formalización del concepto de patrones de diseño languideció durante varios años. [3]

Práctica

Los patrones de diseño pueden acelerar el proceso de desarrollo al proporcionar paradigmas de desarrollo probados y probados. [4] El diseño de software eficaz requiere considerar cuestiones que pueden no hacerse visibles hasta más adelante en la implementación. El código recién escrito a menudo puede tener problemas sutiles ocultos que tardan en detectarse, problemas que a veces pueden causar problemas importantes en el futuro. La reutilización de patrones de diseño ayuda a prevenir problemas tan sutiles [5] y también mejora la legibilidad del código para codificadores y arquitectos que están familiarizados con los patrones.

Para lograr flexibilidad, los patrones de diseño generalmente introducen niveles adicionales de indirección , lo que en algunos casos puede complicar los diseños resultantes y perjudicar el rendimiento de la aplicación.

Por definición, un patrón debe programarse nuevamente en cada aplicación que lo utilice. Dado que algunos autores ven esto como un paso atrás respecto de la reutilización del software proporcionada por los componentes , los investigadores han trabajado para convertir patrones en componentes. Meyer y Arnout pudieron proporcionar una componente total o parcial de dos tercios de los patrones que intentaron. [6]

Las técnicas de diseño de software son difíciles de aplicar a una gama más amplia de problemas. [ cita necesaria ] Los patrones de diseño brindan soluciones generales, documentadas en un formato que no requiere detalles específicos vinculados a un problema en particular.

Estructura

Los patrones de diseño se componen de varias secciones (consulte § Documentación a continuación). De particular interés son las secciones Estructura, Participantes y Colaboración. Estas secciones describen un motivo de diseño : una microarquitectura prototípica que los desarrolladores copian y adaptan a sus diseños particulares para resolver el problema recurrente descrito por el patrón de diseño. Una microarquitectura es un conjunto de componentes de un programa (por ejemplo, clases, métodos...) y sus relaciones. Los desarrolladores utilizan el patrón de diseño introduciendo en sus diseños esta microarquitectura prototípica, lo que significa que las microarquitecturas en sus diseños tendrán una estructura y organización similar al motivo de diseño elegido.

Patrones específicos de dominio

También se han realizado esfuerzos para codificar patrones de diseño en dominios particulares, incluido el uso de patrones de diseño existentes, así como patrones de diseño específicos de dominio. Los ejemplos incluyen patrones de diseño de interfaz de usuario , [7] visualización de información , [8] diseño seguro, [9] "usabilidad segura", [10] diseño web [11] y diseño de modelos de negocio. [12]

Las actas anuales de la Conferencia sobre lenguajes de programación de patrones [13] incluyen muchos ejemplos de patrones de dominios específicos.

Clasificación y lista

Los patrones de diseño se clasificaron originalmente en 3 subclasificaciones según el tipo de problema que resuelven. Los patrones de creación brindan la capacidad de crear objetos en función de un criterio requerido y de forma controlada. Los patrones estructurales consisten en organizar diferentes clases y objetos para formar estructuras más grandes y proporcionar nuevas funcionalidades. Finalmente, los patrones de comportamiento tratan de identificar patrones de comunicación comunes entre objetos y darse cuenta de estos patrones.

Patrones creacionales

Patrones estructurales

Patrones de comportamiento

Patrones de concurrencia

Documentación

La documentación de un patrón de diseño describe el contexto en el que se utiliza el patrón, las fuerzas dentro del contexto que el patrón busca resolver y la solución sugerida. [26] No existe un formato único y estándar para documentar patrones de diseño. Más bien, diferentes autores de patrones han utilizado una variedad de formatos diferentes. Sin embargo, según Martin Fowler , ciertas formas de patrones se han vuelto más conocidas que otras y, en consecuencia, se han convertido en puntos de partida comunes para nuevos esfuerzos de escritura de patrones. [27] Un ejemplo de un formato de documentación comúnmente utilizado es el utilizado por Erich Gamma , Richard Helm , Ralph Johnson y John Vlissides en su libro Design Patterns . Contiene las siguientes secciones:

Crítica

Se ha observado que los patrones de diseño pueden ser simplemente una señal de que faltan algunas características en un lenguaje de programación determinado ( Java o C++, por ejemplo). Peter Norvig demuestra que 16 de los 23 patrones del libro Design Patterns (que se centra principalmente en C++) se simplifican o eliminan (mediante soporte directo de lenguaje) en Lisp o Dylan . [28] Hannemann y Kiczales hicieron observaciones relacionadas, quienes implementaron varios de los 23 patrones de diseño utilizando un lenguaje de programación orientado a aspectos (AspectJ) y demostraron que las dependencias a nivel de código se eliminaron de las implementaciones de 17 de los 23 patrones de diseño y que La programación orientada a aspectos podría simplificar las implementaciones de patrones de diseño. [29] Véase también el ensayo de Paul Graham "La venganza de los nerds". [30]

El uso inadecuado de patrones puede aumentar innecesariamente la complejidad. [31]

Ver también

Referencias

  1. ^ Smith, Reid (octubre de 1987). Panel sobre metodología del diseño . Anexo a las actas de OOPSLA '87. doi :10.1145/62138.62151. Ward advirtió contra la necesidad de demasiada programación en lo que denominó "el alto nivel de los magos". Señaló que un "lenguaje de patrones" escrito puede mejorar significativamente la selección y aplicación de abstracciones. Propuso un "cambio radical en la carga del diseño y la implementación" basando la nueva metodología en una adaptación del trabajo de Christopher Alexander en lenguajes de patrones y que los lenguajes de patrones orientados a la programación desarrollados en Tektronix han ayudado significativamente en sus esfuerzos de desarrollo de software.
  2. ^ Beck, Kent ; Cunningham, Ward (septiembre de 1987). Uso de lenguajes de patrones para programas orientados a objetos. Taller OOPSLA '87 sobre especificación y diseño para programación orientada a objetos . Consultado el 26 de mayo de 2006 .
  3. ^ Baroni, Aline Lucía; Guéhéneuc, Yann-Gaël; Albin-Amiot, Hervé (junio de 2003). Formalización de patrones de diseño (Reporte). Informe técnico de la REM. Nantes : Escuela Nacional Superior de Técnicas Industriales y Minas de Nantes. CiteSeerX 10.1.1.62.6466 . S2CID  624834 – vía ResearchGate. 
  4. ^ Obispo, Judit. "Patrones de diseño de C# 3.0: utilice el poder de C# 3.0 para resolver problemas del mundo real". Libros de C# de O'Reilly Media . Consultado el 15 de mayo de 2012 . Si desea acelerar el desarrollo de sus aplicaciones .NET, está preparado para los patrones de diseño de C#: formas elegantes, aceptadas y comprobadas de abordar problemas de programación comunes.
  5. ^ Tiako, Pierre F. (31 de marzo de 2009). "Modelado formal y especificación de patrones de diseño mediante RTPA". En Tiako, Pierre F (ed.). Aplicaciones de software: conceptos, metodologías, herramientas y aplicaciones: conceptos, metodologías, herramientas y aplicaciones . pag. 636. doi :10.4018/978-1-60566-060-8. ISBN 9781605660615.
  6. ^ Meyer, Bertrand ; Arnout, Karine (julio de 2006). "Componentización: el ejemplo del visitante" (PDF) . Computadora IEEE . 39 (7): 23–30. CiteSeerX 10.1.1.62.6082 . doi :10.1109/MC.2006.227. S2CID  15328522. 
  7. ^ Laakso, Sari A. (16 de septiembre de 2003). "Colección de patrones de diseño de interfaces de usuario". Universidad de Helsinki, Departamento de Ciencias de la Computación . Consultado el 31 de enero de 2008 .
  8. ^ Heer, J.; Agrawala, M. (2006). "Patrones de diseño de software para visualización de información". Transacciones IEEE sobre visualización y gráficos por computadora . 12 (5): 853–60. CiteSeerX 10.1.1.121.4534 . doi :10.1109/TVCG.2006.178. PMID  17080809. S2CID  11634997. 
  9. ^ Dougherty, Chad; Sayre, Kirk; Seacord, Robert C.; Svoboda, David; Togashi, Kazuya (2009). Patrones de diseño seguro (PDF) . Instituto de Ingeniería de Software.
  10. ^ Garfinkel, Simson L. (2005). Principios y patrones de diseño para sistemas informáticos que sean simultáneamente seguros y utilizables (tesis doctoral).
  11. ^ "Biblioteca de patrones de diseño de Yahoo!". Archivado desde el original el 29 de febrero de 2008 . Consultado el 31 de enero de 2008 .
  12. ^ "¿Cómo diseñar tu modelo de negocio como Lean Startup?". 2010-01-06 . Consultado el 6 de enero de 2010 .
  13. ^ Lenguajes de programación de patrones, actas de conferencias (anual, 1994—) [1]
  14. ^ abc McConnell, Steve (junio de 2004). "Diseño en la Construcción". Código completo (2ª ed.). Prensa de Microsoft . pag. 104.ISBN 978-0-7356-1967-8. Tabla 5.1 Patrones de diseño populares
  15. ^ ab Fowler, Martín (2002). Patrones de arquitectura de aplicaciones empresariales. Addison-Wesley . ISBN 978-0-321-12742-6.
  16. ^ Alur, Deepak; Crupi, John; Malks, Dan (2003). Patrones principales de J2EE: mejores prácticas y estrategias de diseño. Prentice Hall . pag. 166.ISBN 978-0-13-142246-9.
  17. ^ Fowler, Martín (2002). Patrones de arquitectura de aplicaciones empresariales. Addison-Wesley . pag. 344.ISBN 978-0-321-12742-6.
  18. ^ Bloch, Josué (2008). "Artículo 37: Utilizar interfaces de marcador para definir tipos". Java efectivo (Segunda ed.). Addison-Wesley. pag. 179.ISBN 978-0-321-35668-0.
  19. ^ "Twin: un patrón de diseño para modelar herencia múltiple" (PDF) .
  20. ^ Schmidt, Douglas C.; Stal, Michael; Rohnert, Hans; Buschmann, Frank (2000). Arquitectura de software orientada a patrones, volumen 2: patrones para objetos concurrentes y en red . John Wiley e hijos. ISBN 978-0-471-60695-6.
  21. ^ Propiedades de enlace
  22. ^ Nagel, cristiano; Evjen, Bill; Glynn, Jay; Watson, Karli; Skinner, Morgan (2008). "Patrón asincrónico basado en eventos". Profesional C# 2008 . Wiley. págs. 570–571. ISBN 978-0-470-19137-8.
  23. ^ Patrón de bloqueo
  24. ^ Francalanza, Adrián; Tabone, Gerard (octubre de 2023). "ElixirST: un sistema de tipos basado en sesiones para módulos Elixir". Revista de métodos lógicos y algebraicos en programación . 135 . doi :10.1016/j.jlamp.2023.100891. S2CID  251442539.
  25. ^ Schmidt, Douglas C.; Vinoski, Steve (julio-agosto de 1996). "Interconexiones de objetos: comparación de técnicas de programación alternativas para servidores CORBA multiproceso (columna 7)" (PDF) . Informe SIGS C++ . S2CID  2654843.
  26. ^ Gabriel, Dick . "Una definición de patrón". Archivado desde el original el 9 de febrero de 2007 . Consultado el 6 de marzo de 2007 .
  27. ^ Fowler, Martín (1 de agosto de 2006). "Escribir patrones de software" . Consultado el 6 de marzo de 2007 .
  28. ^ Norvig, Peter (1998). Patrones de diseño en lenguajes dinámicos.
  29. ^ Hannemann, enero; Kiczales, Gregor (2002). "Implementación de patrones de diseño en Java y AspectJ". Actas de la 17ª conferencia ACM SIGPLAN sobre programación, sistemas, lenguajes y aplicaciones orientados a objetos - OOPSLA '02 . OOPSLA '02. pag. 161. doi : 10.1145/582419.582436. ISBN 1581134711.
  30. ^ Graham, Paul (2002). "La venganza de los nerds" . Consultado el 11 de agosto de 2012 .
  31. ^ McConnell, Steve (2004). Código completo: un manual práctico de construcción de software, segunda edición . Educación Pearson. pag. 105.ISBN 9780735619678.

Otras lecturas