Menghapus percabangan yang tidak perlu

Setiap cabang menggandakan jalur yang harus dibaca. Sebagian cabang tidak membawa keputusan apa pun, dan menghapusnya lebih baik daripada merapikannya.

Sebaiknya baca lebih dulu: Memecah langkah jadi satu tugas.

Dua cabang bersarang berarti empat jalur yang harus dibayangkan pembaca. Tiga berarti delapan. Angka itu naik lebih cepat daripada dugaan siapa pun, dan itulah sebabnya kode yang penuh IF terasa jauh lebih berat daripada kode yang sama panjangnya tanpa IF. Kabar baiknya, sebagian besar cabang di kode sehari hari tidak membawa keputusan apa pun.

IngatMenyelesaikan materi tingkat lanjut tidak menggeser satu pun rating sumbu. Rating hanya bergerak lewat pengiriman di arena.

Cabang yang hanya mengembalikan nilai perbandingannya

Cabang tanpa keputusan

IF umur >= 17 THEN
    RETURN TRUE
ELSE
    RETURN FALSE
END IF

Nilai perbandingannya langsung

RETURN umur >= 17

Bentuk kiri menanyakan sesuatu yang sudah bernilai benar atau salah, lalu menjawabnya dengan benar atau salah. Cabangnya tidak memutuskan apa pun; ia hanya menuliskan ulang jawaban yang sudah ada. Perhatikan bahwa bentuk kanan juga menghilangkan satu kesalahan yang sering terjadi pada bentuk kiri, yaitu menukar TRUE dan FALSE tanpa satu pun tanda pada pembacaan cepat.

Klausa penjaga menggantikan sarang

Sarang yang paling sering muncul bukan sarang keputusan, melainkan sarang syarat. Setiap tingkat menanyakan satu hal yang harus benar sebelum yang berikutnya boleh dijalankan, dan isi sebenarnya terkubur di dasar. Klausa penjaga membalik urutannya: tolak dulu yang tidak memenuhi syarat, lalu jalankan isinya pada tingkat teratas.

Isi terkubur di dasar sarang

IF pesanan != NULL THEN
    IF pesanan.lunas THEN
        IF pesanan.jumlah > 0 THEN
            RETURN pesanan.jumlah * pesanan.harga
        END IF
    END IF
END IF
RETURN 0

Tolak dulu, lalu hitung

IF pesanan == NULL THEN RETURN 0
IF NOT pesanan.lunas THEN RETURN 0
IF pesanan.jumlah <= 0 THEN RETURN 0

RETURN pesanan.jumlah * pesanan.harga

Kedua kolom berperilaku sama persis. Bedanya, di kolom kanan baris yang mengerjakan pekerjaan sebenarnya berada pada tingkat teratas dan tidak perlu dicari. Setiap syaratnya juga berdiri sendiri, jadi menambah satu syarat baru berarti menambah satu baris, bukan menambah satu tingkat sarang beserta pemindahan seluruh isinya.

Cabang yang isinya nyaris sama

Dua cabang berbeda satu angka

IF anggota THEN
    SET total = harga * 0.9
    CATAT total
    RETURN total
ELSE
    SET total = harga * 1.0
    CATAT total
    RETURN total
END IF

Bedanya diangkat jadi nilai

SET pengali = 0.9 IF anggota ELSE 1.0
SET total = harga * pengali
CATAT total
RETURN total

Di kolom kiri, tiga dari empat baris pada kedua cabang identik. Duplikasi itu bukan sekadar panjang: siapa pun yang memperbaiki pencatatan pada satu cabang akan meninggalkan cabang lainnya, dan cacat semacam itu tidak terlihat pada pembacaan cepat justru karena kedua kolomnya mirip. Yang benar benar bercabang hanya angkanya, jadi hanya angkanya yang perlu bercabang.

Cabang yang memang perlu ada

Bukan semua cabang layak dihapus, dan pelajaran ini bukan ajakan menghapus IF sebanyak mungkin. Cabang yang membawa keputusan sungguhan, yaitu dua jalur yang benar benar mengerjakan hal berbeda, sudah berada di bentuk yang tepat. Memaksanya menjadi satu baris berumus panjang hanya memindahkan kerumitan dari struktur ke ekspresi, dan ekspresi yang rumit lebih sulit dilacak daripada cabang yang jelas.

Periksa pemahaman

Sebuah fungsi memuat empat tingkat IF bersarang. Setiap tingkat memeriksa satu syarat yang harus benar, dan perhitungan sebenarnya berada di tingkat terdalam. Mana perbaikan yang paling tepat?

  • Jumlah jalur naik dua kali per tingkat sarang. Dua tingkat sudah empat jalur.
  • Cabang yang hanya mengembalikan TRUE dan FALSE tidak memutuskan apa pun. Kembalikan perbandingannya.
  • Sarang syarat menjadi klausa penjaga. Tolak lebih dulu, kerjakan di tingkat teratas.
  • Bila dua cabang nyaris sama, yang bercabang seharusnya hanya bedanya.
  • Cabang yang membawa keputusan sungguhan dibiarkan sebagai cabang. Memaksanya jadi ekspresi memindahkan kerumitan, bukan menghapusnya.