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 #

PraktikBab rujukan
Letakkan arm paling spesifik di atasType Pattern, Relational Pattern
Sertakan arm _ untuk keutuhan switch expressionSwitch Expression
Pilih record + switch expression untuk data keputusanPositional Pattern
Gunakan property pattern untuk aturan berbasis isi dataProperty Pattern
Pakai when hanya untuk syarat yang tak terungkap polaSwitch Expression
Ikat dengan var bila nilai dipakai, pakai _ bila tidakVar Pattern, Discard Pattern
Uji null dengan pola is not null sebelum pola lainNull Patterns
Pecah arm yang terlalu padat menjadi method bernamaPattern Combinators

Contoh Terpadu: Alur Pembayaran #

csharp
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:

text
Pengingat otomatis
Segera hubungi pembeli
Lunas, resi JX-77120
Gagal: Saldo tidak mencukupi

Mari kita bedah keputusan desainnya:

  1. Hierarki record: StatusPembayaran abstract dengan tiga record turunan membuat setiap keadaan punya data sendiri, sehingga pola bisa menilai isi tanpa cast.
  2. Urutan arm Menunggu: Arm dengan property pattern terkecil, guard when, lalu type pattern polos; urutan ini memastikan kasus jatuh tempo diperiksa sebelum kasus umum.
  3. Binding l dan g: Type pattern mengikat record turunan sehingga NomorResi dan Alasan terbaca langsung di hasil arm.
  4. 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.