Belajar memahami mengapa data perlu dilindungi, bagaimana menerapkan enkapsulasi menggunakan properties, dan kapan menggunakannya dalam proyek nyata.
Tujuan pembelajaran
Setelah mempelajari materi ini, kamu diharapkan mampu:
- Memahami konsep enkapsulasi melalui analogi sehari-hari.
- Menjelaskan masalah ketika field dapat diubah secara bebas.
- Menggunakan
private,public, dan properties di C#. - Membuat validasi data menggunakan
set. - Menerapkan enkapsulasi pada studi kasus sederhana.
1. Analogi dunia nyata
Mesin ATM: saldo tidak boleh diubah sembarangan
Bayangkan kamu memiliki rekening bank dengan saldo Rp500.000.
Ketika ingin mengambil uang, kamu menggunakan ATM. Kamu memasukkan PIN, memilih jumlah uang, lalu ATM memproses transaksi.
Kamu tidak bisa langsung membuka sistem internal ATM dan mengganti saldo menjadi Rp10.000.000 hanya dengan mengetik angka.
Mengapa?
Karena sistem ATM memiliki aturan:
- Saldo disimpan di dalam sistem dan tidak bisa diakses sembarangan.
- Pengguna hanya bisa melakukan operasi yang disediakan, seperti setor uang atau tarik uang.
- Sistem memeriksa apakah saldo mencukupi sebelum uang ditarik.
Hubungannya dengan OOP
|
Dunia nyata |
C# |
|---|---|
Saldo rekening |
Field atau data dalam class |
Sistem internal ATM |
Data yang disembunyikan (private) |
Tombol tarik/setor tunai |
Method atau property yang dapat diakses |
Validasi saldo |
Logika bisnis di dalam class |
Inti enkapsulasi:
Enkapsulasi adalah prinsip OOP yang menggabungkan data dan perilaku dalam sebuah class, sekaligus membatasi akses langsung terhadap data tersebut agar hanya dapat digunakan melalui aturan yang ditentukan.
Jadi, enkapsulasi bukan sekadar membuat field menjadi private. Tujuan utamanya adalah menjaga agar data tetap valid dan perubahan terhadapnya dapat dikontrol.
2. Masalah tanpa enkapsulasi (Kode Sebelum)
Mari kita buat simulasi rekening bank sederhana.
Contoh kode C# tanpa enkapsulasi
Output
Secara teknis, program tersebut dapat berjalan. Namun, secara logika bisnis, saldo rekening menjadi tidak masuk akal.
Apa masalahnya?
1. Data dapat diubah sembarangan
Class Program dapat langsung mengganti nilai saldo tanpa meminta izin atau mengikuti aturan tertentu.
2. Tidak ada validasi
Saldo seharusnya tidak boleh negatif dalam simulasi rekening sederhana ini. Namun, class RekeningBank tidak memiliki mekanisme untuk mencegahnya.
3. Class lain terlalu mengetahui detail internal
Class lain dapat memanipulasi data rekening secara langsung. Jika aturan saldo berubah, kita harus mencari semua bagian kode yang mungkin mengubah field tersebut.
Gambaran masalah
Catatan: public bukan berarti selalu buruk. Field atau property public berguna ketika data memang boleh diakses. Masalahnya adalah ketika data penting dapat diubah tanpa kontrol.
3. Solusi dengan enkapsulasi (Kode Sesudah)
Sekarang kita perbaiki class RekeningBank agar saldo tidak bisa diubah secara langsung oleh class lain.
Langkah 1 — Gunakan access modifiers
Access modifier menentukan siapa yang dapat mengakses anggota sebuah class.
|
Modifier |
Akses |
|---|---|
public |
Dapat diakses dari luar class |
private |
Hanya dapat diakses di dalam class itu sendiri |
Contoh
Di sini:
saldobersifatprivate.- Class
Programtidak bisa mengubahsaldosecara langsung. - Method
TampilkanSaldo()dapat digunakan untuk membaca saldo.
Jika kita menulis:
Maka akan muncul error karena saldo bersifat private.
Langkah 2 — Gunakan Properties C#
Di C#, cara modern untuk mengontrol akses data adalah menggunakan property.
Property terlihat seperti variabel ketika digunakan, tetapi dapat memiliki logika saat data dibaca atau diubah.
Struktur property
Penjelasan:
|
Bagian |
Fungsi |
|---|---|
public |
Property bisa diakses dari luar class |
decimal |
Tipe data saldo |
Saldo |
Nama property |
get |
Mengambil nilai |
set |
Mengubah nilai |
value |
Nilai baru yang dikirim ke property |
Versi modern C#
C# juga mendukung sintaks yang lebih ringkas:
Namun, jika kita ingin melakukan validasi, kita perlu menambahkan logika di dalam set.
Langkah 3 — Enkapsulasi dengan validasi saldo
Berikut contoh class rekening yang sudah diperbaiki.
Kode C# lengkap
Output
Bedah kode: bagian penting
A. Field private
Field saldo hanya bisa diakses langsung dari dalam class RekeningBank.
Class Program tidak dapat melakukan:
Ini adalah pembatasan akses terhadap data internal.
B. Property dengan private set
Dalam contoh lengkap, property ditulis dengan validasi:
Artinya:
public get→ saldo dapat dibaca dari luar class.private set→ saldo hanya dapat diubah melalui kode di dalam class.- Validasi
value >= 0→ nilai negatif ditolak.
C. Method Setor() dan Tarik()
Class dari luar tidak mengubah saldo secara langsung. Mereka meminta class rekening melakukan operasi melalui method yang disediakan.
Visualisasi alur enkapsulasi
Perbandingan kode sebelum dan sesudah
|
Sebelum |
Sesudah |
|---|---|
public decimal Saldo; |
private decimal saldo; |
Bisa diubah bebas |
Tidak bisa diubah langsung |
Tidak ada validasi |
Ada validasi |
Class lain memanipulasi data |
Class mengatur perubahan melalui method |
Risiko data tidak valid |
Data lebih terkontrol |
4. Kesimpulan
Tiga manfaat utama enkapsulasi
1. Melindungi data
Dengan private, data penting tidak dapat diubah sembarangan dari luar class.
Contoh: saldo rekening tidak dapat langsung diisi angka negatif.
2. Menjaga validitas data
Dengan property atau method yang memiliki validasi, class dapat memastikan data sesuai aturan.
Contoh:
3. Mempermudah pemeliharaan kode
Aturan perubahan data berada di dalam class yang bertanggung jawab.
Jika aturan saldo berubah, kita dapat memperbaiki logika di RekeningBank tanpa harus mengubah semua class yang menggunakan rekening.