¿Por qué deberías pensar en la programación funcional?

Hola Habr! Le presento la traducción de mi artículo "Por qué debería pensar en la programación funcional" , dedicada a la programación funcional.

imagen

¿Por qué debería pensar en la programación funcional? Respondamos las siguientes preguntas:

  • ¿Sus proyectos siempre están a tiempo?
  • ¿Los usuarios tienen alguna queja?
  • ¿El soporte del proyecto ha tomado mucho tiempo?
  • ¿La nueva funcionalidad siempre encaja bien con la arquitectura existente?

Si las respuestas a todas las preguntas anteriores son positivas, no necesita cambiar nada, su equipo es un raro ejemplo de personal, metodología y herramientas armoniosos. De lo contrario, debe estar abierto a nuevos enfoques para resolver sus problemas, incluida una mirada crítica al hardware y los lenguajes de programación utilizados.

Primer vistazo


Como saben, los programadores son personas extremadamente creativas, pero al mismo tiempo tienden a seguir algunas tendencias al elegir un lenguaje de programación. Entre una gran cantidad de idiomas, los lenguajes funcionales se están volviendo cada vez más populares entre los fanáticos y las empresas de todo el mundo los usan con más confianza. El uso de lenguajes funcionales puede aumentar significativamente la productividad y la calidad del trabajo de los programadores. Naturalmente, esto depende de una combinación de tareas, lenguaje y habilidades de programación. En este caso, el programador simplemente describe lo que quiere, en lugar de enumerar la secuencia de acciones necesarias para obtener el resultado. Por lo tanto, el desarrollador se enfoca en el "nivel requerido" de alto nivel, en lugar de quedarse atascado en el "cómo hacerlo" de bajo nivel.

La programación funcional es el estilo de escribir programas compilando un conjunto de funciones. Su principio básico es envolver casi todo en una función, escribir muchas funciones pequeñas reutilizables y luego simplemente llamarlas una tras otra. Además, la estructura de estas funciones debe cumplir con ciertas reglas y resolver algunos problemas.

Entonces, si cualquier problema se puede resolver combinando llamadas a varias funciones, entonces:

  1. ¿Cómo implementar condiciones if-else?
  2. ¿Cómo resolver trucos con Null Exception?
  3. ¿Cómo asegurarse de que la función sea realmente "reutilizable" y se pueda usar en cualquier lugar?
  4. ¿Cómo asegurarnos de que los datos transferidos a nuestras funciones cambien y puedan usarse en otros lugares?
  5. Si una función toma varios valores, pero cuando se combina en una cadena, solo puede pasar una función, entonces, ¿cómo hacemos que esta función forme parte de la cadena?

Para resolver todos estos problemas, los lenguajes funcionales proporcionan herramientas y soluciones de las matemáticas, como mónadas, functors, etc.

Los beneficios de la programación funcional han sido reconocidos por el público en general. El desarrollo exitoso de software a menudo se reduce a la simplificación de los mecanismos existentes que permiten que las nuevas aplicaciones se adapten a los requisitos de los usuarios modernos. Y al mismo tiempo, debemos darnos prisa, ya que hemos logrado presentar productos a clientes con posibilidades ilimitadas en poco tiempo. Los requisitos cambiantes son mucho más fáciles de seguir cuando las aplicaciones desarrolladas se pueden dividir en varias funciones simples que son fáciles de probar. Dichos algoritmos no tienen efectos secundarios complicados y formulaciones abstractas destinadas a resultados a escala global.

Entonces, ¿por qué los expertos pasan por alto la programación funcional durante tanto tiempo? ¿Y por qué se está volviendo tan común hoy?

¿Dónde se usa la programación funcional en el mundo real?


Dado que la programación funcional es principalmente un enfoque para escribir código, puede usar sus principios en cualquier lenguaje. Sin embargo, hay lenguajes especialmente perfeccionados por un enfoque funcional. Los lenguajes funcionales más modernos, como Elm y Elixir, según GitHub y Stack Overflow, están ganando popularidad de forma gradual y con confianza. La creciente popularidad de JavaScript también ha aumentado el interés en los conceptos de programación funcional para su uso en este lenguaje. Además, los desarrolladores experimentados en el campo de la programación funcional comenzaron a trabajar en entornos de aplicación web única (SPA), y como resultado tenemos Redux, React, MobX y otras bibliotecas utilizadas por millones de personas.

imagen

Ejemplos de la vida real:

  • Chispa Apache
  • Escaldado (de Twitter)
  • Apache kafka
  • Finagle (de Twitter)
  • Aka
  • Autocad
  • emacs (LISP)

Entonces, ¿qué es la programación funcional, de dónde vino tal auge y por qué debería considerarse? Vamos a resolverlo.

Sobre programación funcional


Hace unos años, solo unos pocos expertos tenían una idea sobre la programación funcional, pero en los últimos tres años, casi todas las bases de código de grandes aplicaciones han utilizado activamente ideas tomadas del mundo de la programación funcional. Y hay razones objetivas para esto:

  • La programación funcional le permite escribir código más conciso y predecible
  • es más fácil de verificar (aunque aprender desde cero no es fácil)

