Ramda Style Thinking: Lentes

1. Primeiros passos
2. Combine as funções
3. Uso parcial (currying)
4. Programação declarativa
5. Notação quintessencial
6. Imutabilidade e objetos
7. Imutabilidade e matrizes
8. Lentes
9. Conclusão


Este post é o oitavo de uma série de artigos sobre programação funcional chamada Ramda Style Thinking.


Nas sexta e sétima partes, aprendemos a ler, atualizar e transformar as propriedades de objetos e elementos de matrizes em um estilo declarativo e imutável.


O Ramda também fornece uma ferramenta mais geral para executar essas operações, chamadas lentes.


Que tipo de lentes?


A lente combina a função getter e a função setter em um mecanismo. O Ramda fornece um conjunto de recursos para trabalhar com lentes.


Podemos pensar nas lentes como algo que se concentra em uma parte específica de uma grande estrutura de dados.


Como posso criar uma lente?


A principal maneira de criar lentes no Ramda é com a função de lente . lens recebe uma função getter e uma função setter e retorna uma nova 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']) ) 

Aqui, usamos métodos prop e path como nossas funções assocPath , e assoc e assocPath como nossas funções assocPath .


Observe que duplicamos os argumentos com o nome da propriedade e o caminho para a propriedade desejada para essas funções. Felizmente, o Ramda fornece atalhos interessantes para as situações mais comuns de uso de lentes: lensProp , lensPath e lensIndex .


  • lensProp cria uma lente que foca na propriedade de um objeto
  • lensPath cria uma lente que foca na propriedade anexada de um objeto
  • lensIndex cria uma lente que se concentra em um elemento da matriz

Podemos reescrever nossas lentes acima usando lensProp e lensPath :


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

É muito mais simples e elimina duplicatas. Na prática, descobri que quase nunca preciso da função original da lens .


O que posso fazer com tudo isso?


Ok, ótimo, criamos um par de lentes. O que podemos fazer com eles agora?


O Ramda oferece três funções de lente.


  • view lê o valor da lente
  • set atualiza o valor da lente
  • over aplica a função de transformação na 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' // } // } 

Observe que set e retornar o objeto inteiro com o valor alterado em que sua lente estava focada.


Conclusão


As lentes podem ser úteis se tivermos uma estrutura de dados bastante complexa da qual queremos abstrair ao chamar o código. Em vez de fornecer uma estrutura ou fornecer getters, setters e transformadores para cada propriedade disponível, podemos fornecer lentes.


O código do cliente pode ainda trabalhar com nossas estruturas de dados através do uso de view , set e over sem um link para a forma exata da estrutura de dados.


Seguinte


Agora sabemos sobre o Ramda muito de tudo que ele fornece; em geral, o suficiente para executar quase todas as operações que realizamos em nossos programas. O artigo final desta série fornece uma visão geral do que foi estudado e menciona alguns outros tópicos que desejamos explorar por conta própria.

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


All Articles