Setelah seluruh perangkat control flow dikenal, tantangan yang tersisa adalah memilih perangkat yang paling sesuai. Kode dengan struktur kendali yang tepat lebih mudah dibaca, diuji, dan diubah. Bagian ini merangkum kebiasaan yang menjaga kualitas alur program C# dalam pekerjaan sehari-hari.

Memilih Statement Sesuai Kebutuhan #

Tabel berikut memetakan situasi umum ke struktur yang paling wajar dipakai:

SituasiPilihanAlasan
Menguji satu atau dua kondisi rentangif–elsePaling langsung dan mudah dibaca
Memetakan satu nilai ke banyak cabangswitch expressionRingkas, hasilnya langsung diikat ke variabel
Mengulang dengan jumlah putaran pastiforCounter, kondisi, dan iterator terkumpul di header
Mengulang selama kondisi berlakuwhileJumlah putaran ditentukan kondisi, bukan counter
Mengunjungi seluruh elemen koleksiforeachTanpa indeks, bebas salah posisi
Berhenti sebelum loop selesaibreak / continueMengakhiri atau melewati putaran dengan niat yang jelas
Keluar dari nested loop dalamgoto ke labelTerbatas pada kasus yang tidak terjawab struktur lain

Mengurangi Nesting dengan Guard Clause #

Rantai if bersarang tiga tingkat membuat jalur utama program tersembunyi di dalam kurung kurawal yang menumpuk. Guard clause membalik polanya: kondisi yang tidak wajar ditangani lebih awal dengan return, sehingga jalur utama berdiri sejajar tanpa sarang. Contoh berikut memakai local function untuk ilustrasi singkat; pada program nyata, logika semacam ini biasanya berada di dalam method sebuah class.

csharp
Console.WriteLine($"Belanja 600000: diskon {HitungDiskon(600000)}%");
Console.WriteLine($"Belanja 250000: diskon {HitungDiskon(250000)}%");
Console.WriteLine($"Belanja 50000: diskon {HitungDiskon(50000)}%");

static int HitungDiskon(int totalBelanja)
{
    if (totalBelanja <= 0)
    {
        return 0;
    }

    if (totalBelanja < 100000)
    {
        return 0;
    }

    if (totalBelanja < 500000)
    {
        return 10;
    }

    return 20;
}

Output yang Dihasilkan:

text
Belanja 600000: diskon 20%
Belanja 250000: diskon 10%
Belanja 50000: diskon 0%

Mari kita telaah baris demi baris pada method HitungDiskon:

  1. Baris 5 (static int HitungDiskon): Local function menerima satu input dan selalu mengembalikan sebuah nilai, sehingga setiap jalur wajib berakhir return.
  2. Baris 7–10: Guard pertama menolak input nol atau negatif dengan langsung mengembalikan 0.
  3. Baris 12–15: Belanja di bawah seratus ribu juga menghasilkan 0; kedua guard menutup kasus tepi sebelum logika utama dibaca.
  4. Baris 17–20: Rentang 100000 sampai 499999 mendapat diskon 10 persen.
  5. Baris 22 (return 20;): Jalur utama tanpa else; karena seluruh jalur lain sudah kembali lebih awal, baris ini aman dan menjadi nilai bawaan untuk belanja besar.

Kode setara tanpa guard clause perlu menyusun else bertingkat, dan pembaca harus menghitung kurung untuk memahami jalur utama. Dengan guard clause, setiap kondisi tepi tertangani sekali di awal dan logika diskon terbaca sebagai daftar yang berurutan.

Jaga Kondisi Tetap Ringkas #

Kondisi yang menyusun banyak perbandingan sekaligus sulit diingat maknanya. Ekstrak logika tersebut ke variabel bool bernama, misalnya bool dapatDiskon = totalBelanja >= 100000 && !sedangPromo;, lalu gunakan variabel itu di dalam if. Nama yang deskriptif membuat keputusan kode terbaca seperti kalimat.

Satu tanggung jawab per loop juga patut dijaga: loop yang sekaligus memfilter, menjumlahkan, dan mengubah data lebih rentan salah saat diubah dibanding tiga loop sederhana yang masing-masing fokus. Hindari goto di luar kasus nested loop, dan jadikan break serta continue sebagai pengecualian yang kondisinya jelas, bukan gaya penulisan bawaan.