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.

python
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:

text
Pendaftaran diterima

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. Baris 4 (if umur >= 17:): 20 >= 17 bernilai True, eksekusi masuk ke blok bagian dalam.
  2. Baris 5 (if punya_ktp:): variabel punya_ktp bernilai True, pesan keberhasilan dicetak.
  3. Baris 7-10 (kedua else): kedua blok else dilewati 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:

python
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:

text
Umur cukup, tapi KTP belum diunggah

Setiap cabang kini menyatakan syaratnya secara lengkap dan eksplisit. Mari kita bandingkan kedua versi:

AspekNested ifDiratakan dengan and
Jumlah tingkat indentasi3 tingkat2 tingkat
Syarat tiap cabangtersebar di dua barisutuh di satu baris
Risiko salah bacatinggi pada cabang dalamlebih 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.

python
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:

text
Pesanan ditolak: stok habis
Pesanan ditolak: alamat kosong
Pesanan diproses

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. Baris 2 (if stok <= 0:): guard clause pertama — bila stok habis, function mengembalikan pesan penolakan dan berhenti di baris ini.
  2. Baris 4 (if not alamat:): hanya tercapai bila stok masih ada; string kosong bernilai False (truthiness), jadi not alamat bernilai True.
  3. 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/or atau 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.