677 votos

¿De Programación Funcional Reemplazar GoF Patrones De Diseño?

Desde que comencé a aprender F# y OCaml el año pasado, he leído un gran número de artículos que insisten en que los patrones de diseño (especialmente en Java) son soluciones de las características que faltan en los lenguajes imperativos. Un artículo que he encontrado hace un bastante fuerte reclamo:

La mayoría de las personas que he conocido han leído el Patrones de diseño de libro por la banda de Cuatro. Cualquier auto respeto programador diré que el libro es independiente del idioma y de los patrones aplicar a la ingeniería del software en en general, independientemente de la lengua que usted use. Esta es una noble reclamo. Por desgracia, está muy lejos de la verdad.

Los lenguajes funcionales son extremadamente expresivo. En un lenguaje funcional uno no necesita patrones de diseño porque el lenguaje es probablemente tan alta nivel, al final de la programación en conceptos que eliminar de diseño los patrones de todos juntos.

Las principales características de la programación funcional incluyen funciones como valores de primera clase, alarmada, valores inmutables, etc. No parece obvio para mí que OO patrones de diseño son la aproximación de cualquiera de esas características.

Además, en los lenguajes funcionales que apoyan la programación orientada a objetos (tales como F# y OCaml), me parece obvio que los programadores que utilizan estas lenguas se utilizan los mismos patrones de diseño se encuentra disponible para cualquier otro lenguaje de programación orientada a objetos. De hecho, ahora mismo yo uso F# y OCaml todos los días, y no hay notables diferencias entre los patrones de uso en estos idiomas vs los patrones que uso cuando voy a escribir en Java.

¿Hay alguna verdad a la afirmación de que la programación funcional que elimina la necesidad de OOP, patrones de diseño? Si es así, podría publicar o enlace a un ejemplo de un típico OOP, patrones de diseño y su equivalente funcional?

703voto

jalf Puntos 142628

El blog ha citado usted exagera su reclamo un poco. FP no eliminar la necesidad de patrones de diseño. El término "patrones de diseño" simplemente no es ampliamente utilizado para describir la misma cosa en FP idiomas. Pero ellos existen. Los lenguajes funcionales tienen un montón de mejores reglas de la práctica de la forma "cuando encontramos un problema X, utilice el código que se parece a Y", que es básicamente lo que es un patrón de diseño.

Sin embargo, es correcto que la mayoría de la programación orientada a objetos específicos de los patrones de diseño son bastante irrelevantes en los lenguajes funcionales.

No creo que se debe ser especialmente controvertido decir que los patrones de diseño , en general, sólo existen para cubrir las deficiencias en el lenguaje. Y si de otro idioma puede resolver el mismo problema trivialmente, que en otro idioma no tiene necesidad de un patrón de diseño. A los usuarios de que el lenguaje puede incluso no ser conscientes de que el problema existe, porque, bueno, no es un problema en ese idioma.

Las principales características funcionales la programación incluye funciones como valores de primera clase, alarmada, valores inmutables, etc. No parece obvio para mí que OO patrones de diseño se aproximan a cualquiera de los características.

¿Cuál es el modelo de comandos, si no una aproximación de primera clase de las funciones? :) En un FP de idioma, usted simplemente pasar una función como argumento a otra función. En un lenguaje POO, tienes que envolver la función en una clase, que puede crear y, a continuación, pasar el objeto a la otra función. El efecto es el mismo, pero en la programación orientada a objetos es llamado un patrón de diseño, y se necesita de mucho más código. Y lo que es el abstracto patrón de fábrica, si no alarmada? Pasar parámetros a una función un poco a la vez, para configurar qué tipo de valor se escupe cuando finalmente se llame.

Así que sí, varias GoF patrones de diseño son prestados redundante en FP idiomas, porque más potentes y fáciles de usar alternativas existen.

Pero, por supuesto, todavía hay patrones de diseño que son no resuelto por la FP idiomas. ¿Qué es la FP equivalente de un singleton? (Ignorando por un momento que los únicos son generalmente una terrible patrón de uso)

Y funciona en ambos sentidos. Como ya he dicho, la FP tiene sus patrones de diseño demasiado, la gente no suele pensar en ellos como tales.

Pero se puede ejecutar a través de las mónadas. ¿Qué son, si no un patrón de diseño para "tratar con el estado global"? Ese es un problema que es tan simple en la programación orientada a objetos lenguajes que no hay equivalente patrón de diseño que existe allí.

No necesitamos un patrón de diseño para "incrementar una variable estática", o "lectura de que la toma", porque es justo lo que hacen.

En (puro) de los lenguajes funcionales, los efectos secundarios y el estado mutable es imposible, a menos que trabaje alrededor de ella con la mónada "patrón de diseño", o cualquiera de los otros métodos para permitir la misma cosa.

