Return Early

Bila ada if di baris N dan letak else jauh dari N. Dan if elsenya bersarang begitu banyak. Sudah pasti ada yang tidak beres. format penulisan seperti ini istilahnya long nested if. Format ini setidaknya punya tiga efek negatif :

1. Membuat kode sulit difahami.
2. Kemungkinan bugs lebih tinggi.
3. Proses debug menjadi lebih lama.

Sebagai contoh mari amati kode berikut. Ide kode sangatlah sederhana: kirim sms bila nomer tujuan dan pesan sudah valid . Pastikan request berasal dari alamat IP yang diizinkan. Selainnya tolak dan berikan pesan error.

  1. function sendSms () {
  2.  
  3.   $allow_ip = ['127.0.0.1', '192.168.1.4', '192.168.1.9'];
  4.  
  5.   if (array_key_exists($_SERVER["REMOTE_ADDR"], $allow_ip) == true) 
  6.   {
  7.     if (isset($_POST['phone']) and isset($_POST['message'])) {
  8.  
  9.       $url = "https://api.vendorsms.com/v1/send";
  10.       $token   = base64_encode("petruk:petruk123");
  11.       $data = json_encode(
  12.         ["from" => "petruk", 
  13.         "to"    => $_POST['phone'], 
  14.         "text"  => $_POST['message']]
  15.       );
  16.  
  17.       $curl    = curl_init($url);
  18.       curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
  19.       curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
  20.       curl_setopt($curl, CURLOPT_HEADER, false);
  21.       curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  22.       curl_setopt($curl, CURLOPT_HTTPHEADER, 
  23.       ["Content-Type: application/json", 
  24.        "Authorization: Basic $token"]);
  25.       curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  26.       $response = curl_exec($curl);
  27.       print $response;
  28.     } else {
  29.       die('nomer dan pesan tidak boleh kosong');
  30.     }
  31.   } else {
  32.     die('access denied');
  33.   }

If-nya di jakarta, else-nya di wakanda!. Ketika tiba di baris ke 5 (percabangan awal), bola mata otomatis mencari dimana percabangan ini berakhir. Dibuanglah kita ke baris 31. Baru saja selesai mencerna percabangan awal. Kita kembali dipermainkan di baris ke 7 (percabangan kedua). Kembali kita dibuang ke baris 28 untuk menemukan letak akhir percabangan.

Setelah jungkir balik baru bisa ke baris selanjutnya. Sangat tidak nyaman.

Ini baru di satu file. Belum lagi di file lain. Sangat mungkin kita bertemu yang lebih buruk. Hiyy. Daripada muntah mari refactor menjadi format return early.

  1. function sendSms() {
  2.  
  3.   $allow_ip = ['127.0.0.1', '192.168.1.4', '192.168.1.9'];
  4.  
  5.   // Return early jika source request tdk valid
  6.   if (array_key_exists($_SERVER["REMOTE_ADDR"], $allow_ip) == false) 
  7.   {
  8.     return 'ERROR: Tidak Diizinkan.';
  9.   }
  10.  
  11.   // Return early jika phone dan message tdk valid
  12.   if (
  13.     isset($_POST['phone']) == false and 
  14.     isset($_POST['message']) == false) {
  15.     return "ERROR: Nomer tujuan dan pesan tdk boleh kosong.";
  16.   }
  17.  
  18.   $url   = "https://api.vendorsms.com/v3/send";
  19.   $token = base64_encode("petruk:petruk123");
  20.   $data = json_encode(
  21.     ["from" => "petruk",
  22.     "to"    => $_POST['phone'],
  23.     "text"  => $_POST['message']]
  24.   );
  25.  
  26.   $curl    = curl_init($url);
  27.   curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
  28.   curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
  29.   curl_setopt($curl, CURLOPT_HEADER, false);
  30.   curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  31.   curl_setopt($curl, CURLOPT_HTTPHEADER, 
  32.     ["Content-Type: application/json", 
  33.     "Authorization: Basic $token"];
  34.   curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  35.   return curl_exec($curl);
  36. }

Nah.. kini kode lebih nyaman dibaca. Bola mata tidak lagi lelah loncat atas bawah. Karena proses baca sudah dibuat sederhana dan runut. Ide tersirat pun jadi lebih mudah difahami.

Masih banyak yang bisa direfactor dari kode tersebut. Pada kesempatan ini kita abaikan saja. Kita fokus untuk menghilangkan tradisi long nested if.

Kode ditulis untuk dibaca ulang pada kemudian hari. Entah oleh pribadi atau orang lain. Jangan sampai pengembangan di masa depan jadi rumit karena sesuatu yang kita perbuat sendiri.

Referensi:
Clean Code: A handbook of agile software craftmanship. Robert C Martin.

Author: Gibrain

Co founder kodenesia.com. Mendukung emas sebagai standar mata uang.

Leave a Reply

Your email address will not be published. Required fields are marked *