Mendekatkan Diri Kepada Functional Programming di Javascript 🚶
Tags: javascript, functional, indonesia, discuss
Published: 2021-04-27 14:14:13

Bagaimana kalian menulis blok program, dan menggunakan paradigma apa adalah hal yang sangat penting dan vital bagi pemrogram, karena hal tersebut juga dapat menentukan bagaimana sebuah program berjalan dan berkembang selanjutnya. :yum:

Kali ini saya akan membahas Functional Programming, karena terlalu banyak sudah yang membahas OOP dan procedural programming, akhirnya saya berinisiatif menyebarkan faham tentang paradigma pemrograman yang satu ini. 

# Functional Programming :sunglasses:

Functional Programming adalah ketika kita menulis kumpulan blok program menggunakan functions dan menghindari state dan data yang mutable (mutable berarti kita dapat dengan mudah membuat struktur data daripada memodifikasi yang sudah ada), bukan OOP (objects, classes, bottom-up approach) maupun procedural programming (every program start with function, top-down approach).

## Basic Terminology and Concepts

### Referential transparency
Dalam matematika, Referential transparency adalah properti yang memungkinkan kita mengganti ekspresi dengan nilainya, dan tidak mengubah hasil dari apa pun yang kita lakukan.

Sebagai contoh menggunakan Javascript :
```js
let x = 1 + 2 * 3;
```
menjadi
```js
let x = 1 + 6;
```
atau (lebih baik) menjadi
```js
let x = 7;
```
untuk menghemat waktu eksekusi, ini memanfaatkan fakta bahwa semua ekspresi dan fungsi matematika (menurut definisinya) adalah transparan secara referensial.

### Modular approach

Modular approach adalah proses pengelompokan program komputer menjadi sub-program terpisah menggunakan functions, dimana functions ini bisa digunakan di aplikasi lain atau functions lainnya.

Desain modular dapat meningkatkan produktivitas. Modul kecil dapat dikodekan dengan lebih cepat dan memiliki peluang lebih besar untuk digunakan kembali (DRY Don'T RepeaT YourselF) yang tentunya mengarah pada pengembangan program yang lebih cepat. Selain itu, modul dapat diuji secara terpisah (unit testing) yang membantu kita mengurangi waktu yang dihabiskan untuk pengujian unit dan debugging.

### Maintainability

Maintainability adalah istilah sederhana yang berarti pemrograman FP lebih mudah dipelihara karena kita tidak perlu khawatir secara tidak sengaja mengubah apa pun di luar fungsi yang diberikan.

**First-class Function**

**First-class Function** adalah definisi, yang dikaitkan dengan entitas bahasa pemrograman yang tidak memiliki batasan dalam penggunaannya. Oleh karena itu, first-class function dapat muncul di mana saja dalam program.

di JavaScript first-class function adalah function yang berarti kita dapat menyimpannya dalam variabel, objek, dan array.

Sebagai contoh menggunakan Javascript :
```js
let isOdd = (n) => {
  return n % 2 === 0;
}
```
dengan **higher order function** 
```js
let isOdd = (n) => {
  return n % 2 === 0;
}
let arr = [0,1,2,3,4,5,6,7];
let oddArray = (arr) => {
  let proxyArr = [];
  //imperative approach
  arr.forEach((el) => {
    isOdd(el) ?
     proxyArr.push(el) :
     '';
  });
  return proxyArr;
}
console.log(oddArray(arr));
```
dengan `filter()` (functional approach) 
```js
let isOdd = (n) => {
  return n % 2 === 0;
}

let numbers = [0,1,2,3,4,5,6,7];

let oddNumbers = numbers.filter(isOdd,[]);

console.log(oddNumbers);
```

### Closure

Closures adalah fungsi dalam yang dapat mengakses variabel dari fungsi induk, bahkan setelah fungsi induk dijalankan.

Contoh closure ada pada bagian [**higher order function**](#maintainability) diatas.

### Pure Function (Accessor Method)

Pure Function adalah fungsi yang inputnya dideklarasikan sebagai input dan tidak ada satupun yang harus disembunyikan. outputnya juga dideklarasikan sebagai output.

Pure Function bekerja berdasarkan parameternya. Tidak efisien jika tidak me-return apapun. Selain itu, ia menawarkan return yang sama untuk parameter yang diberikan.

Contoh pure function pada Javascript :
```js
function pure(a,b)
{
   return a+b;
}
```

### Impure Function (Mutator Method)

Impure Function adalah kebalikan dari pure function. Fungsi ini memiliki input atau output tersembunyi; itu disebut impure. Impure Function tidak dapat digunakan atau diuji secara terpisah karena memiliki ketergantungan. 

Contoh impure function pada Javascript :
```js
let z;
function impure(){
   z = z+10;
}
```

### Function Composition

Function Composition adalah proses menggabungkan 2 fungsi atau lebih untuk membuat yang baru.

### Shared State 

Shared State adalah state (bisa berupa variabel, ataupun objek) yang dibagikan.

**Side Effects**

**Side Effects** adalah efek samping setiap perubahan keadaan yang terjadi di luar function yang dipanggil. Tujuan terbesar dari setiap functional programming language adalah meminimalkan efek samping, dengan memisahkannya dari kode perangkat lunak lainnya. Dalam functional programming, sangat penting untuk menghilangkan efek samping dari sisa logika pemrograman.

## Kenapa Functional Programming ?

Secara general, alasan kenapa kita harus memilih functional programming karena paradigma ini powerful, expressive dan fun (contohnya menggunakan fungsi filter dari javascript sebelumnya, itu fun dan expressive, loh kenapa expressive? karena kita sudah tau bagaimana mengoperasikan fungsinya).

Benefit lainnya :
* Memungkinkan kita menghindari masalah dan kesalahan yang membingungkan dalam kode (expressive, fun)
* Lebih mudah menguji dan menjalankan unit testing, dan debugging.  (powerfull, fun)
* Pemrosesan Paralel, dan Concurrency (powerfull)
* Hot code deployment and fault tolerance (powerfull)
* Menawarkan modularitas yang lebih baik dengan kode yang lebih pendek (powerfull, fun, expressive)
* Meningkatkan produktivitas (fun)
* Mendukung Nested Functions (powerfull)
* Functional construction seperti Map , Filter , Reduce , dll.  (fun, expressive)
* Memungkinkan penggunaan Lambda Calculus secara efektif (powerfull)

## Tamat

Sekian yang bisa saya sampaikan mengenai Functional Programming, Divide and Conquer! :fire:

Terima kasih buat yang sudah baca ❤️🧠🧠❤️🦄🦄🧠❤️🧠

Untuk penjelasan mengenai functional programming lainnya , saya sangat merekomendasikan slide di url berikut ini [Functional Programming Forever](https://slides.com/thomasomans/functional-programming-forever/fullscreen#/0/0/1).