Esta entrada te servirá como una introducción a la programación funcional. Aprenderás en qué consiste y las ventajas que tiene este paradigma de programación. También, entenderás qué son las funciones puras, la inmutabilidad y la recursión. No te lo pierdas y sigue leyendo.
Contenidos
Qué es la Programación Funcional
La programación funcional es un paradigma de programación basado en seguir un patrón declarativo. Este está compuesto de funciones puras, que evitan los efectos secundarios, los datos mutables y el estado compartido. Los elementos más importantes son las funciones, que analizaremos a continuación.
Aunque el estilo de programación funcional es independiente del lenguaje de programación, cada vez son más los lenguajes que lo soportan como Python, Go y Scala.
Patrón Declarativo vs Imperativo
El patrón imperativo consiste en especificar a través del lenguaje de programación los pasos para llevar a cabo una tarea y obtener un resultado. Se debe indicar cómo realizar la tarea. El patrón imperativo nos resulta muy familiar debido a la forma en que pensamos, por lo que es muy usado en los lenguajes de programación.
Por otro lado, el patrón declarativo consiste en especificar el resultado que esperamos sin indicar exactamente cómo realizar la tarea para llegar a este resultado. En vez de indicar cómo realizar la tarea, se indica por tanto qué se necesita hacer.
El patrón imperativo es la manera de resolver problemas en el paradigma de programación funcional. Puede ser muy potente, ya que se enfoca en los resultados que deseamos obtener.
Funciones Puras
Las funciones puras son funciones en el paradigma de programación funcional que tienen las siguientes características:
- Devuelven un resultado
- No tienen efectos secundarios
- Al menos tienen un parámetro de entrada
- Siempre devuelven el mismo resultado si se usan los mismos parámetros
Estas funciones son independientes del estado externo, por lo que resultan muy fáciles de refactorizar o cambiar su lógica sin introducir errores en otras partes del código. Debemos intentar separar las funciones de los datos.
public int multiply(int x, int y) {
return x * y;
}
Este es un ejemplo de una función pura en Java. En el caso de pasar los parámetros 2 y 3, siempre va a devolver 6 sin producir efectos secundarios en otra parte del programa.
Otra particularidad de las funciones puras es que siempre puede sustituirse su llamada por el valor que devuelven sin que afecte al programa.
Efectos Secundarios
Los efectos secundarios se producen cuando una función altera el estado del programa fuera de su ámbito (cualquier cambio que no sea su valor de retorno). Por ejemplo, los efectos secundarios incluyen modificar una variable externa, escribir un fichero o ejecutar otra función que tiene efectos secundarios.
En la programación funcional se intenta minimizar la cantidad de funciones que tienen efectos secundarios. De forma que las tengamos bien localizadas y a ser posible aisladas.
Inmutabilidad y Recursión
Un objeto se denomina inmutable cuando no se puede modificar de ninguna forma después de su creación. Los objetos inmutables son importantes para evitar que se alteren, y por tanto usarlos solamente en su ámbito (dentro de una función).
Para hacer compatibles los bucles con este concepto, en la programación funcional se usa la recursión. Ocurre cuando una función se llama a sí misma, creando de esta manera un bucle en el que los valores antiguos no son modificados. Cada llamada recursiva es por tanto independiente de las anteriores.
function factorial(x) {
if (x < 0) return;
if (x === 0) return 1;
return factorial(x - 1) * x;
}
Este es un ejemplo de una función recursiva típica (factorial) en el lenguaje JavaScript. Siempre que implementamos funciones recursivas debemos prestar atención a tener un caso de terminación, que evita que la función entre en un bucle infinito.
Programación Funcional vs Programación Orientada a Objetos (OOP)
En la programación funcional no es frecuente modificar objetos ya creados, como ocurre en la programación orientada a objetos (OOP). Para modificar un objeto es preferible crear uno nuevo de la forma que queramos. A continuación muestro en una tabla las diferencias más importantes entre estos dos paradigmas o estilos de programación.
Programación Funcional | Programación Orientada a Objetos | |
---|---|---|
Datos | Inmutables | Mutables |
Enfoque | Funciones y variables | Objetos y métodos |
Modelo | Declarativo | Imperativo |
Bucles | Recursivos | Iterativos |
Ambos paradigmas de programación son muy potentes y válidos para desarrollar aplicaciones. Para determinar cuál de ellos se ajusta más al proyecto o al entorno en el que queremos trabajar deberemos analizar sus características, ya que la programación funcional funciona mejor en proyectos menos complejos.
Ventajas de la Programación Funcional
Además de facilitar la lectura del código al simplificar las estructuras, a continuación tienes algunos de los beneficios y ventajas de la programación funcional:
- Las funciones puras suelen ser más pequeñas, lo que mejora su mantenimiento y refactorización.
- El código es más fácil de testear, puesto que las funciones no tienen efectos secundarios. Esto reduce la cantidad de bugs.
- Facilita la concurrencia con herramientas de sincronización.
- Facilita la recursión en funciones.
Preguntas Frecuentes Programación Funcional – FAQ
¿Cuáles son los lenguajes de programación funcional más populares?
Los lenguajes funcionales más populares son Haskell, Erlang y Elixir (concurrencia), Kotlin, PureScript, Rust, Scala y Swift.
Cursos de Programación Funcional y Siguientes Pasos
Te recomiendo el siguiente curso para aprender Scala a fondo, de los mejores lenguajes que encontrarás para familiarizarte con la programación funcional. Además, es un lenguaje fundamental para cualquier ingeniero de datos.
Curso de Programación Funcional con Scala
Este curso aplicado de Scala está disponible en la plataforma de formación online Coursera y consta de cinco partes: