Fungsi dalam Programming — Blok Bangunan yang Bikin Kode Rapi dan Efisien

📋 Daftar Isi

Fungsi dalam Programming — Blok Bangunan yang Bikin Kode Rapi dan Efisien

“Fungsi itu kayak mesin di pabrik — kamu kasih bahan baku (input), mesin ngolah, dan keluar produk jadi (output). Kamu tinggal panggil mesinnya kapan aja tanpa perlu tahu detail di dalamnya.”

Daftar Isi

  1. Apa Itu Fungsi?
  2. Kenapa Fungsi Itu Penting?
  3. Anatomi Fungsi
  4. Parameter vs Argument
  5. Return Value
  6. Scope dan Lifetime
  7. Fungsi dalam Berbagai Bahasa
  8. Best Practices Menulis Fungsi
  9. Kesimpulan

Apa Itu Fungsi?

Fungsi (atau function/method/subroutine) adalah blok kode yang punya nama, bisa dipanggil berulang kali, dan biasanya mengerjakan satu tugas spesifik. Bayangin fungsi kayak tombol di remote TV — kamu pencet tombol “Volume Up”, TV nambah volumenya. Kamu nggak perlu tahu bagaimana sinyal infra merah bekerja, kamu cukup tahu tombol itu fungsinya apa.

Dalam programming, fungsi memungkinkan kamu untuk:

KonsepAnalogiManfaat
EnkapsulasiMesin cuci — kamu tinggal pencet tombol, mesin urus sisanyaSembunyikan kompleksitas
ReusabilityCetakan kue — sekali buat, bisa dipakai berkali-kaliTulis sekali, pakai terus
ModularitasLEGO — setiap blok punya fungsi sendiriMudah diatur dan diganti
AbstraksiSopir mobil — tahu cara nyetir, nggak perlu tahu mesinFokus ke high-level logic

Kenapa Fungsi Itu Penting?

Coba bayangin kamu diminta nulis kode yang menghitung luas lingkaran di 10 tempat berbeda. Tanpa fungsi, kamu bakal nulis 3.14 * r * r sepuluh kali. Kalau tiba-tiba nilai pi harus diganti jadi 3.14159, kamu harus edit 10 tempat — rawan banget salah edit!

Dengan fungsi:

def luas_lingkaran(r):
    return 3.14159 * r * r

# Panggil di mana aja
print(luas_lingkaran(5))
print(luas_lingkaran(10))
print(luas_lingkaran(7))

Kalau nilai pi berubah — cukup edit satu baris di dalam fungsi. Inilah prinsip DRY (Don’t Repeat Yourself) yang udah kita singgung di artikel algoritma dasar.

Manfaat lain dari fungsi:

  1. Readability — kode jadi lebih mudah dibaca. Daripada lihat 50 baris kode panjang, kamu lihat panggilan fungsi kayak hitung_diskon() yang langsung jelas tujuannya.
  2. Testability — fungsi yang kecil dan terisolasi gampang di-test. Kamu bisa uji hitung_diskon(100000, 20) dan tahu pasti hasilnya harus 20000.
  3. Kolaborasi — tim bisa bagi tugas: si A nulis fungsi_auth(), si B nulis fungsi_payment(). Masing-masing kerja tanpa nabrak kode orang lain.

Anatomi Fungsi

Setiap fungsi punya empat komponen utama:

1. Nama Fungsi

