En el vasto mundo de la programación, donde se busca la eficiencia y claridad del código, las funciones puras juegan un papel crucial. Se caracterizan por dos propiedades fundamentales que garantizan su comportamiento predecible y confiable:
Determinismo: Dada una entrada particular, una función pura siempre produce la misma salida. Esto significa que no importa cuántas veces llames a la función con los mismos argumentos; el resultado será siempre el mismo.
Ausencia de efectos secundarios: Estas funciones no alteran estados fuera de su propio entorno. Esto significa que no modifican variables globales ni interaccionan con elementos externos al código, como bases de datos o APIs.
A medida que exploramos estas funciones, descubrimos que son una pieza esencial en el diseño de software funcional, promoviendo un código más limpio y fácil de probar.
¿Cuáles son los efectos secundarios?
En contraste con las funciones puras, muchos programas dependen de efectos secundarios para cumplir con sus propósitos. Estos efectos secundarios, aunque esenciales en ciertos contextos, pueden hacer que el código sea impredecible. Algunos ejemplos incluyen:
Modificar variables globales: Acceder y alterar variables fuera del alcance local de una función puede resultar en funciones impuras.
Modificar parámetros: Cambiar los valores de los argumentos pasados a una función también genera efectos no deseados.
Solicitudes HTTP: Llamadas a servicios externos o APIs pueden producir cambios basados en respuestas externas.
Impresión de mensajes: Tanto console.log como alert son ejemplos de funciones que producen salidas visibles o auditables.
Manipulación del DOM: Interacciones con la estructura del documento en navegadores, alterando su contenido o apariencia.
Consultas de tiempo: Obtener la hora o fecha actual afecta al estado del programa de forma impredecible.
Aunque estos efectos pueden parecer negativos, es importante recordar que muchos son necesarios para las aplicaciones prácticas.
¿Cómo estructuramos una función pura?
Para entender mejor el concepto de función pura, es útil observar un ejemplo práctico. Imagina una función simple que sume dos números:
functionsum(a, b){return a + b;}
Esta función es pura porque:
Siempre devuelve el mismo resultado cuando se le proporcionan los mismos argumentos.
No produce efectos secundarios ya que no altera ningún estado global ni interactúa con el entorno externo.
Sin embargo, ¿qué ocurre cuando introducimos una línea de código que imprime un valor en la consola?
functionsumYLog(a, b){console.log(a);return a + b;}
Al agregar console.log, la función deja de ser pura, ya que ahora produce un efecto secundario.
¿Por qué son importantes las funciones puras?
Las funciones puras son esenciales en programación porque permiten:
Facilidad de prueba: Como no dependen del estado del programa ni lo modifican, son más fáciles de aislar y probar.
Previsibilidad y confiabilidad: Siempre ofrecen el mismo resultado para los mismos inputs, facilitando la comprensión del flujo del programa.
Optimización y paralelismo: Facilitan optimizaciones como la memoización (almacenamiento de resultados previos) y son ideales para programas concurrentes o paralelizados.
Funciones como square o attain, que realizan operaciones matemáticas básicas con un único parámetro, son ejemplos clásicos de funciones puras con resultados predecibles.
¿Qué ocurre con la combinación de funciones puras?
La combinación de funciones puras también resulta en funciones puras. Por ejemplo, combinando las funciones square y attain, podemos crear un árbol robusto de funciones:
functionsquare(x){return x * x;}functionattain(y){return y +10;}const number =5;const finalResult =attain(square(number));// finalResult será 35
Esta combinación sigue manteniendo la pureza y ofrece la garantía de resultados constantes sin efectos adicionales.
En resumen, el balance entre funciones puras e impuras es vital para escribir un código robusto y escalable. Al comprender y aplicar estos conceptos, los programadores pueden crear software más predecible, fácil de mantener y testar. ¡Sigue explorando y refinando tus habilidades en programación!
las funciones puras son más predecibles y fáciles de depurar ya que no tienen efectos secundarios
las funciones impuras pueden ejecutar variables globales pero su predictibilidad es menor
las funciones puras son ideales para procesamiento de datos y lógica sin efectos secundarios, mientras que las funciones impuras se utilizan para tareas que requieren interacción con el entorno externo.
En JavaScript (y en programación funcional en general), las funciones se pueden clasificar como puras o impuras dependiendo de si cumplen con ciertas características.
Una función pura es una función que:
Siempre produce el mismo resultado dado el mismo conjunto de argumentos.
No tiene efectos secundarios, es decir, no modifica ninguna variable externa, ni depende de variables externas que puedan cambiar.
Ejemplo de función pura:
function suma(a, b) {
return a + b;
}
En este ejemplo, la función suma siempre devuelve el mismo resultado para los mismos valores de a y b, y no afecta ni depende de ninguna otra variable fuera de su alcance.
Una función impura es una función que:
Puede producir diferentes resultados aún si se le pasan los mismos argumentos.
Tiene efectos secundarios, como modificar una variable externa, hacer una llamada a una API, modificar el DOM, etc.
Ejemplo de función impura:
let contador = 0;
function incrementarContador() {
contador += 1;
return contador;
}
En este ejemplo, la función incrementarContador es impura porque:
Depende de la variable externa contador, y el valor devuelto depende del estado anterior de esta variable.
Modifica la variable externa contador, lo que constituye un efecto secundario.
Resumen
Función pura: Predecible y sin efectos secundarios. Ideal para programación funcional.
Función impura: Su resultado puede variar y puede modificar el estado externo. Es más común en programación imperativa.
Mantener funciones puras es útil para hacer que el código sea más predecible y fácil de probar, mientras que las funciones impuras son necesarias para interactuar con el mundo externo (como modificar el DOM, hacer solicitudes HTTP, etc.).
la combinación de 2 o más funciones puras da como resultado una función re pura! 🌟🤓🤣
jajaj
Con esta clase me surge una pregunta, de que nos sirve saber si una función es pura o impura? 🤔
Cuando tengamos funciones impuras en nuestro código es importante saberlo por que como son impredecibles pueden en ocasiones demorar bastante en responder y eso genera condiciones de carrera que hace que nuestro código se comporte inesperadamente. creeme es importante cuando depuremos código complejo.
yj
Algunas observaciones:
Una función es impura si modifica algo fuera de su scope, no exclusivamente el scope global. Fuente → 🔗
Las funciones impuras alteran los argumentos. Los parámetros son los datos que acepta la función, definidos en su declaración e.g. function sum(num1, num2) {…}. Los argumentos son los valores en sí e.g sum(23, 31) Más info → 🔗
Obtener la fecha causa un side effect ya que la funcion Date() genera un nuevo valor cada vez que se llama, no se puede determinar su salida. Lo mismo aplicaría para el tiempo y funciones como Math.random() Fuente → 🔗
Al imprimir mensajes modificamos el estado de otros objetos como console es decir, alteramos scopes externos. Fuente → 🔗
Las funciones impuras no son algo negativo, son necesarias e inevitables en algunos casos. Lo importante en este punto es:
Identificar cuando causamos efectos secundarios.
Evitarlos cuando no son realmente necesarios en nuestro propósito
Al necesitarlos, conocer y manejar consecuencias como salidas indeterminadas, tiempos de respuesta desconocidos, alteración del DOM, etc.
Entender esto nos ayuda a escribir código legible, escalable, depurable, y a crear productos seguros, confiable y de mejor rendimiento.
Excelente
Imagina que las funciones son como máquinas expendedoras.
Una función pura es como una máquina que entrega siempre el mismo tipo de bebida cuando introduces la misma moneda: no importa el día o la hora, la bebida será la misma y no altera nada de la máquina.
En cambio, una función impura es como una máquina que, si la usas varias veces, puede cambiar su contenido o incluso puede hacer que se agoten las bebidas. Por ejemplo, si añades más monedas y cambias lo que hay dentro, la próxima vez que la uses, el resultado puede ser diferente.
Esto ilustra cómo las funciones en programación pueden ser predecibles (puras) o con efectos secundarios (impuras), afectando el comportamiento del programa.
Pensé que la última era impura, ya que tiene como efecto secundario la impresión en consola
Si estuviera dentro de la misma función, pasaría a ser impura, pero en si lo que está haciendo es que finalResut lo esta definiendo con dos funciones puras, pero el console.log es totalmente aparte
Me costó comprender el concepto de función pura, especificamente la afirmacion: "Una función es pura si, dados los mismos valores de entrada, siempre produce la misma salida y no causa efectos secundarios."
.
Quiero ser más especifico sobre la afirmación anterior y ayudarte a comprender mejor esta. Se refiere a que por más que ejecutes una función pura, siempre dará el mismo resultado, no cambiará.
.
¿Recuerdas el código que nos mostraron en el curso sobre como generar un número aleatorio usando Math.random() ? bueno, si creas una función que al ejecutarse genere un número aleatorio entonces la función no es pura, adivinas el por que?
.
Claro! esto se debe a que la función no será pura por la misma razón por la que el resultado siempre será distinto en cada ejecución, y no cumple con la afirmación de obtener el mismo resultado en cada ejecución en el concepto de una función pura.
.
En pocas palabras, una funcíon pura siempre deberá devolver el mismo resultado sin importar las veces que se ejecute esta misma. La única manera de obtener un resultado distinto será cuando alimentes la función con valores distintos.
Increible explicacion gracias!
Resumen:
Funciones vs Métodos:
Funciones: Independientes, no necesitan pertenecer a un objeto.
Métodos: Funciones dentro de un objeto, usan this para acceder a las propiedades del objeto.
Ejemplo:
const persona ={nombre:'Ana',saludar:function(){return'Hola, soy '+this.nombre;}};console.log(persona.saludar());// "Hola, soy Ana"
Pasar Funciones como Argumentos (Callbacks):
Callback: Función que se pasa a otra función y se ejecuta después de completar una tarea.
Ejemplo:
functionprocesarOperacion(a, b, callback){const resultado = a + b;callback(resultado);}functionmostrarResultado(resultado){console.log('El resultado es: '+ resultado);}procesarOperacion(5,3, mostrarResultado);// "El resultado es: 8"
Retornar Funciones:
Puedes devolver funciones para crear comportamientos reutilizables y personalizados.
La combinación de funciones puras sigue siendo pura.
square y addTen son funciones puras, por lo que su combinación también lo es.
Próximos Pasos
Identificar y practicar la creación de funciones puras.
Evitar efectos secundarios en la medida de lo posible.
Comprender y utilizar las funciones puras para mejorar la previsibilidad y testabilidad del código.
Explorar más ejemplos y casos de uso en desarrollo de software.
Preguntas para Reflexionar
¿Es esta función pura?function square(x) {
return x * x;
}
Respuesta: Sí, es una función pura.
¿Qué pasa si agregamos console.log dentro de la función?
Respuesta: Se convierte en una función impura debido al efecto secundario de imprimir en consola.
¿Las combinaciones de funciones puras siguen siendo puras?
Respuesta: Sí, la combinación de funciones puras mantiene la pureza de la función resultante.
Tengo una duda:
Según los apuntes de la clase, una función es impura si tiene algún side effects entre los que está el de: Modificar parámetros. Pero en el min 8:40, Estefany comenta que la siguiente función es pura:
¿No debería ser impura? Se modifican sus parámetros.
Si me podéis ayudar os lo agradecería chicos!
Este es un ejemplo de funcion impura dado la modificacion de un parametro. No confundamos el parametro con el valor de retorno de una funcion.
functionaddToArray(array, element){ array.push(element);// Modifica el array original pasado como argumentoreturn array;}functionnombreDeLaFuncion(param1, param2,...){// Cuerpo de la función// Instrucciones que se ejecutan cuando se llama a la función// (Opcional) Valor de retornoreturn valor;}
Hola, esta función sigue siendo pura dado que no modifica los parámetros, solo lo utiliza para realizar un calculo interno
Funciones puras son aquellas que cumplen dos reglas:
Mismo input, mismo output.
No tienen efectos secundarios; es decir, no modifican nada fuera de ellas.
Funciones impuras son aquellas en las que ocurre alguno de estos dos casos:
El resultado depende de algo externo.
Pueden causar efectos secundarios; es decir, modifican cosas fuera de su propio ámbito.
Sigue siendo pura porque no esta modificando, solo retorna valores sin alterar a otros, ejemplo:
<u>Pura:</u>
// Función purafunctionsquare(x){return x * x
}functionaddTen(y){return y +10}const number =5// Combinanción de dos funciones puras.const finalResut =addTen(square(number))console.log(finalResut)
<u>Impura:</u> Acá cambia el valor original de la variable que se le pasa como entrada. En lugar de crear una copia o un resultado nuevo, altera el dato inicial, lo cual es un efecto secundario porque afecta al objeto original.
const auto ={color:'rojo'}functioncambiarColor(objeto){ objeto.color='azul'// Side effect}
Las funciones puras en JavaScript son predecibles, siempre devuelven el mismo resultado para los mismos argumentos y no tienen efectos secundarios, lo que facilita las pruebas. Las impuras interactúan con el entorno exterior, modifican estados globales o producen efectos secundarios (como console.log o manipulación del DOM).