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:
| Praktik | Alat yang Dipakai | Bab Rujukan |
|---|---|---|
| Hindari field publik; sediakan pintu yang terkontrol | Property dengan backing field atau auto-property | Property Dasar |
| Baca saja bila data tidak boleh diubah dari luar | Property get-only | Getter dan Setter |
| Isi sekali saat pembuatan object | Aksesor init | Init-Only Properties |
| Wajibkan data penting diisi | Modifier required | Required Members |
| Tulis aksesor satu baris secara ringkas | Expression-bodied (=>) | Expression-Bodied Properties |
| Satu pintu untuk semua penulisan | Validasi di aksesor set atau method | Property Validation |
| Nilai turunan dihitung, bukan disimpan | Computed property | Computed Properties |
| Bagikan satu penyimpanan untuk beberapa sudut pandang | Backing field manual | Backing Fields |
| Rapikan logika aksesor tanpa field manual | Kata kunci field | Field-Backed Properties |
| Ekspos item koleksi lewat notasi kurung siku | Indexer | Indexers |
Contoh: Class Transaksi Terpadu #
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:
TRX-001 - Keyboard Mekanik
Total: Rp900000Mari kita bedah praktik yang bekerja pada setiap baris:
public string Kode { get; }: property get-only auto-implemented yang hanya dapat diisi lewat constructor; kode luar tidak punya jalur penulisan.public required string Nama { get; init; }: kombinasirequireddaninitmemaksa pengisian pada object initializer, lalu mengunci nilai untuk sisa masa program.public int Total { get { return Harga * Jumlah; } }:Totaladalah computed property; nilai turunan tidak disimpan sehingga tidak mungkin berbeda dariHargadanJumlah.new Transaksi("TRX-001") { Nama = ..., Harga = ..., Jumlah = ... }: object initializer menjadi satu-satunya tempat pengisian data; bila satu propertyrequiredtidak 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.