Dado que el lenguaje de máquina (p. Ej. 0110101000110101
), Los lenguajes de computadora generalmente han evolucionado hacia formas más altas de abstracción, lo que facilita la comprensión del código cuando se aplica a un problema. Assembler era una abstracción sobre el código de máquina, C era una abstracción sobre el ensamblador, etc.
El diseño orientado a objetos parece ser muy bueno para permitirnos modelar un problema en términos de objetos, por ejemplo, el problema de un sistema de registro de cursos universitarios puede modelarse con una Course
clase, una Student
clase, etc. Luego, cuando escribimos la solución en un lenguaje OO, tenemos clases similares que tienen responsabilidades y que generalmente son útiles para el diseño, especialmente para modularizar el código. Si le doy este problema a 10 equipos independientes que lo resuelven con un método OO, generalmente las 10 soluciones tendrán en común las clases relacionadas con el problema. Puede haber muchas diferencias cuando comienzas a entrar en el acoplamiento y las interacciones de esas clases, por lo que no existe el "vacío de representación cero".
Mi experiencia con la programación funcional es muy limitada (sin uso en el mundo real, solo programas de tipo Hello World). No puedo ver cómo dichos lenguajes permiten asignar fácilmente soluciones FP a problemas (con una brecha de representación baja) como lo hacen los lenguajes OO.
Entiendo las ventajas de FP con respecto a la programación concurrente. ¿Pero me estoy perdiendo algo, o FP no se trata de reducir una brecha de representación (hacer que las soluciones sean más fáciles de entender)?
Otra forma de preguntar esto: ¿el código FP de 10 equipos diferentes que resuelven el mismo problema del mundo real tiene mucho en común?
De Wikipedia en Abstracción (informática) (énfasis mío):
Los lenguajes de programación funcional exhiben comúnmente abstracciones relacionadas con funciones , tales como abstracciones lambda (convertir un término en una función de alguna variable), funciones de orden superior (los parámetros son funciones), abstracción de corchetes (convertir un término en una función de una variable).
La brecha representacional podría aumentar potencialmente, porque [algunos] problemas del mundo real no se modelan fácilmente con tales abstracciones.
Otra forma en que veo una disminución de la brecha representacional es en el rastreo de los elementos de la solución hasta el problema. Los 0
'sys 1
en el código de máquina son muy difíciles de rastrear, mientras que la Student
clase es fácil de rastrear. No todas las clases de OO se remontan fácilmente al espacio del problema, pero muchas lo hacen.
¿Las abstracciones de FP no siempre necesitan explicarse para descubrir qué parte del espacio del problema están resolviendo (aparte de los problemas de matemáticas )?OK, estoy bien en esta parte. Después de ver muchos más ejemplos, veo cómo las abstracciones de FP son muy claras para las partes del problema que se expresan en el procesamiento de datos.
La respuesta aceptada a una pregunta relacionada ¿ Se puede usar UML para modelar un programa funcional? - dice "Los programadores funcionales no tienen mucho uso para los diagramas". Realmente no me importa si es UML, pero me hace preguntarme si las abstracciones de FP son fáciles de entender / comunicar, si no hay diagramas que se utilicen ampliamente (suponiendo que esta respuesta sea correcta). Una vez más, mi nivel de uso / comprensión de FP es trivial, por lo que entiendo que no hay necesidad de diagramas en programas simples de FP.
El diseño OO tiene niveles de abstracción de función / clase / paquete, con encapsulación (control de acceso, ocultación de información) en cada uno, lo que facilita la gestión de la complejidad. Estos son elementos que permiten pasar del problema a la solución y viceversa.
Muchas respuestas hablan de cómo se realizan el análisis y el diseño en FP de una manera análoga a OO, pero hasta ahora nadie cita nada de alto nivel (Paul citó algunas cosas interesantes, pero es de bajo nivel). Ayer busqué mucho en Google y encontré una discusión interesante. Lo siguiente es de Refactoring Functional Programs de Simon Thompson (2004) (énfasis mío)
Al diseñar un sistema orientado a objetos, se da por sentado que el diseño precederá a la programación. Los diseños se escribirán utilizando un sistema como UML que es compatible con herramientas como Eclipse. Los programadores principiantes pueden aprender un enfoque de diseño visual utilizando sistemas como BlueJ. El trabajo sobre una metodología similar para la programación funcional se informa en FAD: Análisis funcional y diseño , pero existe muy poco trabajo. Puede haber varias razones para esto.
Los programas funcionales existentes son de una escala que no requiere diseño. Muchos programas funcionales son pequeños, pero otros, como el Glasgow Haskell Compiler, son sustanciales.
Los programas funcionales modelan directamente el dominio de la aplicación, lo que hace que el diseño sea irrelevante. Si bien los lenguajes funcionales proporcionan una variedad de abstracciones poderosas, es difícil argumentar que proporcionan todas y solo las abstracciones necesarias para modelar el mundo real.
Los programas funcionales se construyen como una serie de prototipos en evolución.
En la tesis de doctorado citada anteriormente , los beneficios del uso de metodologías de análisis y diseño (ADM) se describen independientemente de los paradigmas. Pero se argumenta que los ADM deben alinearse con el paradigma de implementación. Es decir, OOADM funciona mejor para la programación OO y no se aplica bien a otro paradigma como FP. Aquí hay una gran cita que creo que parafrasea lo que llamo brecha representacional:
se puede discutir extensamente sobre qué paradigma proporciona el mejor soporte para el desarrollo de software, pero se logra el paquete de desarrollo más natural, eficiente y efectivo cuando uno permanece dentro de un solo paradigma desde la descripción del problema hasta la implementación y entrega.
Aquí está el conjunto de diagramas propuestos por FAD:
- diagramas de dependencia de funciones que presentan una función con aquellos que usa en su implementación;
- diagrama de dependencia de tipo que proporciona el mismo servicio para tipos; y,
- diagramas de dependencia del módulo que presentan vistas de la arquitectura del módulo del sistema.
Hay un estudio de caso en la sección 5.1 de la tesis del FAD, que es un sistema para automatizar la producción de datos relacionados con una liga de fútbol (soccer). Los requisitos son 100% funcionales, por ejemplo, ingresar resultados de fútbol, producir tablas de la liga, tablas de puntaje, tablas de asistencia, transferir jugadores entre equipos, actualizar datos después de nuevos resultados, etc. No se menciona ninguna mención de cómo funciona FAD para resolver requisitos no funcionales , además de afirmar que "se debería permitir una nueva funcionalidad a un costo mínimo", algo que es casi imposible de probar.
Lamentablemente, aparte de FAD, no veo ninguna referencia moderna para los lenguajes de modelado (visual) que se proponen para FP. UML es otro paradigma, por lo que debemos olvidarlo.