← Back to Blog

Article

Functional Programming: Konsep, Contoh, dan Pattern yang Sering Dipakai

Panduan panjang dan praktis tentang functional programming: konsep inti, contoh JavaScript, dan pattern yang sering dipakai di codebase modern.

2024-02-05·3 min read
Functional ProgrammingJavaScriptPatternsArchitecture

Functional Programming (FP) sering terdengar “teoritis”, padahal konsepnya sangat praktis untuk membuat code yang lebih mudah dibaca, diuji, dan dirawat. Artikel ini membahas konsep inti, contoh sederhana, dan pattern yang sering dipakai di proyek modern.

1) Core idea: fungsi sebagai data

Dalam FP, fungsi adalah first-class citizen: bisa disimpan di variabel, dikirim sebagai parameter, atau dikembalikan sebagai hasil.

js
const greet = (name) => `Hello, ${name}`;
const logger = (fn) => (...args) => console.log(fn(...args));
 
const loggedGreet = logger(greet);
loggedGreet("Jery");

2) Pure function

Pure function selalu menghasilkan output yang sama untuk input yang sama, dan tidak punya side-effect.

js
const add = (a, b) => a + b; // pure

Non‑pure:

js
let count = 0;
const inc = () => (count += 1); // side-effect

Kenapa penting? Karena pure function:

  • mudah dites
  • mudah di-cache
  • mudah diparalelkan

3) Immutability

FP menghindari mutasi langsung. Contoh:

js
const users = ["Ana", "Budi"];
const next = [...users, "Citra"]; // tidak mengubah users

Di codebase besar, immutability mencegah bug “state tiba‑tiba berubah”.

4) Higher‑order function

Fungsi yang menerima/ mengembalikan fungsi.

js
const withRetry = (fn, retries = 3) => async (...args) => {
  for (let i = 0; i < retries; i += 1) {
    try {
      return await fn(...args);
    } catch {
      if (i === retries - 1) throw new Error("All retries failed");
    }
  }
};

Ini sangat berguna untuk middleware, logging, caching, dsb.

5) Composition

Menyusun fungsi kecil jadi pipeline besar.

js
const trim = (s) => s.trim();
const toLower = (s) => s.toLowerCase();
const slug = (s) => s.replace(/\s+/g, "-");
 
const makeSlug = (s) => slug(toLower(trim(s)));

Dengan composition, kita fokus bikin fungsi kecil yang spesifik.

6) Map / Filter / Reduce

Tiga operasi paling populer di FP:

js
const nums = [1, 2, 3, 4];
const doubled = nums.map((n) => n * 2);
const evens = nums.filter((n) => n % 2 === 0);
const sum = nums.reduce((acc, n) => acc + n, 0);

7) Currying

Fungsi yang dipecah jadi beberapa fungsi kecil.

js
const add = (a) => (b) => a + b;
const add10 = add(10);
add10(5); // 15

Currying membuat reuse lebih mudah.

8) Pattern penting di FP

a) Pipe / Compose

js
const pipe =
  (...fns) =>
  (x) =>
    fns.reduce((v, f) => f(v), x);
 
const result = pipe(trim, toLower, slug)("  Hello World  ");

b) Partial Application

js
const withPrefix = (prefix) => (value) => `${prefix}${value}`;
const logInfo = withPrefix("[INFO] ");
logInfo("Service ready");

c) Either / Result (pattern error)

Daripada throw, kita kembalikan hasil yang jelas sukses/gagal.

js
const ok = (value) => ({ ok: true, value });
const err = (error) => ({ ok: false, error });
 
const safeDivide = (a, b) => (b === 0 ? err("Zero") : ok(a / b));

9) FP di dunia nyata

FP sering muncul tanpa kita sadari:

  • Array.map, filter, reduce
  • React component yang pure
  • Redux reducer (pure function)

10) Kapan pakai FP?

FP cocok untuk:

  • data transform
  • business rules
  • pipeline data

Kurang cocok untuk:

  • I/O heavy (perlu side-effect)
  • real‑time imperative control (device, hardware)

Penutup

Functional Programming bukan soal “agama”, tapi alat untuk membuat code lebih stabil dan mudah dirawat. Ambil bagian yang relevan: pure function, immutability, dan composition — itu sudah memberi 80% manfaat.