Además, en los lenguajes funcionales que apoyan la programación orientada a objetos (tales como F# y OCaml), me parece obvio que los programadores que utilizan estas lenguas se utilizan los mismos patrones de diseño encuentra disponible para todos los demás la programación orientada a objetos lenguaje. De hecho, ahora mismo yo uso F# y OCaml todos los días, y no hay las diferencias notables entre la los patrones de uso en estos idiomas vs los patrones que yo uso cuando escribo en De Java.

Tal vez porque todavía estás pensando en imperativamente? Un montón de gente, después de lidiar con lenguajes imperativos todas sus vidas, tener un tiempo difícil renunciar a ese hábito cuando se trate de un lenguaje funcional. (He visto algunos bastante divertidos intentos de F#, donde literalmente cada función era sólo una cadena de 'vamos' declaraciones, básicamente, como si la hubiera tomado un programa en C, y sustituyen a todos los símbolos de punto y coma con el 'vamos'. :))

Pero otra posibilidad podría ser que simplemente no se han dado cuenta de que se está resolviendo los problemas de trivialmente que requeriría de patrones de diseño en un lenguaje POO.

Cuando se utiliza alarmada, o pasar una función como un argumento a otro, detenerse y pensar acerca de cómo te gustaría hacerlo en un lenguaje POO.

¿Hay alguna verdad a la afirmación de que el la programación funcional se elimina la necesidad de OOP, patrones de diseño?

Sí. :) Cuando se trabaja en un FP de idioma, usted ya no necesita la programación orientada a objetos-patrones de diseño específicos. Pero usted todavía necesita algunos patrones de diseño, como MVC o no-programación orientada a objetos específicos de la materia, y que necesita una pareja de nueva FP específica de "patrones de diseño" en su lugar. Todas las lenguas tienen sus defectos, y los patrones de diseño son generalmente de cómo vamos a trabajar alrededor de ellos.

De todos modos, puede resultar interesante para probar su mano en la de "limpiador" FP idiomas, como el ML (mi favorito personal, al menos para los propósitos de aprendizaje), o Haskell, donde no se dispone de la programación orientada a objetos muleta a la que recurrir cuando te encuentras con algo nuevo.

Edición: Como era de esperar, un par de personas que se opuso a mi definición de patrones de diseño como "reparar las deficiencias en un lenguaje", así que aquí está mi justificación: Como ya se dijo, la mayoría de los patrones de diseño específicos de un paradigma de programación, o incluso a veces un idioma específico. A menudo, los que resuelven los problemas que sólo existen en ese paradigma (Ver mónadas de FP, o resumen de las fábricas de programación orientada a objetos). ¿Por qué no el abstracto patrón de fábrica existen en FP? Porque el problema que intenta resolver no existe. Por lo tanto, si existe un problema en la programación orientada a objetos lenguajes, que no existe en FP idiomas, entonces es claro que es un defecto de la programación orientada a objetos lenguajes. El problema puede ser resuelto, pero su lenguaje no hacerlo, pero requiere un montón de código reutilizable para trabajar alrededor de ella. Idealmente, nos gustaría que nuestro lenguaje de programación por arte de magia hacer que todos los problemas desaparezcan. Cualquier problema que todavía existe es, en principio, una deficiencia de la lengua. ;)

96voto

S.Lott Puntos 207588

¿Hay alguna verdad a la afirmación de que la programación funcional que elimina la necesidad de OOP, patrones de diseño?

Programación funcional no es la misma que la programación orientada a objetos. Diseño orientado a objetos patrones no se aplican a la programación funcional. En lugar de ello, usted tiene la programación funcional patrones de diseño.

Para la programación funcional, usted no va a leer el OO patrón de diseño de los libros, vas a leer otros libros sobre FP patrones de diseño.

independiente del idioma

No totalmente. Sólo independientes del lenguaje con respecto a los lenguajes OO. Los patrones de diseño no se aplican a las lenguas de procedimiento. Ellos apenas tienen sentido en un contexto de diseño de base de datos relacional. No se aplican a la hora de diseñar una hoja de cálculo.

un típico OOP, patrones de diseño y su equivalente funcional?

El de arriba no debería existir. Eso es como preguntar por un pedazo de código de procedimiento reescrito como OO código. Ummm... Si me traducir el original Fortran (o C) en Java, yo no he hecho nada más que traducir. Si estoy totalmente de volver a escribir en un paradigma OO, que ya no se parece en nada a la original Fortran o C -- va a ser irreconocible.

No hay una correlación simple de OO Diseño Funcional Diseño. Son muy diferentes maneras de mirar el problema.

Programación funcional (como todos los estilos de la programación) ha patrones de diseño. Bases de datos relacionales tienen patrones de diseño, OO ha patrones de diseño, programación procedural ha patrones de diseño. Todo tiene patrones de diseño, incluso la arquitectura de los edificios.

Patrones de diseño, como un concepto-son un modo intemporal de construir, independientemente de la tecnología o del dominio del problema. Sin embargo, patrones de diseño específicos se aplican al problema específico de los dominios y las tecnologías.

Todo el que piensa de lo que están haciendo va a descubrir patrones de diseño.

27voto

Darius Bacon Puntos 9741

Patrones de diseño en Programación Dinámica por Peter Norvig ha reflexivo de la cobertura de este tema general, aunque sobre la 'dinámica' lenguas en lugar de 'funcional' (no se superponen).

27voto

bright Puntos 856

El libro de GOF explícitamente lazos de sí mismo a la programación orientada a objetos - el título es el de los Patrones de Diseño - Elementos de la Reusable Object-Oriented Software (el énfasis es mío.)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X