2009-02-13 11 views
25

Parece que muchas discusiones de OO usan Java o C# como ejemplos (por ejemplo, patrones de diseño de Head First).¿Los principios de diseño de OO se aplican a Python?

¿Estos patrones se aplican por igual a Python? O si sigo los patrones de diseño, ¿terminaré escribiendo Java en Python (que aparentemente es algo muy malo)?

+3

No 'aparentemente': es algo malo escribir en el Idioma A como si fuera el Lenguaje B '. Independientemente de cuál es cuál. Escribir Python en Perl puede ser igual de malo. –

+3

Los propios patrones de diseño están destinados a ser independientes del idioma: algunos textos pueden usar un lenguaje específico para discutir implementaciones, aunque los patrones están destinados a estar en un nivel diferente de abstracción. – Geoglyph

+0

Ver http://stackoverflow.com/questions/127377/programming-languages-and-design-patterns –

Respuesta

36

La mayor diferencia es que Python es tipado en pato, lo que significa que no necesitará planear las jerarquías de clase con tanto detalle como en Java, y tiene funciones de primera clase. El patrón de estrategia, por ejemplo, se vuelve mucho más simple y más obvio cuando puede simplemente pasar una función, en lugar de tener que hacer interfaces, etc. solo para simular funciones de orden superior. De manera más general, Python tiene azúcar sintáctica para muchos patrones de diseño comunes, como el iterador y la estrategia antes mencionada. Puede ser útil comprender estos patrones (he leído Head First y me pareció bastante útil), pero piense en las formas Pythonic para implementarlos en lugar de simplemente hacer las cosas de la misma manera que lo haría en Java.

4

Depende del patrón. Algunas cosas son difíciles de hacer en Python: Singleton es un ejemplo. Reemplace este patrón con otro, como en el caso de Singleton, Borg.
No es una locura utilizar patrones de diseño en Python; el patrón Iterator, por ejemplo, está integrado en la sintaxis. Sin embargo, muchas cosas simplemente no se hacen como OO o cosas pesadas. Python está diseñado para ser procesal o funcional cuando mejor se adapte a la tarea, y OO también.
En general, solo diría que use su mejor juicio. Si parece que utilizar el patrón de diseño Alpha-Gamma es excesivo y complicado, entonces probablemente lo sea. Si parece que el patrón es perfecto para lo que quieres, probablemente sí lo sea.

+0

El valor de Singleton es discutible de todos modos. Sobre el tema: los patrones de diseño son poco más que cinta adhesiva para corregir las deficiencias de un idioma. – Dan

12

Python tiene sus propios modismos de diseño. Algunos de los patrones estándar se aplican, otros no. Algo así como la estrategia o las fábricas tienen soporte en el idioma que los hace transparentes.

Por ejemplo, con los tipos de primera clase, cualquier cosa puede ser una fábrica. No es necesario un tipo de fábrica, puede usar la clase directamente para construir cualquier objeto que desee.

Básicamente, Python tiene sus propios modismos de diseño que son algo diferentes en gran parte porque es muy dinámico y tiene capacidades de introspección increíbles.

Ejemplo:

x = list 
my_list = x(range(0,5)) #creates a new list by invoking list's constructor 

Al asignar un tipo de clase a un objeto invocable puede eliminar esencialmente cualquier tipo 'fábrica' en el código. Solo te quedan callables que producen objetos que deben ajustarse a algunas convenciones.

Además, hay patrones de diseño en Python que simplemente no se pueden representar de manera eficiente en otros lenguajes de tipo estático. Las metaclases y los decoradores de funciones son buenos ejemplos de esto.

1

Diría que se aplican a Python una vez que ya estás haciendo programación orientada a objetos con Python. Tenga en cuenta que Python puede hacer mucho más que OOP, y debe usar el sentido común para elegir el paradigma apropiado para el trabajo. Si decide que su programa está mejor representado como una colección de objetos, entonces, asegúrese de utilizar los patrones de diseño, pero no tema hacer algo completamente diferente si así lo requiere.

0

