Seluruh pola pada section ini kini bisa dirangkai menjadi alur keputusan yang utuh. Bab penutup ini merangkum praktik terbaik yang muncul berulang di bab-bab sebelumnya, lalu menuntaskannya dengan satu contoh alur pembayaran yang memakai hierarki record, urutan arm, guard, dan arm discard sekaligus.
Daftar Praktik Utama #
| Praktik | Bab rujukan |
|---|---|
| Letakkan arm paling spesifik di atas | Type Pattern, Relational Pattern |
Sertakan arm _ untuk keutuhan switch expression | Switch Expression |
| Pilih record + switch expression untuk data keputusan | Positional Pattern |
| Gunakan property pattern untuk aturan berbasis isi data | Property Pattern |
Pakai when hanya untuk syarat yang tak terungkap pola | Switch Expression |
Ikat dengan var bila nilai dipakai, pakai _ bila tidak | Var Pattern, Discard Pattern |
Uji null dengan pola is not null sebelum pola lain | Null Patterns |
| Pecah arm yang terlalu padat menjadi method bernama | Pattern Combinators |
Contoh Terpadu: Alur Pembayaran #
public abstract record StatusPembayaran;
public record Menunggu(int HariTersisa) : StatusPembayaran;
public record Lunas(string NomorResi) : StatusPembayaran;
public record Gagal(string Alasan) : StatusPembayaran;
string Evaluasi(StatusPembayaran status) => status switch
{
Menunggu { HariTersisa: <= 0 } => "Segera hubungi pembeli",
Menunggu m when m.HariTersisa > 7 => "Pengingat otomatis",
Menunggu => "Menunggu pembayaran",
Lunas l => $"Lunas, resi {l.NomorResi}",
Gagal g => $"Gagal: {g.Alasan}",
_ => "Status tidak dikenal"
};
StatusPembayaran[] daftar =
[
new Menunggu(9),
new Menunggu(0),
new Lunas("JX-77120"),
new Gagal("Saldo tidak mencukupi")
];
foreach (StatusPembayaran status in daftar)
{
Console.WriteLine(Evaluasi(status));
}Output yang Dihasilkan:
Pengingat otomatis
Segera hubungi pembeli
Lunas, resi JX-77120
Gagal: Saldo tidak mencukupiMari kita bedah keputusan desainnya:
- Hierarki record:
StatusPembayaranabstract dengan tiga record turunan membuat setiap keadaan punya data sendiri, sehingga pola bisa menilai isi tanpa cast. - Urutan arm
Menunggu: Arm dengan property pattern terkecil, guardwhen, lalu type pattern polos; urutan ini memastikan kasus jatuh tempo diperiksa sebelum kasus umum. - Binding
ldang: Type pattern mengikat record turunan sehinggaNomorResidanAlasanterbaca langsung di hasil arm. - Arm
_: Compiler tidak bisa menjamin tidak ada turunan lain dari record abstract, sehingga discard menjadi pengaman keutuhan yang eksplisit.
Kapan Tidak Memakai Pattern Matching #
Pola paling berguna ketika aturan menilai bentuk dan isi data. Pemeriksaan kesetaraan tunggal cukup dengan == atau is, cabang dengan banyak statement cocok untuk switch statement, dan logika yang mengubah state program lebih jelas ditulis sebagai method bernama. Gunakan pattern matching untuk tabel keputusan, bukan sebagai pengganti segala percabangan.