Aprende qué es la Programación Funcional

Última actualización: 02/10/2021

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.

Programación Funcional

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 FuncionalProgramación Orientada a Objetos
DatosInmutablesMutables
EnfoqueFunciones y variablesObjetos y métodos
ModeloDeclarativoImperativo
BuclesRecursivosIterativos

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.

Cursos de Programación Funcional y Siguientes Pasos

A continuación, tienes 3 cursos disponibles en Udemy con distintos lenguajes de programación para aprender este paradigma desde cero.

Curso de Java 8 con Lambdas y Streams

Java 8 Programación Funcional con Lambdas y Streams

Este curso te permitirá aprender a sacar todo el partido de los elementos funcionales de Java 8, como los Lambdas y Streams.

Curso de Scala Funcional para Principiantes

Scala y Programación Funcional para Principiantes

El curso de Scala te enseñará a desenvolverte desde cero con este lenguaje de programación y su orientación funcional.

Curso de programación Funcional para principiantes como JavaScript

Programación Funcional para principiantes como JavaScript

JavaScript es otro lenguaje muy interesante para aprender este paradigma. Muy recomendable para principiantes.


Deja una respuesta