[Functional Programming] Lens & Prism
Its OKAY to NOT be OKAY
Functional Programming atau biasa kita sebut Declarative programming yaitu bagaimana kita mendeskripsikan suatu program dengan apa yang dilakukan (WHAT) sedangkan sebaliknya Imperative Programming mendeskripsikan sebuah program dengan bagaimana program berjalan (HOW).
Imperative mendeskripsikan secara spesifik instruksi-instruksi (step by step) yang perlu dilakukan oleh program. Sedangkan Deklaratif programming merupakan layer abstraksi diatas imperative programming karena kita tidak perlu tau atau khawatir bagaimana program melakukanya.
Saya jadi ingat perumpamaan yang diberikan oleh Guru sekolah saya di SMK dulu. Dia bertanya kepada siswa
Bagaimana cara memasukan gajah ke lemari es ?
Awalnya semua siswa nggak ada yang bisa menjawab karena logika mereka jalan, hewan sebesar gajah bagaimana bisa dimasukan ke lemari es ?
Hingga muncul siswa kreatif bilang
- Gajah dipotong-potong
- Masukan ke lemari es
Nggak salah tapi saya nggak peduli dengan caramu mengolah Gajah sehingga muat ke lemari es, yang saya tanyakan apa yang perlu dilakukan untuk memasukan Gajah ke lemari es ? Jawabanya simpel
- Buka lemari es
- Masukan Gajah ke lemari es
Sekilas kedua langkah diatas sama, hanya saja ketika masuk ke deklaratif kita tidak perlu tau bagaimana sebuah program memproses sesuatu, kita hanya perlu tau apa yang perlu dilakukan untuk mencapai sesuatu, sedang kan prosesnya terserah pada kalian 😛.
Okay <- The right way to spell oke in english wk wk, sometimes just too comfortable use oke than okay.
Okay …next masuk ke Lens dan Prism, kembali lagi ke pertanyaan apa sih itu lens ?
Lens
Lenses or Lens -> Composable Getters and Setters for Functional Programming.
Untuk lebih jelasnya bisa temen-temen baca di artikel milik Eric Elliot ini
Disana juga dijelaskan kenapa menggunakan lens, intinya lens itu immutable, jadi ketika kita mengubah value dari suatu object maka object yang direturn != old_object.
Yang menarik dari deskripsi Eric adalah kata Compose, yang dimaksud Compose adalah ketika kita memiliki 2 function dan function pertama menghasilkan output yang menjadi input pada function kedua.
func pertama(A) -> B
func kedua(B) -> Cfunc pertama + func kedua = (A) -> C
let titleLens = LoginPage.lens.titlelet usernameTextLens = LoginPage.lens.credentials..CredentialBox.lens.usernameField..TextField.lens.textlet buttonStateLens = LoginPage.lens.buttonState
Advance Implementation
let passwordLens = (\LoginPage.credendials.passwordField.text).lenslet loginPage = LoginPage(title: "", credendials: CredentialBox(usernameField: TextField(text: "username", placeholder: "username", secureText: false), passwordField: TextField(text: "password", placeholder: "password", secureText: true)), buttonState: .empty)let text = passwordLens.get(passwordLens.set("ok")(loginPage))print(text) // Result = ok
Unfortunately, this is not going to work if the
Value
property onto which the lens is focusing islet
, thus immutable - we won’t get aWritableKeyPath
for it - and alsoKeyPath
is not available for enums, so code generation is still our friend here.
Kesimpulan
Sebenarnya Lens hanya Setter Getter biasa hanya saja object yang dihasilkan setelah melakukan modify berbeda dengan object sebelumnya.
Not mutating but Copying
What Next ?
Mungkin untuk selanjutnya kita akan masuk ke sorting dengan menggunakan Lens atau Prism. Sebenarnya masih banyak yang bisa dikembangkan dari Lens atau Prism.
Untuk lebih jauh bisa coba temen-temen baca pada artikel-artikel yang berhubungan dibawah.
Semoga membantu 🙏