Konsep Penting dalam Pemrograman Fungsional dengan JavaScript

Mar 12 2023
Pemrograman fungsional adalah paradigma yang semakin populer dalam beberapa tahun terakhir karena kemampuannya untuk menulis kode yang lebih modular, dapat digunakan kembali, dan dapat dipelihara. JavaScript, sebagai bahasa pemrograman serbaguna, juga cocok untuk pemrograman fungsional.
Konsep Pemrograman Fungsional dalam JavaScript

Pemrograman fungsional adalah paradigma yang semakin populer dalam beberapa tahun terakhir karena kemampuannya untuk menulis kode yang lebih modular, dapat digunakan kembali, dan dapat dipelihara. JavaScript, sebagai bahasa pemrograman serbaguna, juga cocok untuk pemrograman fungsional. Pada artikel ini, kita akan mengeksplorasi konsep-konsep penting dalam pemrograman fungsional dengan JavaScript dan bagaimana mereka dapat membantu Anda menulis kode yang lebih baik:

  1. Berfungsi sebagai Warga Negara Kelas Satu
  2. Fungsi Tingkat Tinggi
  3. Fungsi Murni
  4. Kekekalan
  5. Pengulangan

Dalam pemrograman fungsional, fungsi diperlakukan sebagai warga negara kelas satu, yang berarti bahwa mereka dapat ditugaskan ke variabel, diteruskan sebagai argumen ke fungsi lain, dan dikembalikan sebagai nilai. Konsep ini sangat penting dalam pemrograman fungsional, karena memungkinkan kita menulis kode yang lebih modular dan dapat digunakan kembali.

Berikut adalah beberapa contoh bagaimana fungsi diperlakukan sebagai warga negara kelas satu di JavaScript:

  1. Menetapkan Fungsi ke Variabel:

const add = function(x, y) {
  return x + y;
}

2. Melewati Fungsi sebagai Argumen:

Fungsi juga dapat diteruskan sebagai argumen ke fungsi lain. Ini memungkinkan pendekatan pemrograman yang lebih modular, karena memungkinkan kita untuk menggunakan kembali fungsi yang sama dengan input dan output yang berbeda. Misalnya:

function greet(name, callback) {
  const message = "Hello, " + name + "!";
  callback(message);
}

function logMessage(message) {
  console.log(message);
}

greet("Sumit", logMessage); // Logs "Hello, Sumit!"

3. Mengembalikan Fungsi sebagai Nilai:

Fungsi juga dapat dikembalikan sebagai nilai dari fungsi lain. Ini memungkinkan teknik yang lebih maju seperti penutupan dan kari. Misalnya:

function add(x) {
  return function(y) {
    return x + y;
  };
}

const addFive = add(5);
console.log(addFive(3)); // Logs 8

✓ Fungsi Tingkat Tinggi

Fungsi tingkat tinggi adalah fungsi yang mengambil fungsi lain sebagai argumen atau mengembalikan fungsi sebagai nilai. Mereka memungkinkan kita untuk menulis kode yang lebih abstrak dan tujuan umum yang dapat diterapkan pada berbagai kasus penggunaan. Beberapa fungsi tingkat tinggi yang umum dalam JavaScript adalah map(), filter(), dan reduce().

Berikut adalah beberapa contoh fungsi tingkat tinggi dalam JavaScript:

  1. Larik.prototipe.peta():

const numbers = [1, 2, 3, 4];
const doubled = numbers.map(function(num) {
  return num * 2;
});
console.log(doubled); // Logs [2, 4, 6, 8]

2. Larik.prototipe.filter():

Metode ini filter()adalah fungsi tingkat tinggi lainnya yang mengambil fungsi panggilan balik sebagai argumen dan mengembalikan larik baru dengan hanya elemen yang lulus uji yang ditentukan dalam panggilan balik. Misalnya:

const numbers = [1, 2, 3, 4];
const even = numbers.filter(function(num) {
  return num % 2 === 0;
});
console.log(even); // Logs [2, 4]

3. Fungsi.prototipe.bind():

Metodenya bind()adalah fungsi tingkat tinggi yang mengembalikan fungsi baru dengan thisnilai spesifik dan argumen awal. Ini sering digunakan untuk membuat fungsi baru dengan konteks tertentu atau untuk membuat fungsi yang diterapkan sebagian. Misalnya:

const person = {
  firstName: "Sumit",
  lastName: "Saha",
  fullName: function() {
    return this.firstName + " " + this.lastName;
  }
};

const logName = function(greeting) {
  console.log(greeting + " " + this.fullName());
};

const boundLogName = logName.bind(person, "Hello");
boundLogName(); // Logs "Hello Sumit Saha"

Ini hanyalah beberapa contoh dari banyak fungsi tingkat tinggi yang tersedia di JavaScript. Dengan menggunakan fungsi tingkat tinggi, Anda dapat menulis kode yang lebih umum dan dapat digunakan kembali yang dapat diterapkan ke berbagai kasus penggunaan.

✓ Fungsi Murni

Fungsi murni adalah fungsi yang tidak memiliki efek samping, artinya fungsi tersebut tidak mengubah keadaan eksternal atau variabel apa pun di luar cakupannya. Mereka selalu mengembalikan output yang sama untuk input yang sama, menjadikannya deterministik. Fungsi murni sangat penting dalam pemrograman fungsional, karena mereka mempromosikan prediktabilitas kode, pengujian, dan pemeliharaan.