Características clave del desarrollo de software mediante programación funcional.


  • La función de limpieza es muy simple. Siempre debe devolver el mismo resultado. Con los mismos valores de X e Y, siempre obtenemos el mismo resultado de la función. La previsibilidad juega un papel importante durante la ejecución del programa en la programación funcional.
  • Evitar condiciones generales, datos volátiles y efectos secundarios;
    Un objeto inmutable es un objeto cuyo estado no se puede cambiar después de su creación. Los objetos inmutables están más orientados a hilos que los objetos mutables. Si la función no funciona de manera predecible, esto conducirá a efectos secundarios indeseables. En lenguajes imperativos, una función en el proceso de implementación puede leer y cambiar los valores de las variables globales y realizar entradas / salidas. Por lo tanto, si llamamos a la misma función dos veces con el mismo argumento, puede suceder que obtengamos dos resultados diferentes. Esta característica se llama efecto secundario.

    La programación funcional nos ayuda a escribir código orientado a hilos.
  • La prevalencia de un enfoque declarativo más que imperativo.

Composición de la función


La composición de funciones es un enfoque de programación funcional que implica llamar a algunas funciones como argumentos de otras para crear una composición compleja de funciones más simples. Este método de diseño le permite tomar dos o más funciones simples y combinarlas en una función más compleja que realiza subfunciones en un orden lógico con cualquier dato. Para obtener este resultado, coloca una función dentro de otra y realiza operaciones con funciones externas en el resultado de la función interna hasta obtener el resultado. Y el resultado puede ser diferente, dependiendo del orden en que se apliquen las funciones.

Como resultado, con un orden lógico diferente de invocar funciones puras y el mismo valor del argumento, obtendremos una funcionalidad más compleja que nos da el resultado deseado y lo hace predecible.

imagen

Beneficios de la programación funcional


La programación funcional ayuda a que el código sea más fácil de entender, predecible y más fácil de leer. El uso de los principios de la programación funcional ayuda a eliminar las abstracciones innecesarias con un comportamiento impredecible, por lo que hace que el programa sea más predecible y reduce la cantidad de posibles errores.

En lenguajes funcionales, las funciones pueden pasarse a otras funciones como argumento o devolverse como resultado. Las funciones que toman argumentos funcionales se denominan funciones de orden superior o funcionales. La característica más popular es la tarjeta. Un mapa que aplica una determinada función a todos los elementos de la lista, formando otra lista a partir de los resultados.

En la programación puramente funcional, el operador de asignación está ausente, los objetos no se pueden cambiar y destruir, los nuevos solo se pueden crear decodificando y sintetizando los existentes. El recolector de basura incorporado se encargará de los objetos innecesarios. Debido a esto, en un lenguaje funcional puro, todas las funciones están libres de efectos secundarios. Sin embargo, esto no evita que este lenguaje imite algunas propiedades imperativas útiles, como excepciones y matrices mutables. Por supuesto, hay trucos especiales para esto.

Desventajas de programación funcional


  • Uno de los problemas de la programación funcional es que es diferente de lo que ya sabes. ¡Tienes que volver a aprender mucho de lo que ya sabes en un entorno imperativo! Muchos desarrolladores experimentados que ya saben lo que ya saben no van a resolver los problemas de manera diferente. Se necesita tiempo y esfuerzo para pensar de manera diferente.
  • Es fácil escribir funciones limpias, pero combinarlas en una aplicación completa es donde las cosas se vuelven más complicadas.
  • Gran problema con el rendimiento predecible. El uso de valores inmutables y recursividad puede conducir potencialmente a problemas de rendimiento, incluido el uso de RAM y la velocidad, por lo que la mayoría de los lenguajes funcionales no son una opción particularmente buena para sistemas de tiempo real blandos o duros o informática integrada.
  • La programación funcional tiende a escribir código en una forma demasiado abstracta cuando el programador ya no comprende lo que escribió después de un tiempo.
  • Las funciones puras y las E / S no se mezclan realmente.

Conclusión


Si a usted y a su equipo de desarrollo les parece que su estilo de codificación no le brinda el nivel necesario de administración de complejidad en su área de negocios, obstruyendo su código con basura innecesaria de sintaxis, lo que conduce a una pérdida de tiempo, pruebe la programación funcional. Por lo tanto, en áreas relacionadas con una gran cantidad de cálculos o transformaciones de datos, programación paralela / asíncrona, puede obtener ventajas significativas, inmerso en la programación funcional.

Escribir código en un lenguaje funcional le brinda la oportunidad de ver el problema desde una perspectiva diferente, donde el desarrollo de su solución puede ser más eficiente. Y simplemente aumentará la cantidad de formas de expresar sus ideas.

Cuando desarrolle su solución utilizando el paradigma de programación funcional, acelerará todo el proceso de desarrollo cada vez más rápido, adquiriendo cada vez más experiencia. Parece que está conduciendo su automóvil a alta velocidad, en comparación con la forma en que se mueven los programadores imperativos.

La programación funcional puede cambiar su estilo de codificación para mejor. Pero dominarlo es bastante difícil y requiere mucho tiempo, y muchas publicaciones y tutoriales no tienen en cuenta los detalles (por ejemplo, mónadas, fundos aplicativos, etc.) y no dan ejemplos prácticos que ayuden a los principiantes a usar métodos poderosos de programación funcional todos los días. Pero puede atraer programadores experimentados al equipo, lo que le ahorrará tiempo, esfuerzo y dinero.

imagen

Si hace todo bien, el resultado será más comprensible, conciso y tendrá un código legible. ¿No es eso lo que todos queremos?

Roman Taluev,
Desarrollador de Software Quasarbyte

Source: https://habr.com/ru/post/438396/


All Articles