Solución:
Todos ellos son buenos a su manera: simplemente son enfoques diferentes para los mismos problemas.
En un estilo puramente procedimental, los datos tienden a estar muy desacoplados de las funciones que operan en ellos.
En un estilo orientado a objetos, los datos tienden a llevar consigo una colección de funciones.
En un estilo funcional, los datos y las funciones tienden a tener más en común entre sí (como en Lisp y Scheme) al tiempo que ofrecen más flexibilidad en términos de cómo se utilizan realmente las funciones. Los algoritmos también tienden a definirse en términos de recursividad y composición en lugar de ciclos e iteración.
Por supuesto, el idioma en sí solo influye en qué estilo se prefiere. Incluso en un lenguaje puramente funcional como Haskell, puede escribir en un estilo procedimental (aunque eso es muy desaconsejado), e incluso en un lenguaje procedimental como C, puede programar en un estilo orientado a objetos (como en GTK + y API de EFL).
Para ser claros, la “ventaja” de cada paradigma está simplemente en el modelado de sus algoritmos y estructuras de datos. Si, por ejemplo, su algoritmo involucra listas y árboles, un algoritmo funcional puede ser el más sensato. O, si, por ejemplo, sus datos están muy estructurados, puede tener más sentido componerlos como objetos si ese es el paradigma nativo de su idioma, o podría escribirse tan fácilmente como una abstracción funcional de mónadas, que es el paradigma nativo de lenguajes como Haskell o ML.
La elección de cuál utiliza es simplemente lo que tiene más sentido para su proyecto y las abstracciones que admite su lenguaje.
Creo que las bibliotecas, herramientas, ejemplos y comunidades disponibles superan por completo el paradigma en estos días. Por ejemplo, ML (o lo que sea) podría ser la programación universal definitiva. idioma pero si no puede obtener buenas bibliotecas para lo que está haciendo, está jodido.
Por ejemplo, si está creando un videojuego, hay más buenos ejemplos de código y SDK en C ++, por lo que probablemente esté mejor con eso. Para una aplicación web pequeña, hay algunos marcos de trabajo de Python, PHP y Ruby excelentes que lo ayudarán a comenzar a ejecutar muy rápidamente. Java es una excelente opción para proyectos más grandes debido a la verificación en tiempo de compilación y las bibliotecas y plataformas empresariales.
Solía ocurrir que las bibliotecas estándar para diferentes lenguajes eran bastante pequeñas y fáciles de replicar: C, C ++, Assembler, ML, LISP, etc. venían con lo básico, pero tendían a acobardarse cuando se trataba de estandarizar las cosas. como comunicaciones de red, cifrado, gráficos, formatos de archivos de datos (incluido XML), ¡incluso se omitieron las estructuras de datos básicas como árboles equilibrados y tablas hash!
Los lenguajes modernos como Python, PHP, Ruby y Java ahora vienen con una biblioteca estándar mucho más decente y tienen muchas buenas bibliotecas de terceros que puede usar fácilmente, gracias en gran parte a la adopción de espacios de nombres para evitar que las bibliotecas colisionen entre sí. y recolección de basura para estandarizar los esquemas de administración de memoria de las bibliotecas.
Estos paradigmas no tienen por qué ser mutuamente excluyentes. Si observa python, admite funciones y clases, pero al mismo tiempo, todo es un objeto, incluidas las funciones. Puede mezclar y combinar estilos funcionales / oop / procedimentales en una sola pieza de código.
Lo que quiero decir es que en los lenguajes funcionales (al menos en Haskell, el único que estudié) ¡no hay declaraciones! a las funciones solo se les permite una expresión dentro de ellas !! PERO, las funciones son ciudadanos de primera clase, puedes pasarlas como parámetros, junto con un montón de otras habilidades. Pueden hacer cosas poderosas con pocas líneas de código.
Mientras que en un lenguaje procedimental como C, la única forma en que puede pasar funciones es usando punteros de función, y eso por sí solo no habilita muchas tareas poderosas.
En Python, una función es un ciudadano de primera clase, pero puede contener un número arbitrario de declaraciones. Por lo tanto, puede tener una función que contenga código de procedimiento, pero puede pasarlo como lenguajes funcionales.
Lo mismo ocurre con OOP. Un lenguaje como Java no le permite escribir procedimientos / funciones fuera de una clase. La única forma de pasar una función es envolverla en un objeto que implemente esa función y luego pasar ese objeto.
En Python, no tiene esta restricción.