Vi, aquí en Programadores, la respuesta a esta pregunta: ¿cómo cambia el pensamiento sobre patrones de diseño y prácticas de OOP en lenguajes dinámicos y de tipo débil? Allí encontré un enlace a un artículo con un título abierto: Son patrones de diseño que faltan características del lenguaje . Pero cuando encontré fragmentos que me parecieron muy pegadizos y que probablemente se pueden verificar con la experiencia, hay un incentivo para eso, como:
PaulGraham dijo que "Peter Norvig descubrió que 16 de los 23 patrones en Design Patterns eran 'invisibles o más simples' en Lisp".
u otra oración que confirma lo que vi recientemente con personas que intentan simular clases en JavaScript:
Por supuesto, nadie habla nunca del patrón de "función", del patrón de "clase", ni de muchas otras cosas que damos por sentado porque la mayoría de los idiomas los proporcionan como características integradas. OTOH, ¿programadores en un lenguaje puramente prototipo orientado? bien podría resultarle conveniente simular clases con prototipos ...
También estoy teniendo en cuenta que los patrones de diseño son una herramienta de comunicación . Porque incluso con mi experiencia limitada participando en la creación de aplicaciones, puedo ver como un antipatrón ( ineficaz y / o contraproducente ), por ejemplo, lo que obliga a un pequeño equipo de PHP a aprender patrones de GoF para aplicaciones de intranet pequeñas y medianas. Soy consciente de que la escala, el alcance y el propósito pueden determinar qué es efectivo y / o productivo, pero aún así no pude encontrar una descripción técnica al respecto.
Vi pequeñas aplicaciones comerciales que combinaban funcionalmente con OOP y aún se podían mantener, y no sé si muchas necesitarían, por ejemplo, en Python para escribir un singleton, pero para mí un módulo simple hace lo mismo.
Entonces, ¿hay estudios, artículos exhaustivos u otra forma de exposición que tenga en cuenta los patrones de diseño frente a soluciones alternativas frente a formas más sencillas de hacerlo o reemplazos por características del lenguaje?
fuente
Respuestas:
No conozco ninguna discusión o estudio en profundidad que tenga en cuenta todas esas cosas.
Dicho esto, todo el argumento de "los patrones de diseño son solo parches de características faltantes en los lenguajes OO" es un poco delgado, en mi opinión. Sí, algunos patrones de diseño son exactamente eso, llenan un vacío común que ni siquiera existe en otro lenguaje X. Estos son típicamente sus patrones de diseño más simples y de bajo nivel, como algunos / muchos de los originales en el libro GoF.
Pero los patrones de diseño van mucho más allá de esos simples, y llamarlos características de lenguaje faltantes extiende la imaginación. Eche un vistazo al catálogo de patrones de aplicaciones empresariales de Fowler y piense en cómo sería si todos fueran parte de la definición central de un lenguaje. Supongo que terminarías con un lenguaje específico de dominio ( DSL ) para aplicaciones empresariales (y uno muy complejo, por cierto).
Así que esto es realmente, los patrones de diseño son una forma de encontrar soluciones reutilizables para problemas particulares (que a menudo se aplican en un lenguaje genérico de uso múltiple). Aquí es donde también interviene la comunicación. Si me dice "usamos registros activos", ya sé bastante sobre su aplicación, sin perder minutos discutiendo cuáles son los diversos enfoques. Entonces, sí, los patrones de diseño hacen agujeros en la especificación del lenguaje. ¿Eso es todo lo que hacen? No, no por asomo.
Editar:
En cierto modo, lo que estoy diciendo es que los patrones permiten a los practicantes de OO pensar en un nivel superior y casi construir un tipo de DSL para su entorno, mientras se mantienen dentro de la sintaxis de su idioma. Y sí, he visto lo que sucede cuando los aplicas en todas partes (ver: AbstractSingletonProxyFactoryBean , sí, existe), o creo que son una especie de bala de plata. El punto es que si bien toman mucho tiempo para sentirse realmente cómodos, se supone que en realidad reducen la complejidad al hacer que las cosas sean predecibles / comprensibles a un alto nivel. Esto es muy diferente a ser un kit de parches para las fallas de su idioma.
Edición 2: se agregó el contraejemplo AbstractSingletonProxyFactoryBean para burlarse de los patrones. Para ser completamente justos, cuando se ve desde una luz AOP, incluso este contraejemplo es defendible.
fuente