Funciones Puras: Concepto y Ejemplos Prácticos
Clase 4 de 39 • Curso de Programación Funcional con Java SE
Contenido del curso
- 2

Funciones en Programación Funcional: Conceptos Básicos
03:15 - 3

Funciones como Ciudadanos de Primera Clase en Programación
02:39 - 4

Funciones Puras: Concepto y Ejemplos Prácticos
04:05 - 5

Efectos Secundarios en Programación y su Impacto en el Código
03:12 - 6

Funciones de Orden Superior en Programación
02:28 - 7

Funciones Lambda en Programación Funcional Java
03:30 - 8

Inmutabilidad de Datos en Programación Funcional con Java
11:16
- 9
Programación Funcional en Java SE: Conceptos y Prácticas
00:06 - 10

Programación Funcional en Java: Práctica y Ejemplos en IntelliJ
02:48 - 11

Programación Funcional en Java: Creación y Uso de Funciones
04:03 - 12

Programación Funcional con Predicados en Java
04:57 - 13

Interfaz Consumer y Supplier en Java: Uso y Ejemplos Prácticos
03:54 - 14

Funciones Java para Transformación de Datos y Operaciones Binarias
07:10 - 15

Creación y Uso de Interfaces Funcionales Personalizadas en Java
08:51 - 16

Métodos de Referencia en Programación Funcional Java
04:46 - 17

Inferencia de tipos en Java: funciones y métodos
03:53 - 18

Uso de Expresiones Lambda en Java: Sintaxis y Aplicaciones
12:47 - 19

Interfaz Funcional en Java: Creación y Uso de Métodos Default
04:59 - 20

Encadenamiento de Llamadas en Programación Orientada a Objetos
03:52 - 21

Composición de Funciones en Programación Funcional
06:06
- 22

Uso de la Clase Optional en Java para Manejo de Valores Nulos
12:59 - 23

Manipulación de Streams en Java: Operaciones y Limitaciones
10:18 - 24

Programación Funcional en Java: Uso de Streams y Operaciones Terminales
07:21 - 25
Operaciones de Stream en Java: Intermedias y Finales
05:05 - 26

Operaciones y Concurrente con Stream en Java
05:51 - 27
Operaciones Terminales en Java Streams
06:18 - 28
Operaciones Intermedias en Streams de Java
09:21 - 29

Conversión de Strings a Listas de Enteros en Java
06:14
- 30

Construcción de Proyecto para Buscar Empleo Usando APIs
01:17 - 31

Configuración y Uso de Gradle en Proyectos Java con IntelliJ
03:23 - 32

Creación de una Herramienta de Búsqueda de Trabajo en Terminal
01:51 - 33

Creación de Puntos de Entrada y Dependencias en Proyectos Java
05:54 - 34

Creación de APIs RESTful con Feign y Spring Boot
09:31 - 35

Creación de una Interfaz de Línea de Comandos con JCommander
13:05 - 36

Validación de Argumentos en Terminal con Clases en Ciel
04:32 - 37

Procesamiento de Argumentos y Solicitudes API en Java
11:38 - 38

Creación de API para búsqueda de empleos con Java y CLI
08:31
¿Qué es una función pura?
Las funciones puras, también conocidas como "pure functions" en inglés, son un concepto crucial en el mundo de la programación funcional. Estas funciones tienen una característica esencial: siempre producen el mismo resultado para los mismos parámetros de entrada, independientemente del contexto o del entorno en el que se ejecuten. Imagina una función simple que suma dos números; si siempre sumas 5 y 3, el resultado será siempre 8. No importa si la ejecutas en una computadora local o en un servidor remoto, o si es martes o jueves; el resultado es predecible y constante.
¿Por qué son importantes las funciones puras?
Las funciones puras presentan varias ventajas significativas en el desarrollo de software:
-
Determinismo: Puedes predecir fácilmente el resultado al saber los parámetros de entrada. Esto es invaluable cuando escribes pruebas para tu código, ya que permite crear casos de prueba consistentes y confiables.
-
Ausencia de efectos secundarios: Las funciones puras no alteran el estado del sistema. Esto significa que no cambian una base de datos, no crean archivos ni modifican otras partes del software. Su aislamiento del sistema garantiza que no afecten a otros componentes.
-
Facilidad de prueba y mantenimiento: Al no depender de factores externos ni modificar el estado del sistema, resulta más sencillo probar y mantener el código en proyectos complejos.
¿Cómo identificar una función pura?
La identificación de una función pura puede parecer sencilla, pero requiere atención a ciertos detalles:
-
Resultados Consistentes: La función debe retornar el mismo resultado siempre que se le pase el mismo conjunto de argumentos. Por ejemplo, una función que cálcula potencias siempre devolverá el mismo resultado para el mismo exponente.
-
Sin estados compartidos: Una función pura no debe depender de variables globales o datos que puedan cambiar durante la ejecución del programa. Esto asegura que su comportamiento se mantenga constante.
-
Sin efectos secundarios: Como ya mencionamos, una función pura no altera el estado del mundo externo. Esto significa que no debe interactuar directamente con el sistema de archivos, bases de datos, o interfaces de red.
Ejemplos prácticos de funciones puras
En el mundo de la programación, un ejemplo clásico de función pura en Java sería una que verifica la disponibilidad de un saldo:
public boolean isBalanceAvailable(double balance) {
return balance >= 0;
}
En este caso, isBalanceAvailable simplemente evalúa si el saldo es positivo. No cambia el estado del saldo ni afecta al sistema, lo que la convierte en una función pura.
¿Qué son las funciones impuras?
Las funciones que no poseen las características de las funciones puras se denominan funciones impuras. Estas pueden generar efectos secundarios o depender de variables externas, lo que las hace menos predecibles y más difíciles de probar y mantener. Un ejemplo clásico sería una función que escribe datos a una base de datos o que modifica un archivo de texto.
Interacción entre funciones puras e impuras
Existen reglas claras sobre cómo deben interactuar estas funciones entre sí:
-
Función pura invocando a otra pura: Esto es perfectamente válido y mantiene la previsibilidad y el determinismo de la ejecución.
-
Función pura invocando a una impura: Esto es algo que debe evitarse, ya que rompe la pureza de la función y su capacidad de generar resultados predecibles.
Comprender estas distinciones ayuda a los desarrolladores a crear aplicaciones más robustas y fáciles de mantener, promoviendo un diseño de software más limpio y eficiente.