Mengenal Paradigma Functional Programming di JavaScript

Adhy Wiranata
4 min readJun 20, 2017

--

Functional Programming is so Math, much Wow!

Sebagai programmer tentu kita sering mendengar berbagai paradigma pemrograman seperti imperative, object-oriented, prodecural, dan functional.

Apa sih sebenarnya paradigma pemrograman itu?

Paradigma pemrograman adalah gaya atau cara kita menulis program.

Saya akan fokus sharing tentang paradigma functional programming. Functional programming adalah paradigma pemrograman yang berkutat pada komputasi yang terjadi di dalam fungsi matematis dan menghindari terjadinya perubahan data. Yang dimaksud dengan fungsi matematis sendiri adalah sebuah hubungan antara input yang akan mengembalikan output. Contoh paling sederhana adalah sebuah fungsi kuadrat, misalnya f(x) = x * x. contohnya f(5) = 25. Paradigma functional programming menggunakan metode-metode yang banyak kita temukan di matematika, seperti function composition, currying, partial functions, functors, monads, dan lain-lain.

Mathematical Function Revisited

Harusnya kita masih ingat dengan gambar dibawah di ilmu Matematika:

Mathematical Function

Dimana X biasanya kita sebut Domain, dan Y kita sebut Codomain. Di Functional Programming, X biasa kita sebut dengan domain, dan Y kita sebut dengan range. Fungsi matematika di atas menggambarkan sebuah prinsip dimana tugas dari sebuah fungsi adalah untuk menerima satu input dan mengembalikan nilai input lain. Satu nilai yang dioperasikan di dalam fungsi, pasti memiliki hasil nilai yang selalu sama. Contoh gambar dibawah bukan menggambarkan fungsi matematika yang tepat. Angka atau input bernilai 2, menghasilkan dua kemungkinan nilai, yaitu B atau C.

Bukan Mathematic Function

Tentu kita mengenal function di berbagai bahasa pemrograman, salah satu nya di JavaScript. Kita terbiasa membuat function yang menerima argumen atau parameter yang akan kita manfaatkan untuk menjalankan function tersebut sehingga function tersebut melakukan tindakan yang kita harapkan. Di JavaScript sendiri, kita dapat menulis kode dengan paradigma functional programming, dengan mengikuti beberapa aturan dan gaya penulisan kode yang umum diterapkan di bahasa pemrograman yang murni memiliki paradigma functional programming, seperti Haskell dan Elm.

Writing Functions, FP Style!

Random: Stylish & Funky Cat

Untuk membuat penulisan kode function di JavaScript yang mengikuti paradigma FP, ada beberapa hal yang harus diperhatikan:

  • Function harus bersifat pure, dimana ia akan menerima parameter sebagai input dan mengembalikan nilai, tanpa mengubah nilai dari variabel manapun.
  • Function tidak boleh menggunakan nilai dari variabel yang bukan sebagai parameter.
  • Function harus mengembalikan satu nilai untuk setiap input. Function yang mengembalikan kemungkinan nilai untuk satu nilai input yang sama tidak memenuhi prinsip FP.
Contoh Pure Function Sederhana

Dilihat dari contoh tersebut, function multiplyByTwo menerima satu parameter yaitu num, yang kemudian proses di dalam function tersebut akan mengembalikan nilai dua kali lipat dari angka tersebut. Contoh diatas terlihat sangat sederhana dan umum, sehingga mungkin kita akan lebih paham jika kita melihat contoh function yang tidak pure (impure).

Contoh Impure Function Sederhana

Mutability vs Immutability

Immutability adalah sebuah konsep dimana semua variabel, setelah sekali didefinisikan dan diassign sebuah nilai, nilai tersebut tidak boleh digantikan atau berubah. Hal ini memiliki keuntungan dimana kita terhidar dari terjadinya side-effects, dimana satu proses dapat mempengaruhi nilai sebuah variabel secara global dan menyebabkan error yang relatif sulit untuk di debug.

JavaScript ES6 sendiri memiliki sintaks const, dimana variabel yang didefinisikan menggunakan const, nilainya tidak dapat diubah, namun hal ini tidak berlaku pada array dan object. Kita masih dapat melakukan push pada array atau melakukan pengubahan nilai pada object dimana itu merupakan proses yang mutable. Kita bisa menerapkan konsep immutability terhadap array dan object dengan mengembalikan array atau object baru, bukan mengubahnya. Untuk lebih jelasnya, kita akan melihat perbedaan antara mutability dan immutability dengan langsung terjun ke contoh dibawah ini.

Contoh Perbandingan Mutability dan Immutability

Higher-order Functions

di JavaScript dan di bahasa programming functional ada sebuah konsep yang dinamakan Higher-order function. Higher-order function adalah function yang menerima argumen atau parameter berupa function. Sebelum mendengar higher-order function, mungkin kita pernah mendengar callback di JavaScript. Ya, callback function adalah function yang dikirimkan sebagai parameter ke dalam higher-order function. Contoh paling sederhana dari penerapan higher-order function adalah filter function.

Contoh Higher Order Function Sederhana

Currying

Bukan Curry yang ini ya :)

Currying adalah sebuah teknik dalam functional programming, dimana sebuah function tidak mengambil semua argumen atau parameter dan digunakan sekaligus, melainkan mengembalikan sebuah function baru yang mengambil parameter kedua, yang kemudian mengembalikan function baru yang mengambil parameter ketiga, dan seterusnya hingga seluruh argument atau parameter digunakan. Pada teknik ini, setiap argumen akan dievaluasikan satu per satu.

Contoh Sederhana Currying di JavaScript

That’s it?

Not really. Masih banyak konsep di paradigma functional programming yang menarik untuk kita explore seperti function compositions, functors, applicatives, stream, monoids, monads, dan lain-lain yang lebih seru (dan complicated). Beberapa konsep yang dibagikan barusan merupakan sebagian kecil dari ekplorasi saya di dunia functional programming, dan tentunya seluruh penjelasan di atas merupakan hasil eksplorasi yang mungkin akan diupdate apabila ditemukan tambahan-tambahan menarik lainnya.

Sekian dulu sharing saya, apabila ada masukan, kritik, komentar, dan lain-lain, silakan berikan respon, dan silakan berikan ❤ jika sharing ini cukup bermanfaat dan informatif :)

--

--

Adhy Wiranata

Front End Engineer, Startup Enthusiast, Lifelong learner, Aspiring Software Architect, and Anime Junkie. On a mission to improve education and productivity.