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.
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.
const add = (a, b) => a + b; // pureNon‑pure:
let count = 0;
const inc = () => (count += 1); // side-effectKenapa penting? Karena pure function:
- mudah dites
- mudah di-cache
- mudah diparalelkan
3) Immutability
FP menghindari mutasi langsung. Contoh:
const users = ["Ana", "Budi"];
const next = [...users, "Citra"]; // tidak mengubah usersDi codebase besar, immutability mencegah bug “state tiba‑tiba berubah”.
4) Higher‑order function
Fungsi yang menerima/ mengembalikan fungsi.
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.
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:
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.
const add = (a) => (b) => a + b;
const add10 = add(10);
add10(5); // 15Currying membuat reuse lebih mudah.
8) Pattern penting di FP
a) Pipe / Compose
const pipe =
(...fns) =>
(x) =>
fns.reduce((v, f) => f(v), x);
const result = pipe(trim, toLower, slug)(" Hello World ");b) Partial Application
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.
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,reduceReactcomponent yang pureReduxreducer (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.