Berpikir Gaya Ramda: Lensa

1. Langkah pertama
2. Gabungkan fungsinya
3. Penggunaan parsial (kari)
4. Pemrograman deklaratif
5. Notasi klasik
6. Kekekalan dan objek
7. Kekekalan dan array
8. Lensa
9. Kesimpulan


Posting ini adalah yang kedelapan dari serangkaian artikel tentang pemrograman fungsional yang disebut Ramda Style Thinking.


Di bagian keenam dan ketujuh kami belajar cara membaca, memperbarui, dan mengubah properti objek dan elemen array dalam gaya deklaratif dan abadi.


Ramda juga menyediakan alat yang lebih umum untuk melakukan operasi ini, yang disebut lensa.


Lensa seperti apa?


Lensa menggabungkan fungsi getter dan fungsi setter menjadi satu mekanisme. Ramda menyediakan serangkaian fitur untuk bekerja dengan lensa.


Kita dapat menganggap lensa sebagai sesuatu yang berfokus pada bagian tertentu dari struktur data yang besar.


Bagaimana saya bisa membuat lensa?


Cara utama untuk membuat lensa di Ramda adalah dengan fungsi lensa . lens mengambil fungsi pengambil dan fungsi penyetel dan mengembalikan lensa baru.


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

Di sini kita menggunakan metode prop dan path sebagai fungsi assocPath kita, dan assoc dan assocPath sebagai fungsi assocPath kita.


Perhatikan bahwa kami menggandakan argumen dengan nama properti dan jalur ke properti yang diinginkan untuk fungsi-fungsi ini. Untungnya, Ramda menyediakan pintasan keren untuk situasi penggunaan lensa yang paling umum: lensProp , lensPath, dan lensIndex .


  • lensProp menciptakan lensa yang berfokus pada properti objek
  • lensPath menciptakan lensa yang berfokus pada properti objek yang dilampirkan
  • lensIndex menciptakan lensa yang berfokus pada elemen array

Kita dapat menulis ulang lensa kita di atas menggunakan lensProp dan lensPath :


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

Ini jauh lebih sederhana dan menghilangkan duplikat. Dalam praktiknya, saya menemukan bahwa saya hampir tidak pernah membutuhkan fungsi lens asli.


Apa yang bisa saya lakukan dengan semua ini?


Oke, bagus, kami membuat sepasang lensa. Apa yang bisa kita lakukan dengan mereka sekarang?


Ramda menyediakan tiga fungsi lensa.


  • lihat membaca nilai lensa
  • mengatur pembaruan nilai lensa
  • lebih menerapkan fungsi transformasi ke lensa

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

Perhatikan bahwa set dan mengembalikan seluruh objek dengan nilai yang berubah yang menjadi fokus lensa Anda.


Kesimpulan


Lensa dapat berguna jika kita memiliki struktur data yang cukup rumit yang ingin kita abstraksi dari saat memanggil kode. Alih-alih menyediakan struktur atau menyediakan getter, setter, dan transformer untuk setiap properti yang tersedia, kami dapat menyediakan lensa.


Kode klien selanjutnya dapat bekerja dengan struktur data kami melalui penggunaan view , set dan over tanpa tautan ke bentuk persis struktur data.


Selanjutnya


Sekarang kita tahu tentang Ramda banyak dari semua yang disediakannya; secara umum, cukup untuk melakukan sebagian besar dari semua operasi yang kami lakukan dalam program kami. Artikel terakhir dalam seri ini memberikan gambaran umum tentang apa yang telah dipelajari dan menyebutkan beberapa topik lain yang mungkin ingin kita jelajahi sendiri.

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


All Articles