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:
| Situasi | Pilihan | Alasan |
|---|---|---|
| Menguji satu atau dua kondisi rentang | if–else | Paling langsung dan mudah dibaca |
| Memetakan satu nilai ke banyak cabang | switch expression | Ringkas, hasilnya langsung diikat ke variabel |
| Mengulang dengan jumlah putaran pasti | for | Counter, kondisi, dan iterator terkumpul di header |
| Mengulang selama kondisi berlaku | while | Jumlah putaran ditentukan kondisi, bukan counter |
| Mengunjungi seluruh elemen koleksi | foreach | Tanpa indeks, bebas salah posisi |
| Berhenti sebelum loop selesai | break / continue | Mengakhiri atau melewati putaran dengan niat yang jelas |
| Keluar dari nested loop dalam | goto ke label | Terbatas 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.
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:
Belanja 600000: diskon 20%
Belanja 250000: diskon 10%
Belanja 50000: diskon 0%Mari kita telaah baris demi baris pada method HitungDiskon:
- Baris 5 (
static int HitungDiskon): Local function menerima satu input dan selalu mengembalikan sebuah nilai, sehingga setiap jalur wajib berakhirreturn. - Baris 7–10: Guard pertama menolak input nol atau negatif dengan langsung mengembalikan
0. - Baris 12–15: Belanja di bawah seratus ribu juga menghasilkan
0; kedua guard menutup kasus tepi sebelum logika utama dibaca. - Baris 17–20: Rentang 100000 sampai 499999 mendapat diskon 10 persen.
- Baris 22 (
return 20;): Jalur utama tanpaelse; 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.