¿Alguna Vez Han Escuchado El Término “Función Pura”? ¿Y “Efecto Secundario”? Si La Respuesta Es Sí проведут вентиляцию Веродемент Les Han Dicho Que Los Efectos Secundarios Son Malos Y Deben Evitarlos Ada Costa. ESTE EL ALCELSA, SI ESTANAN USANDO JavaScript ES MUY Вероятная Que quieran Cavar Esos Efectos (Esperialmente Si Les Pagan Por Usar JavaScript) Обучению La Solución No Es Evitar Estos Efectos Sino ControlArlos. Voy MOGTRARLES ALGUNAS MANERAS EN LAS QUE PUEDEN Combinar Los Efectos Secundarios Y LAS Funciones Puras.
Antes de Empezar Vamos Repasar Algunos Conceptos, Para Que Todos Estén Al Tanto.
Концепция
Función Pura.
PARA No Extenderme Mucho Diré Que Una Función Pura Es Aceella Cuyo Resuldado ES DEATINADO POR SUS PAPAMETROS y Нет Tiene Ningún Efecto наблюдаемое Fuera de Su ámbito. El Mejor englishio que roveen es la predictibilidad, dado un courdunto de Valores de Entrada Siempre devolverán El Mismo Resuldado. Veámos algunos ejemplos.
ESTA ES UNA Función Pura.
function increment(number) { return number + 1; }
ESTA нет.
Math.random();
Y SEN SON Сын спонтистил.
const A_CONSTANT = 1; function increment(number) { return number + A_CONSTANT; } module.exports ={ increment };
function a_constant() { return 1; } function increment(number) { return number + a_constant(); }
Efecto Secundario
Llamaremos Efecto Secundario Custquier Cosa que afecte la “Pureza” de Una Función. La Lista Incluye Pero Нет Está Limitada A:
- Cambiar (Mutar) Переменная UNA Externa En Custerquier Profible.
- Masturar Cosas En La Pantalla.
- Модифицирующий Archivo ООН.
- HTACER UNA PETTORYON HTTP.
- CREAR OUT PRECESO.
- Grougar Datos ru Уна База de de datos.
- Ejecutar Funciones Con Efectos Secundarios.
- Cambiar El Dom.
- Алеаторидд.
Обучению, Custquier Cosa Que Afecte El “Estado del Mundo Exterior” Es Efecto Secundario.
¿Cómo Combinamos Esas Cosas?
ApueSto a que todavía están pensando en esa lista de efectos, incluye básicamente todo lo que hace que javascript море útil a aún así heak Que Dicen Debes Evitarlos Cómo Sea. Нет Tengan Medo, Yo Les Tengo Algunas Sugerenciass.
Composición de Funciones
Otra Forma de Destripr lo que voy decir Sería Esta: Shatación de Repainabilidades. Este Es La Manera Más просты. Si Tienen La Oportunidad de Searar On Cálculo/Transformación de un efecto Образование Trasladen ESA Transformación a una función y usen el butevalado en el bloque que oniene el efecto.
EN OCANSIONS PUEDE SER TAN SIST COMO ESTE CASO.
function some_process() { const data = get_data_somehow(); const clean_data = computation(data); const result = save(clean_data); return result; }
Ahora Bien, quey_process
Sigue Siendo Una Función Impuara Pero Eso Está Bien, ESTO ES JavaScript, No Necesitamos que Todo Sea Puro, Lo Que Queremos Es Mantener La Cordura. AL SESTERAR LOS EFECTOS DE ООН CáLCULO PURO CEMOS CREEADOS TRES FUNCIONES Независимые que resuelven ООН проблемныйa a ля вез. PuEden Incluso IR Más Allá y utilizar una función como трубка Para Eliminar Esos Valores Intermedios Y Crage Una Composición Más Directa.
const some_process = pipe(get_data_somehow, computation, save);
Pero Ahora Hemos Credo Otro Проблема, ¿ Qué Pasa Si Queremos insertar un efecto en medio de esa cadena? ¿ Qué Hacemos? Bueno, Si Una Función Nos Metió en este Проблема yo digo que usemos otra para salir. ЭСТО СЕРВИРА.
function tap(fn) { return function (arg) { fn(arg); return arg; } }
ESTA Función nos permitirá colocar un efecto en nuestra cadena sin afectar la composición.
const some_process = pipe( get_data_somehow, tap(console.log), computation, tap(a_side_effect), save );
Algunos dirán que este tipo de cosas hacen que La Lógica de la Función Esté Esparcida POR TODOS LADOS Y AHORA TIENEN Que Buscar Más de Necesario Para Saber Que Hace La Función. Mí No Me Molesta Musto, Es Asunto De Preferenciass. Suficatee de Eso, hablemos de los argentos de la función Нажмите
Mirénlo Нажмите (FN)
Acepta Una Función Cómo Parámo, Vamos a Vom Cómo Podemos Usar Eso Para Otras Cosas.
HAS Que Otro SE Encargue defalea
Como Todos Sabemos La Vida Нет Siempre Es Tan Simple, Habrá Ocsiones En Las Que Simplemente No PodeMos Hacer ESA Bonita Cadena de Funciones. VECES Necesitamos colocar un efecto en medio de un preceso y Cuando Eso Pasa Siempre Podemos Hacer Trampa. JavaScript NOS Perreate USAR LAS Funciones Como Si Fuera ООН Valor Cómun (Como Un Número) Y ESTO NOS Da La Oportunidad de Hacer Algo Gracioso Como Usar Una Función Como Parámetro de Otra Función (Lo Que llaman Callback). De esta forma una función “Pura” Puede Mantener SU PREDITTIBILIDAD Y AL MIMSO TIEMPO Rooveder La Flexibilidad De Ejecutar Un Efecto Cuando Sea Удобно.
Digamos POR EJEMPLO que TeneMos Una Función Que Ya Es Pura Que Transforma Los Valores de Una Colección Pero Por Por Alguna Razón Ahora Necesitamos Escribir en un un un el valor Оригинал y el nuevo pero justo después de la Transformación. Lo que podemos hacer es añadir una función como parámetro y llamarla en al momento justo.
function transform(onchange, data) { let result = Array.isArray(data) ? [] : {}; for(let key in data) { result[key] = data[key] + 1; onchange(data[key], result[key]); } return result; }
ESTO Técnicamente Comple Los Requisitos de Una Función Pura, EL Resultsado (y Comportamiento) de la Función Está Dentianado Por Sus Parámetros, Sólo que da la Surveyidad que uno de esos parametros es una función que parámetros un efecto secundario. De nuevo, la meta No Es Peleh Contra La Naturaleza de JavaScript Hacer Que Todo Sea 100% Puro, Lo Que queremos ES Controllar estos efectos, en este caso quien controla si se debe tener une efecto es quien llama a nuestra función Y проверенного Лос-Параметс. Un Beneficio Extra Que TeneMos de Esto Es Que Podemos Reusar La Función En Pruebas Unitarias SIN Tener Que Instalar Una Libresería Extra, Lo único que TeneMos Que Hacer Sumistrar Parametros y Evaluar El Restulactado.
Tal Vez SE ESTÉN PREGUNTANDO POR QUÉ PONGO EL COLLBACK COMO Primer Parámetro, ES Cuestión de Prefitectia. Si Ponen El Valor que Cambia Con Más Frecuencia en la última posición se les hace más fácil Акпликар Parcialmente Los Argentos, Con Esto Me Refiero Vincular Parámetros A UNA Función Sin Ejecutarla. PUEDEN POR EJEMPLO USAR трансформировать
PARA CREAR UNA FUNCION ESCESIALIZADA Que Ya Tenga El Valor Onchange
y que sólo espee el purging данные
.
Efecto Tardío
La Idea Aquí es Reelasar Lo неизбежно. En lugar de ejecutar un efecto en seguida lo que queremos hacer en is darle la poportunidad a quiena us nuestra función de decidir cuándo se debe ejecutar el efecto. PodeMos Hacer de Varias Maneras.
Devolviendo funciones
COMO Mencioné Antes, EN JavaScript PodeMos Traatar LAS Funciones Como Un Valor Y Una Cosa Que Hacemos Con Frecuencia ES DEVOLVER Valores de Funciones. ESTOY HALLANDO DE FUNCIONES QUE DEVULVEN Funciones, Ya Vimos Lo útil Que Puede Ser Y No Es Tan Inusual Si Lo Piensan Bien, ¿Cuántas Veces Han Visto Algo Como Esto?
function Stuff(thing) { // preparar datos return { some_method() { // código... }, other() { // código... } } }
ESTO ES UNA Especie de Constructor. ANTES, EN LA ERA DEL ES5 ESTA ERA ERA DE LAS MANERAS EN LAS QUE SE DE LAS IMATAR EL COMPORTAMIREE DE UNA CLASE. ES UNA Función нормальная que devualve un objeto, y como todos sabemos los objetos pueden tener métodos. Lo que queremos hacer en muy pareCido, queremos convertire un bloque que oniene un efecto y devolverlo.
function some_process(config) { /* * Hacemos algo con `config` */ return function _effect() { /* * aquí podemos tener cualquier cosa */ } }
Así es Como Le Damos La Oportunidad a quien llama nuestra función de usar el efecto cuanto quieran, y pueden incluso pasarlo atras funciones o UsArla en una cadena (como la que hicimos antes). Este Patron No Es Muy Común, Tal Vez Es Porque Podemos Usar Otros Métodos Para Lograr La Misma Meta.
Усандо эструкуруз
Otra Forma de Reterasar ООН Efecto ES Envolverlo EN UNA Estructura. LO que queremos hacer es traatar un efecto como un valor cualatara, tener la habilidad de manipulllo e incluso combinarlo con otros efectos de una manera “Segura,” ES DECIR SIN EJECUTARLOS. Веробанеменница Я Хан Висто Эсте Патрон Антес, ООН Ejemplo que Pueho Dar es con lo que llaman “наблюдается.” VEAN ESTE EJEMPLO que Utiliza RXJS.
// extraído de: // https://www.learnrxjs.io/operators/creation/create.html /* Incrementa el valor cada segundo, emite valores de los números pares */ const evenNumbers = Observable.create(function(observer) { let value = 0; const interval = setInterval(() => { if (value % 2 === 0) { observer.next(value); } value++; }, 1000); return () => clearInterval(interval); });
Эль Результаты DE Наблюдаемый.create
Нет Sólo Retrasa La Ejecución de Setinterval
Sino que también nos da La Oportunidad de Usar Еврнумчик.Pipe
PARA CREAR UNA CADENA DE STAYBLES QUE TAMBIÉN PUEDEN PUEDEN OTROS EFECTOS. Claro Que Los Costable Y Rxjs Нет сына La única Manera, Nosotros PodeMos Crag Nuestro Propia Estructura Para Los Efectos. Si Queremos Crage Nuestros Propios Efectos Lo único que ececesitamos es una función para ejecutarlos y otra para combinarlos.
function Effect(effect) { return { run(...args) { return effect(...args); }, map(fn) { return Effect(arg => fn(effect(arg))); } }; }
Пуде que no Sea Musto Pero Esto Es Suficatee Para Tener Algo útil. Con Esto Ya PuEden Empezar A Combinar Efectos Sin Cancar Cambios En Su Ambiente. Por ejemplo.
const persist = (data) => { console.log(`guardando ${data} en la base de datos...`); return data.length ? true : false; }; const show_message = result => result ? console.log('todo bien') : console.log('no estamos bien'); const save = Effect(persist).map(show_message); save.run('algo'); // guardando algo en la base de datos... // todo bien save.run(''); // guardando en la base de datos.... // no estamos bien
Si Alguna Vez Han Usado Array.map
Para Transformar Datos de un a arreglo se sentirán como en casa usando Эффект
, ToDo Lo Que Tienen Que Hacer ES SUMUSTRAR LOS EFECTOS Y AL Final De La Cadena Tendrán Una Función Que Sabrá Que Hacer Cuando Estén Listos Para Ejecutarla.
ESTA ES Sólo Una Muestra de lo que pueden hacer con Эффект
Si Quieren Armender ООН Покос Мас Бусень Поб Ах Эль Термино функтор
y Ио Монад
Ahí Tienen Diversión Para Un Buen Rato.
¿Ahora Que?
Ahora Espero que PueDan Echarle un vistazo al enway que astá al final, es en articulo en ruglés que explica con mejor detalle todo esto que yo aque aquí.
Espero que Ahora Tengan El Conocimiento Y La Confianza Para Empezar Функции Escribir Puras EN SU Código Y Poder Combinarlas Con Los Efectos Prácticos Que PueDen Hacer Con JavaScript.
Фуэнте
Gracias Por Su Tiempo. Si Este Artículo Les Pareció útil y quieren Apoyar Miss Esfuerzos Para Crage Más Contenido, PuEden Dejar Una Propina En купи мне кофе ☕ .
Оригинал: “https://dev.to/vonheikemen/como-combinar-efectos-y-funciones-puras-en-javascript-38go”