Empecé a leer el libro de patrones de diseño de GoF. Algunos patrones parecen muy similares con solo diferencias conceptuales menores.
¿Crees que de los muchos patrones algunos son innecesarios en un lenguaje dinámico como Python (por ejemplo, porque están sustituidos por una característica dinámica)?
design-patterns
python
Gerenuk
fuente
fuente
Respuestas:
Peter Norvig demuestra que 16 de los 23 patrones de diseño encontrados en el libro GOF son invisibles o más simples en lenguajes dinámicos (se enfoca en Lisp y Dylan).
Desde que mencionó Python, hay una buena presentación de Alex Martelli sobre el tema. También relacionado con Python, hay una buena publicación de blog que muestra seis patrones de diseño en Python idiomático .
También mantengo un repositorio de github con implementaciones (por otras personas) de los patrones de diseño más comunes en Python .
fuente
No se necesitan patrones de diseño. En cualquier idioma.
Tiendo a encontrar un montón de código escrito por personas que leen sobre patrones de diseño y luego piensan que deberían usarlos por todas partes. El resultado es que el código real queda enterrado bajo toneladas de interfaces, envoltorios y capas y es bastante difícil de leer. Ese es un enfoque incorrecto para los patrones de diseño.
Existen patrones de diseño para que tenga un repertorio de expresiones idiomáticas útiles a mano cuando se encuentre con un problema. Pero nunca debe aplicar ningún patrón antes de identificar el problema. Keep It Simple Stupid siempre debe ser el principio superior de gobierno.
También ayuda pensar en los patrones de diseño como un concepto para pensar sobre el problema en lugar de un código específico para escribir. Y sobre gran parte de la plantilla como solución alternativa a Java que carece de funciones gratuitas y objetos de función estándar que usa en la mayoría de los otros lenguajes que los tienen (como Python, C #, C ++, etc.).
Podría decir que tengo un patrón de visitante, pero en cualquier idioma con funciones de primera clase, será solo una función que toma una función. En lugar de la clase de fábrica, generalmente solo tengo una función de fábrica. Podría decir que tengo una interfaz, pero solo son un par de métodos marcados con comentarios, porque no habría ninguna otra implementación (por supuesto, en Python una interfaz siempre es solo comentarios, porque es de tipo pato). Todavía hablo del código como el uso del patrón, porque es una forma útil de pensarlo, pero en realidad no escribo todo hasta que realmente lo necesito.
Así que aprende todos los patrones como conceptos . Y olvida las implementaciones específicas. La implementación varía, y debería variar, en el mundo real, incluso solo en Java.
fuente
El patrón de fábrica abstracto no es necesario en un lenguaje de tipo pato como Python, ya que está prácticamente integrado en el lenguaje.
fuente
El único que viene a la mente es el patrón Singleton.
Dado que Python no te obliga a usar clases para todo , solo puedes usar una estructura de datos global. Esa estructura de datos global podría ser administrada por una instancia, pero no tiene que controlar la creación de instancias de esa clase, solo crea la instancia en la importación y la deja así.
En su mayoría, Singletons en python se reemplazan con un módulo. Los módulos en python son, por su propia naturaleza, Singletons; el intérprete de python crea estos una sola vez.
Todos los demás patrones en Patrones de diseño que he usado en Python en un momento u otro, y encontrará ejemplos de ellos en toda la biblioteca estándar de Python y en el propio Python.
fuente
len
funciona; Guido hizo una elección explícita aquí . Mi punto es mostrar que Python no es un lenguaje POO puro; Es un lenguaje pragmático. Me gusta de esa forma.Los patrones de diseño son para el programador, no para el lenguaje. Los programadores tienden a usar patrones que les ayudan a dar sentido al problema en cuestión. Ningún patrón de diseño es estrictamente necesario, pero puede ser útil para simplificar lo que está tratando de hacer.
Python, y el tipeo de pato específicamente, proporciona un fin en torno a muchos patrones y prácticas comunes, y muchas de las restricciones impuestas por algunos patrones (privacidad, inmutabilidad, etc.) solo se mantienen en la medida en que el programador acepta no romperlos. . Pero aún así, ellos no trabajan todo el tiempo que el programador le sigue el juego. Una puerta sigue siendo una puerta, incluso si está enmarcada por paredes imaginarias.
Python se considera un lenguaje "multi-paradigma"; puedes usar los patrones que quieras. Esto es intencional Proporciona jerarquías de clase complejas, por ejemplo, a pesar de que son completamente innecesarias y un poco artificiales. Pero para algunas personas esa abstracción particular es útil. No porque el problema lo exija, sino porque el programador sí. Ahí vas.
fuente
El libro original de "Patrones de diseño" documentó y nombró algunos modismos comunes útiles en lenguajes orientados a objetos imperativos como C ++ y Smalltalk. Pero Smalltalk es un lenguaje de tipo dinámico, por lo que no puede ser estrictamente una cuestión de ser dinámico.
Sin embargo, la respuesta a su pregunta sigue siendo "sí": algunos de estos patrones de diseño serán irrelevantes para los lenguajes modernos de tipo dinámico. En términos más generales, habrá diferentes patrones de diseño en diferentes idiomas, especialmente en diferentes tipos de idiomas.
Para reiterar: un "patrón de diseño" es simplemente un nombre para un lenguaje de programación: una solución común a un problema frecuente. Diferentes idiomas requieren diferentes modismos, porque lo que es un problema para un idioma puede ser trivial para otro. En este sentido, los patrones de diseño tienden a señalar debilidades en los idiomas a los que se aplican.
Por lo tanto, puede buscar otras características que hagan que los lenguajes dinámicos modernos (o los antiguos como Lisp) sean más potentes, lo que hace que algunos de estos patrones de diseño clásicos sean irrelevantes.
fuente
Los patrones de diseño son formas de resolver problemas particulares. Si no se resuelve un problema, no sirve de nada el patrón para resolverlo.
La gente está tratando de adaptar patrones de diseño en todas partes como si fuera una buena práctica tener patrones de diseño en su proyecto. Eso es al revés. ¿Se encuentra con un problema que se puede resolver con un patrón de fábrica? Bueno. Adaptarlo. No busque su código e intente encontrar el lugar correcto para implementar un singleton (o fábrica, o fachada, o lo que sea ...).
¿Quizás Python tiene sus propios patrones de diseño que no están disponibles para las personas Java y .NET (debido a la naturaleza de estos lenguajes)?
fuente
Yo diría que los patrones siempre dependen del idioma. El hecho de que la mayoría de los patrones de Python se parezcan a los definidos en GoF se debe a la OOP de Python, ya que dicho OOP no es como la OOP (no hay dos lenguajes que definan los objetos y su manipulación sea 100% similar).
Por lo tanto, no hay duda de que algunos patrones no serán aplicables "tal cual", algunos podrían no tener sentido y hay algunos patrones que podrían ser significativos para Python.
Para volver exactamente a su pregunta: los patrones solo son necesarios si los necesita . No tiene que usarlos si no los necesita (como ya dijo Jan Hudec).
Además, hay muchos más patrones que los mencionados en GoF. Ver en wikipedia otros patrones
fuente