Kita telah menempuh seluruh varian property, dari aksesor get/set hingga indexer. Bab penutup section ini merangkum semuanya menjadi praktik yang dapat langsung diterapkan. Aturan besarnya sederhana: buka akses sesempit mungkin, dan perlakukan setiap property sebagai pintu yang dapat kita pasangi aturan. Contoh terakhir menyatukan beberapa praktik tersebut dalam satu class.

Ringkasan Praktik #

Tabel berikut memetakan praktik ke alat C# yang tepat:

PraktikAlat yang DipakaiBab Rujukan
Hindari field publik; sediakan pintu yang terkontrolProperty dengan backing field atau auto-propertyProperty Dasar
Baca saja bila data tidak boleh diubah dari luarProperty get-onlyGetter dan Setter
Isi sekali saat pembuatan objectAksesor initInit-Only Properties
Wajibkan data penting diisiModifier requiredRequired Members
Tulis aksesor satu baris secara ringkasExpression-bodied (=>)Expression-Bodied Properties
Satu pintu untuk semua penulisanValidasi di aksesor set atau methodProperty Validation
Nilai turunan dihitung, bukan disimpanComputed propertyComputed Properties
Bagikan satu penyimpanan untuk beberapa sudut pandangBacking field manualBacking Fields
Rapikan logika aksesor tanpa field manualKata kunci fieldField-Backed Properties
Ekspos item koleksi lewat notasi kurung sikuIndexerIndexers

Contoh: Class Transaksi Terpadu #

csharp
public class Transaksi
{
    public string Kode { get; }
    public required string Nama { get; init; }
    public int Harga { get; init; }
    public int Jumlah { get; init; }

    public int Total
    {
        get { return Harga * Jumlah; }
    }

    public Transaksi(string kode)
    {
        Kode = kode;
    }
}

Transaksi transaksi = new Transaksi("TRX-001")
{
    Nama = "Keyboard Mekanik",
    Harga = 450000,
    Jumlah = 2
};

Console.WriteLine($"{transaksi.Kode} - {transaksi.Nama}");
Console.WriteLine($"Total: Rp{transaksi.Total}");

Output yang Dihasilkan:

text
TRX-001 - Keyboard Mekanik
Total: Rp900000

Mari kita bedah praktik yang bekerja pada setiap baris:

  1. public string Kode { get; }: property get-only auto-implemented yang hanya dapat diisi lewat constructor; kode luar tidak punya jalur penulisan.
  2. public required string Nama { get; init; }: kombinasi required dan init memaksa pengisian pada object initializer, lalu mengunci nilai untuk sisa masa program.
  3. public int Total { get { return Harga * Jumlah; } }: Total adalah computed property; nilai turunan tidak disimpan sehingga tidak mungkin berbeda dari Harga dan Jumlah.
  4. new Transaksi("TRX-001") { Nama = ..., Harga = ..., Jumlah = ... }: object initializer menjadi satu-satunya tempat pengisian data; bila satu property required tidak diisi, compiler menolak kode tersebut.

Dengan section ini selesai, kita memiliki bekal lengkap untuk merancang class yang menyembunyikan datanya dan membuka akses secara selektif. Section berikutnya, Inheritance dan Polymorphism, membangun di atas fondasi tersebut untuk menghubungkan satu class dengan class lainnya.