Syarat di dunia nyata sering berlapis: pendaftar harus cukup umur dan mengunggah KTP, pesanan diproses hanya jika stok tersedia dan alamat terisi. Kondisi bersarang (nested conditions) adalah cara pertama yang biasanya muncul di kepala pemula untuk menyuarakan aturan berlapis tersebut. Sayangnya, nesting yang terlalu dalam cepat membuat kode sulit dibaca. Pada Chapter ini kita akan menulis kondisi bersarang, lalu mempelajari dua teknik untuk meratakannya: menggabungkan operator logika dan pola early return.
if di dalam if #
Blok if dapat berisi if lain, dan blok bagian dalam hanya dievaluasi apabila kondisi bagian luar bernilai True. Setiap tingkat kedalaman menambah satu tingkat indentasi.
umur = 20
punya_ktp = True
if umur >= 17:
if punya_ktp:
print("Pendaftaran diterima")
else:
print("Umur cukup, tapi KTP belum diunggah")
else:
print("Umur belum memenuhi syarat")Output yang Dihasilkan:
Pendaftaran diterimaMari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 4 (
if umur >= 17:):20 >= 17bernilaiTrue, eksekusi masuk ke blok bagian dalam. - Baris 5 (
if punya_ktp:): variabelpunya_ktpbernilaiTrue, pesan keberhasilan dicetak. - Baris 7-10 (kedua
else): kedua blokelsedilewati karena cabang di atasnya sudah cocok.
Kode di atas sah dan benar. Masalah muncul ketika jumlah tingkat bertambah: pembaca harus menjaga seluruh konteks kondisi di kepala untuk memahami cabang paling dalam.
Meratakan Kondisi dengan and dan or #
Ketika blok bagian dalam hanya menjawab “dua syarat sekaligus”, operator logika and meratakan struktur tersebut menjadi satu kondisi:
umur = 20
punya_ktp = False
if umur >= 17 and punya_ktp:
print("Pendaftaran diterima")
elif umur >= 17 and not punya_ktp:
print("Umur cukup, tapi KTP belum diunggah")
else:
print("Umur belum memenuhi syarat")Output yang Dihasilkan:
Umur cukup, tapi KTP belum diunggahSetiap cabang kini menyatakan syaratnya secara lengkap dan eksplisit. Mari kita bandingkan kedua versi:
| Aspek | Nested if | Diratakan dengan and |
|---|---|---|
| Jumlah tingkat indentasi | 3 tingkat | 2 tingkat |
| Syarat tiap cabang | tersebar di dua baris | utuh di satu baris |
| Risiko salah baca | tinggi pada cabang dalam | lebih rendah |
Pola Early Return #
Teknik perataan berikutnya bekerja di dalam function. Alih-alih membungkus logika utama dalam berlapis if, kita tuliskan pemeriksaan penolakan (guard clause) satu per satu di awal, lalu akhiri setiap penolakan dengan return. Pernyataan return menghentikan function saat itu juga, sehingga kode di bawahnya hanya berurusan dengan data yang sudah pasti sah.
def verifikasi_pesanan(stok, alamat):
if stok <= 0:
return "Pesanan ditolak: stok habis"
if not alamat:
return "Pesanan ditolak: alamat kosong"
return "Pesanan diproses"
print(verifikasi_pesanan(0, "Jl. Merdeka No. 1"))
print(verifikasi_pesanan(3, ""))
print(verifikasi_pesanan(3, "Jl. Merdeka No. 1"))Output yang Dihasilkan:
Pesanan ditolak: stok habis
Pesanan ditolak: alamat kosong
Pesanan diprosesMari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 2 (
if stok <= 0:): guard clause pertama — bila stok habis, function mengembalikan pesan penolakan dan berhenti di baris ini. - Baris 4 (
if not alamat:): hanya tercapai bila stok masih ada; string kosong bernilaiFalse(truthiness), jadinot alamatbernilaiTrue. - Baris 6 (
return "Pesanan diproses"): hanya tercapai bila kedua pemeriksaan di atas lolos.
Kita akan membahas function secara tuntas pada Section Fungsi; untuk sekarang, cukup pahami bahwa return mengakhiri eksekusi function lebih awal. Bandingkan dengan versi nested: logika utama “pesanan diproses” tidak lagi terjebak di tingkat indentasi terdalam.
Kapan Nested Tetap Layak #
Nested bukan musuh yang harus selalu dihindari. Gunakan penilaian sederhana berikut:
- Ratakan bila blok dalam hanya mengombinasikan syarat — bentuk
and/oratau guard clause hampir selalu lebih mudah dibaca. - Biarkan bersarang bila blok dalam melakukan pekerjaan yang benar-benar berbeda untuk tiap cabang luar, misalnya memproses tiap peran pengguna dengan cara berbeda setelah pemeriksaan login.
- Batasi kedalaman dua tingkat. Lebih dari itu, pecah logika menjadi beberapa function kecil dengan nama yang deskriptif.
Kombinasi nested yang dangkal, operator logika yang eksplisit, dan guard clause membuat cabang program tetap jelas dibaca enam bulan kemudian — standar nyata untuk keterbacaan kode di industri.