Denken im Ramda-Stil: Linsen

1. Erste Schritte
2. Kombinieren Sie die Funktionen
3. Teilweise Verwendung (Currying)
4. Deklarative Programmierung
5. Grundlegende Notation
6. Unveränderlichkeit und Gegenstände
7. Unveränderlichkeit und Arrays
8. Objektive
9. Fazit


Dieser Beitrag ist der achte einer Reihe von Artikeln über funktionale Programmierung mit dem Titel Ramda Style Thinking.


Im sechsten und siebten Teil haben wir gelernt, wie man die Eigenschaften von Objekten und Elementen von Arrays in einem deklarativen und unveränderlichen Stil liest, aktualisiert und transformiert.


Ramda bietet auch ein allgemeineres Werkzeug zur Durchführung dieser Operationen, sogenannte Linsen.


Welche Art von Objektiven?


Das Objektiv kombiniert die Getter-Funktion und die Setter-Funktion in einem Mechanismus. Ramda bietet eine Reihe von Funktionen für die Arbeit mit Objektiven.


Wir können uns Objektive als etwas vorstellen, das sich auf einen bestimmten Teil einer großen Datenstruktur konzentriert.


Wie kann ich ein Objektiv erstellen?


Die primäre Methode zum Erstellen von Objektiven in Ramda ist die Objektivfunktion . lens übernimmt eine Getter- und eine Setter-Funktion und gibt ein neues Objektiv zurück.


 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']) ) 

Hier verwenden wir prop und path Methoden als assocPath Funktionen und assoc und assocPath als assocPath Funktionen.


Beachten Sie, dass wir die Argumente mit dem Namen der Eigenschaft und dem Pfad zur gewünschten Eigenschaft für diese Funktionen dupliziert haben. Glücklicherweise bietet Ramda coole Verknüpfungen für die häufigsten Situationen bei der Verwendung von Objektiven: Objektivprop , Objektivpfad und Objektivindex .


  • lensProp erstellt eine Linse, die sich auf eine Objekteigenschaft konzentriert
  • lensPath erstellt eine Linse, die sich auf eine angehängte Eigenschaft eines Objekts konzentriert
  • lensIndex erstellt eine Linse, die sich auf ein Array-Element konzentriert

Wir können unsere oben genannten Objektive mit lensProp und Objektivpfad lensPath :


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

Es ist viel einfacher und eliminiert Duplikate. In der Praxis stellte ich fest, dass ich die ursprüngliche lens fast nie benötige.


Was kann ich damit machen?


Okay, großartig, wir haben ein Paar Objektive erstellt. Was können wir jetzt mit ihnen machen?


Ramda bietet drei Linsenfunktionen.


  • Ansicht liest den Wert des Objektivs
  • set aktualisiert den Wert des Objektivs
  • over wendet die Transformationsfunktion auf das Objektiv an

 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' // } // } 

Beachten Sie, dass beim set und Übergeben das gesamte Objekt mit dem geänderten Wert zurückgegeben wird, auf den Ihr Objektiv fokussiert war.


Fazit


Objektive können nützlich sein, wenn wir eine ziemlich komplexe Datenstruktur haben, von der wir beim Aufrufen des Codes abstrahieren möchten. Anstatt für jede verfügbare Eigenschaft eine Struktur oder Getter, Setter und Transformatoren bereitzustellen, können wir stattdessen Linsen bereitstellen.


Der Client-Code kann mithilfe von view , set und over ohne Verknüpfung mit der genauen Form der Datenstruktur weiter mit unseren Datenstrukturen arbeiten.


Weiter


Jetzt wissen wir über Ramda viel von allem, was es bietet; Im Allgemeinen genug, um vor allem die Operationen auszuführen, die wir in unseren Programmen ausführen. Der letzte Artikel in dieser Reihe gibt einen Überblick über das, was untersucht wurde, und erwähnt einige andere Themen, die wir möglicherweise selbst untersuchen möchten.

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


All Articles