Penyembunyian Informasi
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 34 dari 110.
Penyembunyian informasi adalah prinsip di balik enkapsulasi, yaitu gagasan bahwa sebuah class harus menyembunyikan cara kerja internalnya dan hanya menampilkan hal-hal yang diperlukan. Kamu sudah mempelajari mekanismenya (field private, getter, setter), tetapi tujuan sebenarnya adalah merancang class yang mudah digunakan dan sulit disalahgunakan.
Pertimbangkan sebuah class yang mengelola kata sandi pengguna. Penyimpanan internal dan logika hashing harus sepenuhnya tersembunyi:
class UserAccount {
String _username;
String _passwordHash;
UserAccount(this._username, String password)
: _passwordHash = _hashPassword(password);
static String _hashPassword(String password) {
return 'hashed_$password'; // Contoh yang disederhanakan
}
bool verifyPassword(String password) {
return _passwordHash == _hashPassword(password);
}
String get username => _username;
}Kode eksternal tidak pernah melihat hash kata sandi atau mengetahui cara penyimpanannya. Kode tersebut hanya memanggil verifyPassword(). Pemisahan ini berarti kamu dapat mengubah algoritma hashing sepenuhnya tanpa memengaruhi kode apa pun yang menggunakan class ini.
Inti pentingnya adalah memikirkan class-mu dari luar ke dalam.
Tanyakan pada dirimu: "Apa yang sebenarnya dibutuhkan oleh seseorang yang menggunakan class ini?" Tampilkan hanya hal itu, dan jadikan yang lainnya private. Dengan begitu, batas antara hal yang dilakukan class-mu (antarmuka publiknya) dan cara class itu melakukannya (implementasi privatnya) menjadi jelas.
Tantangan
MudahMari kita buat sistem dompet yang aman untuk menunjukkan cara kerja penyembunyian informasi. Kamu akan membuat dompet digital yang mengelola saldo dan riwayat transaksi pengguna, dengan menyembunyikan semua detail internal yang sensitif sepenuhnya dari kode eksternal.
Kamu akan mengatur kodemu dalam dua file:
wallet.dart: Buat classWalletyang mengelola uang dengan aman. Dompet harus menyimpan nama pemilik secara publik, tetapi semua hal lainnya harus disembunyikan di balik antarmuka publik yang rapi:- Saldo internal dan catatan transaksi harus bersifat privat. Kode eksternal tidak boleh mengetahui cara kamu menyimpan atau melacak uang
- Method privat harus menangani pencatatan transaksi secara internal (menyimpan entri seperti
"Deposit: $50.0"atau"Withdrawal: $30.0") - Sediakan method publik
deposit(double amount)yang menambahkan uang (hanya jika jumlahnya positif) dan mencatat transaksi secara internal - Sediakan method publik
withdraw(double amount)yang mengeluarkan uang hanya jika dana mencukupi dan jumlahnya positif, lalu mencatat transaksi secara internal. Kembalikantruejika berhasil, danfalsejika tidak - Sediakan getter publik
balanceyang mengembalikan saldo saat ini (akses hanya-baca) - Sediakan method publik
getTransactionCount()yang mengembalikan jumlah transaksi yang telah dicatat (tanpa menampilkan daftar transaksi yang sebenarnya) - Sediakan method publik
getLastTransaction()yang mengembalikan string transaksi terbaru, atau"No transactions"jika tidak ada - Sertakan method
printSummary()yang menampilkan status dompet
main.dart: Impor dompetmu dan tunjukkan cara penyembunyian informasi menciptakan antarmuka yang rapi dan aman:- Buat dompet untuk pemilik
"Sarah" - Setorkan
100.0 - Setorkan
50.0 - Coba tarik
200.0dan cetak"Withdrawal of 200.0: [success/failed]"berdasarkan hasilnya - Tarik
30.0dan cetak"Withdrawal of 30.0: [success/failed]" - Panggil
printSummary() - Cetak
"Transaction count: [count]" - Cetak
"Last transaction: [transaction]"
- Buat dompet untuk pemilik
Method printSummary() harus mencetak:
=== Wallet Summary ===
Owner: [ownerName]
Balance: $[balance]Perhatikan bagaimana kode eksternal dapat berinteraksi dengan dompet melalui method yang jelas dan terarah, tanpa mengetahui cara saldo disimpan atau transaksi dilacak secara internal. Detail implementasinya sepenuhnya tersembunyi. Kamu dapat mengubah cara transaksi disimpan tanpa memengaruhi kode apa pun yang menggunakan dompet.
Output yang diharapkan:
Withdrawal of 200.0: failed
Withdrawal of 30.0: success
=== Wallet Summary ===
Owner: Sarah
Balance: $120.0
Transaction count: 3
Last transaction: Withdrawal: $30.0Coba sendiri
import 'wallet.dart';
void main() {
// TODO: Buat dompet untuk pemilik "Sarah"
// TODO: Setor 100.0
// TODO: Setor 50.0
// TODO: Coba tarik 200.0 dan cetak hasilnya
// Format: "Withdrawal of 200.0: [success/failed]"
// TODO: Tarik 30.0 dan cetak hasilnya
// Format: "Withdrawal of 30.0: [success/failed]"
// TODO: Panggil printSummary()
// TODO: Cetak jumlah transaksi
// Format: "Transaction count: [count]"
// TODO: Cetak transaksi terakhir
// Format: "Last transaction: [transaction]"
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses PembayaranLatihan sendiri: Compiler Dart online