Desde que aprendí por primera vez sobre los patrones de diseño de Gang of Four (GoF) , hace al menos 10 años, tengo la impresión de que estos 23 patrones deberían ser solo una pequeña muestra de algo mucho más grande que me gusta llamar el Espacio de patrones . Este hipotético Pattern Space consta de todas las soluciones recomendables (conocidas o desconocidas) para problemas comunes de diseño de software orientado a objetos.
Así que esperaba que la cantidad de patrones de diseño conocidos y documentados creciera significativamente.
No sucedió. Más de 20 años después de la publicación del libro GoF, solo se enumeran 12 patrones adicionales en el artículo de Wikipedia, la mayoría de los cuales son mucho menos populares que los originales. (No incluí los patrones de concurrencia aquí porque cubren un tema específico).
¿Cuales son las razones?
¿Es el conjunto de patrones GoF realmente más completo de lo que creo?
¿Cayó el interés en encontrar nuevos patrones, tal vez porque se descubrió que no son tan útiles en el diseño de software?
¿Algo más?
fuente
Respuestas:
Cuando salió el Libro, mucha gente pensó de esa manera, y hubo muchos esfuerzos para crear "bibliotecas de patrones" o incluso "comunidades de patrones". Todavía puedes encontrar algunos de ellos:
Pero entonces...
Esto mucho. El objetivo de los patrones de diseño es mejorar la comunicación entre los desarrolladores, pero si intentas agregar más patrones, llegarás rápidamente al punto en que las personas no podrán recordarlos, o recordarlos mal, o estar en desacuerdo sobre cómo deberían ser exactamente, y la comunicación es no, de hecho, mejorado. Eso ya sucede mucho con los patrones de GoF.
Personalmente, iría aún más lejos: el diseño de software, especialmente el buen diseño de software, es demasiado variado para ser capturado de manera significativa en patrones, especialmente en la pequeña cantidad de patrones que las personas pueden recordar realmente, y son demasiado abstractos para que las personas puedan Realmente recuerdo más que un puñado. Entonces no están ayudando mucho.
Y demasiadas personas se enamoran del concepto e intentan aplicar patrones en todas partes; por lo general, en el código resultante no se puede encontrar el diseño real entre todas las Singletons y las Fábricas abstractas (completamente sin sentido).
fuente
ControversialDesignPatternOnlineOpinionHumanReadableRetortFactory.newInstance().getText();
Esta es la terrible suposición que propagan los programadores neófitos de todo el mundo, programadores que piensan que pueden escribir un programa simplemente uniendo patrones de software. No funciona de esa manera. Si existe tal "espacio de patrón", puede asumir que su tamaño es efectivamente infinito.
Los patrones de diseño (en el sentido de GoF) tienen un solo propósito: compensar las deficiencias en el lenguaje de programación que está utilizando.
Los patrones de diseño no son universales ni integrales. Si cambia a un lenguaje de programación diferente y más expresivo, la mayoría de los patrones en el libro GoF se vuelven innecesarios e indeseables.
fuente
ObservableSomething<T>
lo que facilita la comprensión de su propósito, ya que utiliza el nombre de patrón comúnmente conocido. Un patrón es una idea, no una implementación exacta.Creo que hay tres factores que entran en juego aquí.
Falta de masa crítica
Primero, un patrón es básicamente poco más que dar un nombre a algún código que implementa una "porción" particular de funcionalidad. La única forma en que ese nombre proporciona mucho valor real es si puede confiar en que todos sepan lo que significa el nombre, de modo que al usar el nombre, inmediatamente entiendan bastante sobre el código.
Sin embargo, los patrones nunca establecieron la masa crítica que necesitaban para lograr eso. Más bien lo contrario, AAMOF. En los 20 (más o menos) años desde que salió el libro GoF, estoy bastante seguro de que no he visto hasta una docena de conversaciones en las que todos los involucrados realmente conocían suficientes patrones de diseño para su uso para mejorar la comunicación.
Para decirlo un poco más curiosamente: los patrones de diseño fallaron específicamente porque fallaron.
Demasiados patrones
Creo que el segundo factor principal es que, en todo caso, inicialmente nombraron demasiados patrones. En un buen número de casos, las diferencias entre los patrones son lo suficientemente sutiles que es casi imposible decir con certeza real si una clase en particular se ajusta a un patrón u otro (o tal vez a ambos, o tal vez ninguno).
La intención era que pudieras hablar sobre el código en un nivel superior. Podrías etiquetar un fragmento de código bastante grande como la implementación de un patrón particular. Simplemente usando ese nombre predefinido, todos los que escuchan generalmente sabrían tanto como se preocupaban por ese código, por lo que podría pasar al siguiente paso.
La realidad tiende a ser casi lo contrario. Digamos que estás en una reunión y diles que esta clase en particular es una Fachada. La mitad de las personas en la reunión nunca supieron o hace mucho tiempo olvidaron exactamente lo que eso significa. Uno de ellos le pide que le recuerde las diferencias exactas entre una Fachada y, por ejemplo, un Proxy. Ah, y la pareja de personas que realmente conocen los patrones pasan el resto de la reunión debatiendo si esto realmente debería considerarse una Fachada o "solo" un Adaptador (con ese tipo todavía insistiendo en que le parece un Proxy).
Dado que su intención era realmente solo decir: "este código no es muy interesante; sigamos adelante", tratando de usar el nombre de un patrón que solo agrega distracción, no valor.
Falta de interés
La mayoría de los patrones de diseño realmente no tratan con las partes interesantes del código. Se ocupan de cosas como: "¿cómo creo estos objetos?" Y "¿cómo consigo que este objeto hable con ese?" Memorizar nombres de patrones para estos (así como los argumentos antes mencionados sobre detalles y demás) simplemente está poniendo mucha energía en cosas que a la mayoría de los programadores simplemente no les importa mucho.
Para decirlo de manera ligeramente diferente: los patrones tratan las cosas que son iguales entre muchos programas, pero lo que realmente hace que un programa sea interesante es cómo es diferente de otros programas.
Resumen
Los patrones de diseño fallaron porque:
fuente
Faltan abstracciones en los patrones, se abstraen los patrones simples, no se reconocen los patrones complejos, por lo que los patrones no son útiles (excepto algunos de alto nivel).
Creo que Paul Graham lo dijo mejor:
Cuando reconoces un patrón en tu código, significa que algo se repite y deberías usar una mejor abstracción. Si no tiene una mejor abstracción, utilice el patrón como solución alternativa. Debido a que los lenguajes de programación más nuevos proporcionan mejores abstracciones, los patrones se vuelven mucho menos útiles.
También los patrones simples a menudo se abstraen fácilmente y los patrones complejos rara vez se reconocen.
Cuando un patrón se reemplaza por una abstracción, no significa que el concepto detrás del patrón desaparezca, sino que el concepto se puede escribir explícitamente en lugar de indirecto y que ya no es especial en comparación con otro código y ya no se puede reconocer como un patrón.
fuente
String.replace
función, podría imaginarla apareciendo como un patrón, pero es mejor escribirla una vez en lugar de continuar reimplementándola. De acuerdo en que si usted no nombra a estas cosas correctamente, haría más difícil de leer, pero cuando se hace bien, el código se lee más declarativa de la OMI (por ejemplo, elgetOrElse
estilo de mónadas opción vs comprobación null)Si bien estoy de acuerdo con lo que otros respondieron aquí, personalmente creo que una razón principal para un número no creciente de patrones es que los patrones pierden su significado cuando hay innumerables. Lo bueno de estos pocos patrones es que cubren muchos dominios problemáticos de manera estándar. Si te enfocas en un dominio de patrones sin fin, terminarás sin ningún patrón. Es un poco como "¿Cuánto dura la línea costera de una isla?". Si mides en un mapa, vienes con un número decente. Pero si trata de ser más exacto y llega a una resolución más fina, encontrará que la longitud aumenta cada vez más hasta el infinito (o incertidumbre; ¿cómo mediría el borde exacto con mareas y a nivel atómico?).
fuente
Algo que ninguna de las otras respuestas menciona que también es relevante:
El auge de los lenguajes de tipo dinámico.
Cuando el libro salió por primera vez, hubo una discusión seria de que Java era demasiado lento para hacer un trabajo real. Ahora, Java se usa con frecuencia sobre lenguajes más expresivos debido a su velocidad. Quizás Ruby, Python, JavaScript, y otros aún son demasiado lentos para algunas clases importantes de aplicaciones, pero en general son lo suficientemente rápidos para la mayoría de los propósitos. Y JavaScript al menos en realidad se está volviendo más rápido a pesar de tener más funciones incluidas en cada versión.
El libro original de GoF tenía los patrones en smalltalk y c ++, y si la memoria sirve, los patrones siempre fueron más cortos en smalltalk y, a veces, significativamente. Algunas de las características de los patrones de diseño clásicos son realmente formas de agregar características dinámicas a un sistema tipado estáticamente (como el AbstractFactory ya discutido, en el que crea una instancia de la clase correcta basada en datos de tiempo de ejecución). Otros son mucho más cortos en lenguajes dinámicos que simplemente se funden en el uso idiomático del lenguaje mismo.
fuente
Se hizo pasar. Decenas, si no cientos, de libros se publicaron en lo que parecía un intento de reducir la totalidad de la informática para diseñar patrones, a medida que los editores y autores intentaron subirse (o crear) otro carro más. Tengo un estante de ellos. Nunca consulté desde el primer escaneo, y sí, fui un imbécil, porque había poco o nada de uso real o eso no se conocía bien (ver, por ejemplo, Type Object, que no es más que la tercera forma normal expresada sobre una docena de páginas en lugar de un párrafo), y porque obviamente cuantos menos patrones mejor, un punto que eludió a la mayoría de los practicantes. De hecho, cuando publiqué una refutación de Type Object, me dieron instrucciones de volver a redactar mi texto como un patrón de diseño.Historia verdadera. Lo que también muestra otra deficiencia del proyecto: ningún mecanismo de revisión o exclusión o rechazo.
De hecho, el GoF en realidad no intentó "explorar a fondo los patrones de diseño". Más bien, se involucraron en un proyecto mucho más grande: introducir el 'lenguaje de patrones' en CS, con todos sus extraños arcanos de notación de Fuerzas, Participantes, etc., que simplemente fallaron, porque fue fundamentalmente mal concebido, además de no tener sentido.
Lo que ellos hicieron cumplir, que era útil, era dos cosas:
Otro concepto útil que surgió fue el 'antipatrón', por ejemplo, 'iniciar sesión y lanzar'. El proyecto, como muchas modas en CS, se descarriló por su propio evangelismo y por ser adoptado erróneamente como otra religión de CS, y siguió el camino de la mayoría de esas religiones: útil en partes, pero ciertamente 'sin bala de plata' ((c ) Fred Brooks, 1965). Es triste que tengamos que redescubrir eso cada pocos años realmente.
fuente
Hubo / hay varios libros titulados PLoP ( Lenguajes de patrones de diseño de programas ) que son cada uno una antología de trabajos presentados en una conferencia anual .
Al leer los libros, descubrí que algunos de los patrones eran interesantes y nuevos para mí, algunos de ellos estándares (por ejemplo, "medio objeto más protocolo").
Entonces, no, la colección de GoF no fue exhaustiva e inspiró / inspiró a las personas a recopilar / describir / descubrir / inventar otras nuevas.
Presumiblemente, los "solo 12 patrones adicionales enumerados en el artículo de Wikipedia" tampoco son una colección completa: es decir, hay otros documentados en otros lugares, por ejemplo, en los libros de PLoP y quizás también en otros lugares.
fuente
El libro Gang of Four (GoF) contiene la mayoría de los patrones que un programador experimentado en un lenguaje no funcional tiene en su cinturón de herramientas. Es como el conjunto básico de herramientas que todos los constructores saben usar. La contribución principal del libro fue dar un nombre bien definido a los patrones que eran de uso común por los programadores más experimentados en ese momento y, por lo tanto, ayudar a la comunicación entre los programadores que discuten las opciones de diseño.
Usted espera que un electricista tenga algunas herramientas que un constructor normal no tiene, del mismo modo que esperaría que un programador de WPF conozca los patrones de diseño para las "Propiedades de dependencia", o un "Programador de SQL" para conocer el patrón de diseño para usar disparadores para Crear datos de auditoría.
Sin embargo, no los consideramos "patrones de diseño" debido a que solo se utilizan con una tecnología.
Algunos libros de patrones de diseño más modernos son "Refactoring, Improving the Design of Existing Code (Martin Fowler)" y "Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin) ". Ambos libros presentan los contenidos como transformaciones que usted hace a su código actual, en lugar de como "diseño reutilizable preenvasado", sin embargo, son tanto "patrones de diseño".
fuente
Aquí hay una entrevista con Erich Gamma donde reflexiona sobre su selección de patrones y lo que cambiarían hoy (bueno, hoy hace 10 años, jaja).
http://www.informit.com/articles/article.aspx?p=1404056
fuente
Los patrones reales en el libro a veces son realmente útiles, pero en realidad son solo ejemplos de una herramienta más poderosa que el libro le brinda: una comprensión profunda de cuándo y dónde es mejor cortar código monolítico en partes independientes separadas y reguladas por una interfaz .
Cuando aprende esa habilidad, se da cuenta de que no necesita recordar los detalles exactos de cada patrón, ya que siempre puede cortar la solución que está implementando de la manera que mejor se adapte a su propósito. Entonces, la idea de escribir más y más patrones parece muy académica y sin sentido.
fuente
El libro GoF y Wikipedia no son la única fuente de patrones de diseño conocidos. Si solo busca "patrones de diseño" en Amazon.com, obtendrá cientos de libros (intente esta búsqueda ). Supongo que solo enumeran el patrón más conocido en el artículo de Wikipedia .
Entonces, el problema no es que no haya suficientes patrones de diseño documentados. En cambio, hay tantos que nadie puede memorizarlos a todos y la mayoría de los programadores reconocen solo unos pocos. La gran promesa del lenguaje de patrones común se rompe en este momento.
fuente
Probablemente hay muchas estructuras en las que aún no se ha pensado. Mientras las personas desarrollen software, habrá desafíos de diseño que superar. Algunos de ellos pueden resolverse utilizando nuevos patrones inteligentes que otros podrían utilizar.
Los lenguajes de programación se han desarrollado y progresado para abstraer los patrones más utilizados. Esos patrones todavía existen en el diseño de los idiomas. Por lo tanto, pueden ser ignorados hoy, pero eso no los hace sin importancia.
¿El conocimiento de cómo construir una casa de repente no es importante una vez que tenemos robots que pueden hacerlo por nosotros? Yo diría que no, no lo es. Es menos relevante, claro, y probablemente sea mucho menos gratificante estudiarlo, ya que la demanda se redujo drásticamente y nadie más lo está estudiando.
Entonces no, no creo que el espacio de patrones como lo llamas se haya agotado. Como señaló otra respuesta, es probable que sea infinito. Pero a medida que disminuye la demanda de diseño de sistemas, a medida que aumentamos la altura de nuestra torre de abstracción y el poder de nuestros lenguajes de programación, cada vez menos personas que se construyen en los niveles superiores prestarán atención a los detalles de cómo se construyó la torre. .
fuente
Los patrones son infinitos ... Puede ajustar cada patrón o mezclar y combinar para crear nuevos ... Los patrones de integración empresarial también están bien definidos ... así que sí, gof se molestó en documentar patrones usando uml y creó un estándar para explicarlos ... Pero para cada dominio los patrones evolucionan y también cambian para lenguaje expresivo como python o scala.
fuente