El uso de Java o C# es probablemente debido a la popularidad de la corriente principal del idioma.

Pero el principio de diseño y/o los patrones de diseño se aplican independientemente del idioma que utilice.La implementación del mismo patrón de diseño en Python obviamente sería diferente que en Java o C#.

1

sí, por supuesto se aplican. Pero como se señaló anteriormente, muchos patrones están incorporados en el lenguaje o son irrelevantes para las características de nivel superior del lenguaje.

4

Los patrones de diseño son poco más que cinta adhesiva para corregir las deficiencias de un idioma.

+0

¿De verdad? ¿Algún ejemplo? –

+0

Había intentado explicar mis puntos de vista, pero era mucho desear encajar razonablemente en los comentarios, así que en su lugar: http://c2.com/cgi/wiki?AreDesignPatternsMissingLanguageFeatures – Dan

+0

"Una lista de DesignPatterns y una función de idioma que (en gran parte) los reemplaza ". Las dos columnas son listas de patrones de diseño. A la izquierda están los patrones de Gang of Four. Los de la derecha son otros patrones que no están en el libro de GoF. Todavía no veo que los patrones sean cinta adhesiva. –

3

Pensándolo mejor, algunos patrones, como Borg, pueden ser más específicos de Python (aunque se pueden decir cosas similares sobre otros patrones e idiomas).

El patrón de iterador también se usa en Python, aunque en una forma ligeramente diferente.

Duncan Booth ha escrito an article on patterns in python.

4

Respuesta corta: Sí; Python es un lenguaje OO.

Respuesta ligeramente más larga: Sí; puede diseño utilizando los principios OO y luego implementar en cualquier idioma (incluso ensamblador).

La ventaja de usar un lenguaje OO es que incorpora soporte para muchos conceptos OO comunes, por lo que no se arriesga a que errores innecesarios tengan que simularlos por convención. Por supuesto, siempre habrá detalles específicos del idioma con mayor o menor aplicabilidad; preguntaste sobre "principios de diseño", que deberían expresarse por encima de ese nivel de detalle.

largo, prolijo, respuesta aburrido: (El desarrollo de lenguajes de programación no es un simple progresión lineal, pero permítanme simplificar en exceso e ignoran el hecho de hacer una observación que se extiende por cerca de 40 años de experiencia en programación.)

Siempre habrá un papel para las características del lenguaje frente a los principios y patrones de diseño. En cada etapa, los médicos han notado atentos:

  • "Aquí hay un problema que seguimos la solución a mano en nuestro idioma (s) actual"

  • "Aquí hay un error que seguimos escribiendo en nuestro (s) idioma (s) actual".

  • "Aquí hay algunas buenas prácticas que seguimos observando en nuestros mejores programas".

Y así, la próxima generación de idioma (s) tienden proporcionar apoyo a la buena conducta observada, tienden a incorporar conceptos de manera que no tienen que ser hechas por convenio/acuerdo (o accidentalmente roto por el mismo) e imponer prácticas que eviten errores fácilmente evitables.

Independientemente de lo sofisticado, especializado, o generalizada nuestras herramientas, siempre hay programadores que "simplemente girar la manivela" y otros que seguir mirando atento a cómo los "mejores y más brillantes" (en la mente del espectador) usa las herramientas. Luego describen y promueven esas prácticas.Correctamente definidos (y ya sean llamados "estilo", "pautas", "patrones", "principios", etc.), esas prácticas terminan formando "el siguiente nivel" que siempre intentamos alcanzar, independientemente de dónde estemos. actualmente de pie.

0

Sí, puede utilizar muchos patrones de diseño en Python. Un patrón de diseño es solo una implementación repetible de una tarea de nivel superior. La razón por la cual Python & patrones de diseño no funcionan igual que otros lenguajes es porque Python incluye la mayoría de los patrones básicos incorporados. Esto significa que los patrones que surgen en Python probablemente sean patrones de diseño de nivel más alto en lugar de las tareas menores para qué patrones son usualmente necesarios.

Cuestiones relacionadas