Berikut adalah beberapa contoh fungsi murni dalam JavaScript:

  1. Fungsi tambahan:
  2. function add(a, b) {
      return a + b;
    }
    

function concatenateArrays(arr1, arr2) {
  return arr1.concat(arr2);
}

3. Fungsi pemformatan tanggal:

function formatDate(date) {
  const year = date.getFullYear();
  const month = date.getMonth() + 1;
  const day = date.getDate();
  return `${year}-${month}-${day}`;
}

4. Fungsi kapitalisasi string:

function capitalize(str) {
  return str.charAt(0).toUpperCase() + str.slice(1);
}

Secara umum, fungsi murni adalah fungsi yang tidak memiliki efek samping dan selalu mengembalikan hasil yang sama untuk input yang sama. Mereka dapat diprediksi dan lebih mudah untuk dipikirkan, menjadikannya ideal untuk menulis kode yang dapat dipelihara dan digunakan kembali.

✓ Kekekalan

Kekekalan adalah konsep yang melibatkan menghindari modifikasi struktur data atau variabel setelah dibuat. Alih-alih mengubah objek atau larik, kami membuat yang baru dengan perubahan yang diinginkan. Pendekatan ini mencegah efek samping yang tidak diinginkan dan membuat kode lebih dapat diprediksi dan lebih mudah dipikirkan.

Berikut adalah beberapa contoh kekekalan dalam JavaScript:

  1. Menggunakan operator spread untuk membuat array atau objek baru:
  2. const arr1 = [1, 2, 3];
    const arr2 = [...arr1, 4];
    // arr1 is still [1, 2, 3], arr2 is [1, 2, 3, 4]
    
    const obj1 = { a: 1, b: 2 };
    const obj2 = { ...obj1, c: 3 };
    // obj1 is still { a: 1, b: 2 }, obj2 is { a: 1, b: 2, c: 3 }
    

const arr1 = [1, 2, 3];
const arr2 = arr1.concat(4);
// arr1 is still [1, 2, 3], arr2 is [1, 2, 3, 4]

3. Menggunakan Object.assign()untuk membuat objek baru:

const obj1 = { a: 1, b: 2 };
const obj2 = Object.assign({}, obj1, { c: 3 });
// obj1 is still { a: 1, b: 2 }, obj2 is { a: 1, b: 2, c: 3 }

4. Menggunakan Object.freeze()untuk mencegah modifikasi objek:

const obj1 = Object.freeze({ a: 1, b: 2 });
obj1.c = 3;
// obj1 is still { a: 1, b: 2 }, the assignment is ignored

Secara umum, kekekalan berarti bahwa data tidak diubah secara langsung, melainkan salinan baru dibuat saat perubahan dilakukan. Ini dapat membantu mencegah efek samping yang tidak diinginkan dan membuat kode lebih dapat diprediksi dan dipelihara.

✓ Rekursi

Rekursi adalah teknik di mana suatu fungsi memanggil dirinya sendiri untuk menyelesaikan suatu masalah. Ini adalah alat yang ampuh dalam pemrograman fungsional, karena memungkinkan kita memecahkan masalah kompleks dengan memecahnya menjadi lebih kecil, lebih sederhana. Namun, rekursi bisa jadi rumit untuk digunakan, karena dapat menyebabkan kesalahan stack overflow dan masalah performa jika tidak digunakan dengan benar.

Berikut adalah beberapa contoh rekursi dalam JavaScript:

  1. Fungsi faktorial:
  2. function factorial(n) {
      if (n === 0) {
        return 1;
      } else {
        return n * factorial(n - 1);
      }
    }
    
    factorial(5); // returns 120 (5! = 5 * 4 * 3 * 2 * 1)
    

function sum(arr) {
  if (arr.length === 0) {
    return 0;
  } else {
    return arr[0] + sum(arr.slice(1));
  }
}

sum([1, 2, 3, 4, 5]); // returns 15 (1 + 2 + 3 + 4 + 5)

3. Fungsi Fibonacci:

function fibonacci(n) {
  if (n === 0 || n === 1) {
    return n;
  } else {
    return fibonacci(n - 1) + fibonacci(n - 2);
  }
}

fibonacci(6); // returns 8 (0, 1, 1, 2, 3, 5, 8)

Rekursi dapat menjadi alat yang ampuh dalam memecahkan masalah yang melibatkan pengulangan pola atau struktur. Namun, itu juga dapat menyebabkan masalah kinerja dan kesalahan stack overflow jika tidak diterapkan dengan hati-hati. Penting untuk memahami konsep rekursi dan menggunakannya dengan bijak dalam kode Anda.

Kesimpulan

Kesimpulannya, pemrograman fungsional adalah paradigma penting yang dapat membantu Anda menulis kode yang lebih modular, dapat digunakan kembali, dan dapat dipelihara. Dengan memahami konsep penting seperti fungsi sebagai warga negara kelas satu, fungsi tingkat tinggi, fungsi murni, kekekalan, dan rekursi, Anda dapat mulai menulis lebih banyak kode fungsional dalam JavaScript. Pemrograman fungsional bukan satu-satunya cara untuk menulis kode yang baik, tetapi ini adalah alat yang ampuh yang dapat membantu Anda memecahkan masalah kompleks dan membuat kode Anda lebih dapat diprediksi dan lebih mudah dipikirkan.