Las lentes son una forma potente y elegante de centrarse y manipular partes de estructuras de datos inmutables en la programación funcional. Proporcionan un mecanismo para obtener y establecer valores dentro de objetos o matrices anidados sin alterar los datos originales.
Una lente es una abstracción de primera clase que proporciona una forma de acceder y actualizar las partes de una estructura de datos. Una lente normalmente se define mediante dos funciones: un captador y un definidor.
Las lentes son particularmente útiles para trabajar con estructuras de datos inmutables, ya que permiten realizar cambios sin mutar los datos originales.
Comencemos con una implementación básica de lentes en JavaScript.
Una lente se puede implementar como un objeto con los métodos get y set.
const lens = (getter, setter) => ({ get: (obj) => getter(obj), set: (val, obj) => setter(val, obj), }); const prop = (key) => lens( (obj) => obj[key], (val, obj) => ({ ...obj, [key]: val }) ); // Usage const user = { name: 'Alice', age: 30 }; const nameLens = prop('name'); const userName = nameLens.get(user); console.log(userName); // 'Alice' const updatedUser = nameLens.set('Bob', user); console.log(updatedUser); // { name: 'Bob', age: 30 }
En este ejemplo, el accesorio crea una lente que se enfoca en una propiedad específica de un objeto. El método get recupera el valor de la propiedad y el método set actualiza el valor y devuelve un nuevo objeto.
Las lentes se pueden componer para funcionar con estructuras de datos anidadas. Aquí crearemos una utilidad para componer lentes.
const composeLenses = (outerLens, innerLens) => ({ get: (obj) => innerLens.get(outerLens.get(obj)), set: (val, obj) => outerLens.set(innerLens.set(val, outerLens.get(obj)), obj), }); // Usage with nested data const addressLens = prop('address'); const cityLens = prop('city'); const userAddressCityLens = composeLenses(addressLens, cityLens); const user = { name: 'Alice', address: { city: 'Wonderland', zip: '12345', }, }; const userCity = userAddressCityLens.get(user); console.log(userCity); // 'Wonderland' const updatedUser = userAddressCityLens.set('Oz', user); console.log(updatedUser); // { name: 'Alice', address: { city: 'Oz', zip: '12345' } }
En este ejemplo, composeLenses nos permite crear una lente que se enfoca en la propiedad de la ciudad dentro del objeto de dirección. Esto permite el acceso a propiedades anidadas y actualizaciones de forma modular y reutilizable.
Las lentes son particularmente útiles en escenarios donde la inmutabilidad y la manipulación de datos modulares son importantes, como en la gestión de estado para aplicaciones front-end.
En una aplicación React, las lentes se pueden usar para administrar las actualizaciones de estado de una manera más funcional y predecible.
import React, { useState } from 'react'; const App = () => { const [state, setState] = useState({ user: { name: 'Alice', address: { city: 'Wonderland', }, }, }); const userLens = prop('user'); const addressLens = prop('address'); const cityLens = prop('city'); const userAddressCityLens = composeLenses(userLens, composeLenses(addressLens, cityLens)); const updateCity = (newCity) => { const newState = userAddressCityLens.set(newCity, state); setState(newState); }; return (); }; export default App;City: {userAddressCityLens.get(state)}
En este ejemplo, utilizamos lentes para modularizar el acceso y la actualización de la propiedad de la ciudad anidada dentro del estado del componente React. Este enfoque hace que las actualizaciones de estado sean más predecibles y más fáciles de administrar.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3