Implementasi Penyembunyian Data
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 33 dari 70.
Penyembunyian data lebih dari sekadar menggunakan field private. Ini tentang merancang class agar detail implementasi internal sama sekali tidak terlihat oleh kode luar, dan hanya menampilkan hal yang diperlukan melalui antarmuka publik yang rapi.
Pertimbangkan sebuah class yang melacak kata sandi pengguna. Kamu tidak ingin siapa pun mengakses kata sandi asli, bahkan hanya untuk membacanya:
public class UserAccount
{
private string passwordHash;
public void SetPassword(string password)
{
passwordHash = HashPassword(password);
}
public bool VerifyPassword(string password)
{
return HashPassword(password) == passwordHash;
}
private string HashPassword(string password)
{
return password.GetHashCode().ToString();
}
}Perhatikan bahwa tidak ada cara untuk mengambil kata sandi atau bahkan hash-nya. Kode eksternal hanya dapat menetapkan kata sandi atau memverifikasinya, mekanisme penyimpanan internal sepenuhnya tersembunyi. HashPassword method juga bersifat privat karena merupakan detail implementasi yang dapat berubah tanpa memengaruhi cara class digunakan.
Pendekatan ini melindungi class-mu dari penyalahgunaan dan memberimu kebebasan untuk mengubah bagian internalnya nanti. Jika kamu memutuskan untuk menggunakan algoritma hashing yang berbeda, tidak ada kode eksternal yang rusak karena tidak ada yang bergantung pada cara password disimpan.
Tantangan
MudahMari bangun sistem dompet yang aman untuk menunjukkan penyembunyian data yang sesungguhnya. Kamu akan membuat dompet digital yang saldonya sepenuhnya terlindungi dari akses langsung. Kode eksternal hanya dapat menyetor, menarik, dan memeriksa apakah transaksi dapat dilakukan, tetapi tidak pernah dapat melihat atau mengubah saldo sebenarnya secara langsung.
Kamu akan membagi kodemu ke dalam dua file:
Wallet.cs: Buat classWalletdalam namespaceFinanceyang menyembunyikan saldonya sepenuhnya. Dompet ini harus memiliki:- Field private untuk menyimpan saldo (decimal)
- Method private
FormatBalance()yang mengembalikan saldo dalam format string mata uang seperti"$123.45". Ini adalah helper internal yang tidak boleh diekspos - Method public
Deposit(decimal amount)yang menambahkan saldo hanya jika jumlahnya positif, lalu mengembalikantruejika berhasil, ataufalsejika tidak - Method public
Withdraw(decimal amount)yang mengurangi saldo hanya jika jumlahnya positif dan tidak melebihi saldo saat ini, lalu mengembalikantruejika berhasil, ataufalsejika tidak - Method public
CanAfford(decimal amount)yang mengembalikantruejika saldo lebih besar dari atau sama dengan jumlah tersebut, ataufalsejika tidak - Method public
GetStatement()yang menggunakan method privateFormatBalance()secara internal dan mengembalikan"Current balance: {formatted balance}"
Program.cs: Di file utamamu, buatWalletdan lakukan serangkaian transaksi menggunakan nilai input. Tunjukkan bagaimana dompet melindungi keadaan internalnya sekaligus tetap menyediakan fungsi yang berguna melalui antarmuka public-nya.
Kamu akan menerima tiga input:
- Jumlah setoran awal (decimal)
- Jumlah penarikan yang akan dicoba (decimal)
- Jumlah yang akan diperiksa keterjangkauannya (decimal)
Cetak output dalam format ini:
Deposit {amount}: {True/False}
{GetStatement() result}
Withdraw {amount}: {True/False}
{GetStatement() result}
Can afford {amount}: {True/False}Sebagai contoh, jika inputnya adalah 100.50, 30.25, dan 80.00, outputnya harus seperti ini:
Deposit 100.50: True
Current balance: $100.50
Withdraw 30.25: True
Current balance: $70.25
Can afford 80.00: FalseInti pentingnya adalah kode eksternal tidak pernah menyentuh field saldo secara langsung. Bahkan string saldo yang sudah diformat diperoleh melalui method public yang menggunakan helper private secara internal. Inilah penyembunyian data. Detail implementasinya sepenuhnya tidak terlihat, dan kamu bebas mengubah cara saldo disimpan atau diformat tanpa merusak kode apa pun yang menggunakan dompetmu!
Coba sendiri
using System;
using Finance;
class Program
{
public static void Main(string[] args)
{
// Baca nilai input
decimal depositAmount = Convert.ToDecimal(Console.ReadLine());
decimal withdrawAmount = Convert.ToDecimal(Console.ReadLine());
decimal checkAmount = Convert.ToDecimal(Console.ReadLine());
// TODO: Buat instance Wallet
// TODO: Lakukan penyetoran dan cetak hasilnya dalam format: "Deposit {amount}: {True/False}"
// TODO: Cetak pernyataan menggunakan GetStatement()
// TODO: Lakukan penarikan dan cetak hasilnya dalam format: "Withdraw {amount}: {True/False}"
// TODO: Cetak pernyataan menggunakan GetStatement()
// TODO: Periksa apakah saldo mencukupi dan cetak hasilnya dalam format: "Can afford {amount}: {True/False}"
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalNamespace & DirektifPengantar class & objectKata Kunci 'this'Method dan ParameterField vs PropertyKonstruktorInisialisasi objectRingkasan: Kalkulator Sederhana4Pewarisan
Sintaks Dasar Pewarisan (:)Kata Kunci 'base'Kata Kunci Virtual & OverrideClass SealedBase Class 'object'Rangkuman: Hierarki Karyawan7Fitur Lanjutan
Overloading OperatorIndexer (this[])Penimpaan ToString()Extension methodRingkasan: Custom list2Property & Anggota Statis
Property yang Diimplementasikan OtomatisProperty Hanya Baca dan Hanya TulisField dan method StatisClass StatisAnggota Berbentuk Ekspresi5Polimorfisme & Antarmuka
Polimorfisme saat kompilasi vs runtimeAntarmuka vs kelas abstrakBeberapa antarmukaAntarmuka eksplisitUpcasting & DowncastingRingkasan, Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi daripada PewarisanGenerics (class dan method)Delegate dan EventAtribut dan ReflectionIDisposable dan Pernyataan usingDasar-Dasar Dependency Injection11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola Composite3Arsitektur class
Data Instance vs StaticKata Kunci 'readonly' & 'const'Field PendukungRingkasan: Pengelola Rekening Bank6Enkapsulasi
Pengubah AksesProperti untuk EnkapsulasiImplementasi Penyembunyian DataPola ImutabilitasUlasan: Data SiswaLatihan sendiri: Compiler C# online