Pensamiento estilo Ramda: lentes

1. Primeros pasos
2. Combina las funciones
3. Uso parcial (curry)
4. Programación declarativa
5. Notación por excelencia
6. Inmutabilidad y objetos.
7. Inmutabilidad y matrices
8. lentes
9. Conclusión


Esta publicación es la octava de una serie de artículos sobre programación funcional llamada Ramda Style Thinking.


En las partes sexta y séptima aprendimos a leer, actualizar y transformar las propiedades de objetos y elementos de matrices en un estilo declarativo e inmutable.


Ramda también proporciona una herramienta más general para realizar estas operaciones, llamadas lentes.


¿Qué tipo de lentes?


La lente combina la función getter y la función setter en un mecanismo. Ramda proporciona un conjunto de características para trabajar con lentes.


Podemos pensar en las lentes como algo que se enfoca en una parte específica de una gran estructura de datos.


¿Cómo puedo crear una lente?


La forma principal de crear lentes en Ramda es con la función de lente . lens toma una función de captador y una función de ajuste y devuelve una nueva lente.


 const person = { name: 'Randy', socialMedia: { github: 'randycoulman', twitter: '@randycoulman' } } const nameLens = lens(prop('name'), assoc('name')) const twitterLens = lens( path(['socialMedia', 'twitter']), assocPath(['socialMedia', 'twitter']) ) 

Aquí usamos métodos prop y path como nuestras funciones assocPath , y assoc y assocPath como nuestras funciones assocPath .


Tenga en cuenta que duplicamos los argumentos con el nombre de la propiedad y la ruta a la propiedad deseada para estas funciones. Afortunadamente, Ramda proporciona atajos geniales para las situaciones de uso de lentes más comunes: lensProp , lensPath y lensIndex .


  • lensProp crea una lente que se enfoca en una propiedad de objeto
  • lensPath crea una lente que se enfoca en una propiedad adjunta de un objeto
  • lensIndex crea una lente que se centra en un elemento de matriz

Podemos reescribir nuestras lentes anteriores usando lensProp y lensPath :


 const nameLens = lensProp('name') const twitterLens = lensPath(['socialMedia', 'twitter']) 

Es mucho más simple y elimina duplicados. En la práctica, descubrí que casi nunca necesito la función de lens original.


¿Qué puedo hacer con todo esto?


Bien, genial, creamos un par de lentes. ¿Qué podemos hacer con ellos ahora?


Ramda proporciona tres funciones de lente.


  • la vista lee el valor de la lente
  • set actualiza el valor de la lente
  • sobre aplica la función de transformación a la lente

 view(nameLens, person) // => 'Randy' set(twitterLens, '@randy', person) // => { // name: 'Randy', // socialMedia: { // github: 'randycoulman', // twitter: '@randy' // } // } over(nameLens, toUpper, person) // => { // name: 'RANDY', // socialMedia: { // github: 'randycoulman', // twitter: '@randycoulman' // } // } 

Tenga en cuenta que set y over devolver todo el objeto con el valor modificado en el que se enfocó su lente.


Conclusión


Las lentes pueden ser útiles si tenemos una estructura de datos bastante compleja de la que queremos abstraernos al invocar el código. En lugar de proporcionar una estructura o proporcionar getters, setters y transformadores para cada propiedad disponible, podemos proporcionar lentes en su lugar.


El código del cliente puede trabajar aún más con nuestras estructuras de datos mediante el uso de view , set y over sin un enlace a la forma exacta de la estructura de datos.


Siguiente


Ahora sabemos de Ramda mucho de todo lo que proporciona; en general, suficiente para hacer la mayoría de las operaciones que realizamos en nuestros programas. El artículo final de esta serie ofrece una visión general de lo que se ha estudiado y menciona algunos otros temas que quizás deseemos explorar por nuestra cuenta.

Source: https://habr.com/ru/post/es415035/


All Articles