Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 class Wallet dalam namespace Finance yang 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 mengembalikan true jika berhasil, atau false jika tidak
    • Method public Withdraw(decimal amount) yang mengurangi saldo hanya jika jumlahnya positif dan tidak melebihi saldo saat ini, lalu mengembalikan true jika berhasil, atau false jika tidak
    • Method public CanAfford(decimal amount) yang mengembalikan true jika saldo lebih besar dari atau sama dengan jumlah tersebut, atau false jika tidak
    • Method public GetStatement() yang menggunakan method private FormatBalance() secara internal dan mengembalikan "Current balance: {formatted balance}"
    Perhatikan bahwa tidak ada cara untuk membaca atau mengatur saldo secara langsung. Kamu hanya dapat berinteraksi dengannya melalui method yang terkontrol!
  • Program.cs: Di file utamamu, buat Wallet dan 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: False

Inti 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}"
    }
}
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 C# online