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.