Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 class Wallet yang 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. Kembalikan true jika berhasil, dan false jika tidak
    • Sediakan getter publik balance yang 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.0 dan cetak "Withdrawal of 200.0: [success/failed]" berdasarkan hasilnya
    • Tarik 30.0 dan cetak "Withdrawal of 30.0: [success/failed]"
    • Panggil printSummary()
    • Cetak "Transaction count: [count]"
    • Cetak "Last transaction: [transaction]"

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.0

Coba 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]"
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online