1. Premiers pas
2. Combinez les fonctions
3. Utilisation partielle (curry)
4. Programmation déclarative
5. Notation quintessentielle
6. Immuabilité et objets
7. Immuabilité et réseaux
8. Objectifs
9. Conclusion
Cet article est le huitième d'une série d'articles sur la programmation fonctionnelle appelée Ramda Style Thinking.
Dans les sixième et septième parties, nous avons appris à lire, mettre à jour et transformer les propriétés des objets et des éléments des tableaux dans un style déclaratif et immuable.
Ramda fournit également un outil plus général pour effectuer ces opérations, appelé lentilles.
Quel genre de lentilles?
L'objectif combine la fonction getter et la fonction setter en un seul mécanisme. Ramda fournit un ensemble de fonctionnalités pour travailler avec des objectifs.
Nous pouvons considérer les lentilles comme quelque chose qui se concentre sur une partie spécifique d'une grande structure de données.
Comment créer une lentille?
La principale façon de créer des objectifs dans Ramda est avec la fonction objectif . lens
prend une fonction getter et une fonction setter et renvoie un nouvel objectif.
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']) )
Ici, nous utilisons les méthodes prop
et path
comme fonctions assocPath
, et assoc
et assocPath
comme fonctions assocPath
.
Notez que nous avons dupliqué les arguments avec le nom de la propriété et le chemin d'accès à la propriété souhaitée pour ces fonctions. Heureusement, Ramda fournit des raccourcis intéressants pour les situations d'utilisation d'objectif les plus courantes: lensProp , lensPath et lensIndex .
lensProp
crée une lentille qui se concentre sur une propriété d'objetlensPath
crée une lentille qui se concentre sur une propriété attachée d'un objetlensIndex
crée une lentille qui se concentre sur un élément du tableau
Nous pouvons réécrire nos objectifs ci-dessus en utilisant lensProp
et lensPath
:
const nameLens = lensProp('name') const twitterLens = lensPath(['socialMedia', 'twitter'])
C'est beaucoup plus simple et élimine les doublons. En pratique, j'ai constaté que je n'avais presque jamais besoin de la fonction d' lens
origine.
Que puis-je faire avec tout ça?
D'accord, super, nous avons créé une paire de lentilles. Que pouvons-nous en faire maintenant?
Ramda propose trois fonctions d'objectif.
- la vue lit la valeur de l'objectif
- set met à jour la valeur de l'objectif
- applique plus la fonction de transformation à la lentille
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' // } // }
Notez que set
et renvoyer l'objet entier avec la valeur modifiée sur laquelle votre objectif était focalisé.
Conclusion
Les lentilles peuvent être utiles si nous avons une structure de données assez complexe dont nous voulons faire abstraction lors de l'appel du code. Au lieu de fournir une structure ou des getters, setters et transformers pour chaque propriété disponible, nous pouvons fournir des lentilles à la place.
Le code client peut continuer à fonctionner avec nos structures de données grâce à l'utilisation de la view
, de la set
et over
sans lien vers la forme exacte de la structure de données.
Suivant
Maintenant, nous connaissons Ramda beaucoup de tout ce qu'il fournit; en général, de quoi faire la plupart des opérations que nous effectuons dans nos programmes. Le dernier article de cette série donne un aperçu de ce qui a été étudié et mentionne d'autres sujets que nous pourrions souhaiter explorer par nous-mêmes.