Nama yang menjelaskan apa fungsi itu lakukan. Konvensi:

  • CamelCase (Java, C#): hitungLuasLingkaran
  • snake_case (Python, Rust): hitung_luas_lingkaran
  • kebab-case (jarang, biasanya di config)

Tips: Nama fungsi harus verb (kata kerja). hitungTotal(), cariUser(), simpanData() — kalau baca namanya aja udah tahu apa yang dilakukan.

2. Parameter (Input)

Data yang dikirim ke fungsi. Bisa kosong, satu, atau banyak.

3. Body (Isi Fungsi)

Blok kode yang dieksekusi saat fungsi dipanggil.

4. Return Value (Output)

Hasil yang dikembalikan fungsi ke pemanggilnya. Bisa juga tidak ada (void).

Contoh lengkap:

def hitung_diskon(harga, persen):
    """Menghitung harga setelah diskon"""
    potongan = harga * (persen / 100)
    return harga - potongan

# Panggil fungsi
total = hitung_diskon(100000, 20)
print(f"Total setelah diskon: Rp{total}")  # Rp80000

Di sini:

  • hitung_diskonnama fungsi
  • harga, persenparameter
  • harga * (persen / 100)body
  • return harga - potonganreturn value

Parameter vs Argument

Ini sering bikin bingung pemula, padahal sederhana:

IstilahArtiContoh
ParameterVariabel yang didefinisikan di definisi fungsidef sapa(nama):nama adalah parameter
ArgumentNilai yang dikirim saat memanggil fungsisapa("Budi")"Budi" adalah argument

Jenis Parameter

  1. Positional Arguments — urutan sesuai definisi:

    def bagi(a, b):
        return a / b
    
    bagi(10, 2)   # 5.0 — a=10, b=2
    bagi(2, 10)   # 0.2 — a=2, b=10 (beda!)
  2. Keyword Arguments — sebut nama parameternya:

    bagi(b=2, a=10)  # 5.0 — urutan nggak masalah
  3. Default Parameters — nilai default kalau nggak dikirim:

    def sapa(nama, sapaan="Halo"):
        print(f"{sapaan}, {nama}!")
    
    sapa("Budi")           # "Halo, Budi!"
    sapa("Budi", "Hey")    # "Hey, Budi!"
  4. Variable-Length Arguments — jumlah parameter fleksibel:

    def jumlahkan(*angka):
        return sum(angka)
    
    jumlahkan(1, 2, 3)     # 6
    jumlahkan(1, 2, 3, 4, 5)  # 15

Return Value

Setiap fungsi di programming bisa mengembalikan nilai ke pemanggilnya. Tapi ada juga fungsi yang nggak mengembalikan apa-apa (disebut void function atau procedure).

# Fungsi dengan return — mengembalikan hasil
def kali(a, b):
    return a * b

hasil = kali(3, 4)  # hasil = 12

# Fungsi tanpa return — void / procedure
def cetak_sapa(nama):
    print(f"Halo, {nama}!")
    # fungsi ini tidak mengembalikan nilai
    
x = cetak_sapa("Budi")  # x = None

PENTING: Fungsi yang nggak punya return akan mengembalikan None / null / undefined secara implisit.

Return Bisa Juga Menghentikan Eksekusi

def cek_umur(umur):
    if umur < 18:
        return "Belum cukup umur"
    # Kode di sini cuma jalan kalau umur >= 18
    return "Silakan masuk"

print(cek_umur(15))  # "Belum cukup umur"
print(cek_umur(20))  # "Silakan masuk"

Setelah return dipanggil, fungsi langsung berhenti — kode setelahnya nggak dieksekusi. Ini berguna banget untuk early return pattern.

Scope dan Lifetime

Scope adalah area di mana sebuah variabel bisa diakses. Ini konsep penting yang bedain variabel di dalam vs di luar fungsi.

x = 10  # global scope — bisa diakses di mana aja

def fungsi_contoh():
    y = 20  # local scope — cuma ada di dalam fungsi ini
    print(x)  # ✅ bisa akses variabel global
    print(y)  # ✅ bisa akses variabel lokal

fungsi_contoh()
print(x)  # ✅ 10 — global masih bisa
print(y)  # ❌ Error! 'y' tidak dikenal di luar fungsi
Jenis ScopeBisa Diakses DariDurasi Hidup
GlobalSeluruh programSelama program jalan
Local (di dalam fungsi)Hanya di dalam fungsi ituSelagi fungsi dieksekusi
Enclosing (fungsi di dalam fungsi)Fungsi dalam dan luarTergantung fungsi luar
Built-inSeluruh programSelalu ada

Related: pemahaman tentang scope erat kaitannya dengan konsep variabel dan tipe data yang udah kita bahas sebelumnya.

Fungsi dalam Berbagai Bahasa

Setiap bahasa punya sintaks fungsi yang berbeda, tapi konsepnya sama. Ini perbandingannya:

Python

def greet(nama):
    return f"Halo, {nama}!"

JavaScript

function greet(nama) {
    return `Halo, ${nama}!`;
}

// Arrow function (ES6+)
const greet = (nama) => `Halo, ${nama}!`;

Java

public static String greet(String nama) {
    return "Halo, " + nama + "!";
}

Go

func greet(nama string) string {
    return "Halo, " + nama + "!"
}

Rust

fn greet(nama: &str) -> String {
    format!("Halo, {}!", nama)
}

C

char* greet(char* nama) {
    // perlu alokasi memori manual
}
BahasaKeywordType DeclarationReturn
PythondefDynamic (opsional)Opsional
JavaScriptfunctionDynamicOpsional
Java(nama tipe)Wajibreturn
GofuncWajib (tipe setelah nama)return
RustfnWajibExpression (no keyword)
C(nama tipe)Wajibreturn

Best Practices Menulis Fungsi

1. Satu Fungsi = Satu Tugas

# ❌ Buruk — fungsi ngurusin dua hal
def proses_user(user):
    # validasi
    if len(user.nama) < 3:
        return False
    # kirim email juga di sini?!
    email.send(user.email, "Selamat datang!")
    return True

# ✅ Baik — pisah tanggung jawab
def validasi_user(user):
    return len(user.nama) >= 3

def kirim_selamat_datang(user):
    email.send(user.email, "Selamat datang!")

2. Nama Fungsi yang Deskriptif

# ❌ Buruk
def hitung(a, b):
    return a + b

# ✅ Baik
def jumlah_dua_angka(a, b):
    return a + b

3. Batasi Jumlah Parameter

Kalau fungsi punya lebih dari 3-4 parameter, mungkin saatnya pakai objek:

# ❌ Terlalu banyak parameter
def daftar_user(nama, email, telepon, alamat, kota, provinsi):
    ...

# ✅ Pakai objek
def daftar_user(data_user):
    ...

4. Hindari Side Effects

Side effect = fungsi mengubah sesuatu di luar dirinya (variabel global, file, database) tanpa sepengetahuan pemanggil.

total = 0

# ❌ Side effect — mengubah variabel global
def tambah_ke_total(x):
    global total
    total += x

# ✅ Pure function — hanya return hasil
def tambah(a, b):
    return a + b

5. Dokumentasi dengan Docstring

def hitung_bmi(berat, tinggi):
    """
    Menghitung Body Mass Index (BMI).
    
    Args:
        berat: Berat badan dalam kg
        tinggi: Tinggi badan dalam meter
    
    Returns:
        float: Nilai BMI
    """
    return berat / (tinggi ** 2)

Fungsi Lanjutan yang Perlu Kamu Tahu

Konsep fungsi nggak berhenti di sini. Beberapa topik lanjutan yang bakal kita bahas di artikel berikutnya:

  • Pure Function vs Impure Function — fungsi yang selalu return sama untuk input yang sama
  • Higher-Order Function — fungsi yang nerima atau return fungsi lain
  • Recursive Function — fungsi yang manggil dirinya sendiri
  • Anonymous Function / Lambda — fungsi tanpa nama

Konsep-konsep ini jadi dasar Functional Programming yang bisa kamu pelajari setelah menguasai fungsi dasar.

Kaitan dengan Artikel Lain

Fungsi adalah jembatan penting antara control flow dan struktur data:

  • Kamu udah belajar control flow yang mengatur alur program — fungsi adalah “tempat” di mana control flow itu terjadi.
  • Kamu juga udah belajar struktur data — fungsi adalah alat untuk memanipulasi struktur data tersebut.
  • Dan dari artikel algoritma dasar, fungsi adalah cara kita mengimplementasikan algoritma dalam kode nyata.

Kesimpulan

AspekIntinya
Apa itu fungsi?Blok kode bernama yang bisa dipanggil berulang, menerima input, dan mengembalikan output
Kenapa penting?DRY, modularitas, testability, abstraksi — fondasi kode yang rapi dan terawat
Komponen utamaNama, parameter, body, return value
ScopeVariabel di dalam fungsi (local) vs di luar fungsi (global) — pahami batasnya
Best practiceSatu fungsi satu tugas, nama deskriptif, batasi parameter, hindari side effect

Fungsi adalah fondasi penting setelah kamu paham control flow dan algoritma dasar. Setelah menguasai fungsi, kamu siap melangkah ke konsep berikutnya: Object-Oriented Programming — yang intinya adalah menggabungkan fungsi dengan data ke dalam satu kesatuan.



💬 Komentar