Menu
CoddyTech

Penyembunyian Informasi di Go

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 50 dari 107.

Penyembunyian informasi lebih dari sekadar membuat field tidak diekspor. Ini tentang merancang tipe agar kode eksternal hanya mengetahui hal yang perlu diketahuinya. Tidak lebih.

Tujuannya adalah menampilkan perilaku melalui method sambil menjaga struktur internal tetap sepenuhnya tersembunyi. Pertimbangkan pendekatan ini:

type Counter struct {
    value    int
    maxLimit int
}

func NewCounter(limit int) *Counter {
    return &Counter{maxLimit: limit}
}

func (c *Counter) Increment() bool {
    if c.value >= c.maxLimit {
        return false
    }
    c.value++
    return true
}

func (c *Counter) Value() int {
    return c.value
}

Kode eksternal tidak mengetahui bahwa Counter menggunakan int secara internal. Tipe datanya bisa berupa float64, slice, atau hal lain sepenuhnya. Implementasinya bisa berubah tanpa memengaruhi kode apa pun yang menggunakan Counter, selama method-nya berperilaku sama.

Prinsip ini juga berlaku untuk fungsi pembantu. Biarkan logika internal tetap tidak diekspor:

// Diekspor, bagian dari API publik
func (c *Counter) Reset() {
    c.value = 0
}

// Tidak diekspor, fungsi pembantu internal
func (c *Counter) isAtLimit() bool {
    return c.value >= c.maxLimit
}

Dengan menyembunyikan isAtLimit(), kamu bebas mengubah atau menghapusnya nanti. Penyembunyian informasi menciptakan batas yang jelas antara hal yang dijanjikan package-mu kepada pengguna eksternal dan cara kerjanya secara internal.

challenge icon

Tantangan

Mudah

Mari kita buat sistem dompet aman yang menunjukkan penyembunyian informasi. Kamu akan membuat dompet digital yang pelacakan saldo internal dan riwayat transaksinya sepenuhnya tersembunyi dari kode eksternal: hanya perilakunya yang terlihat melalui method.

Kamu akan mengatur kodemu dalam dua file:

  • wallet.go: Buat struct Wallet yang menyembunyikan semua status internalnya. Dompet harus melacak saldo saat ini dan batas pengeluaran secara internal, tetapi kode eksternal tidak boleh mengetahui bagaimana keduanya disimpan atau direpresentasikan. Sediakan perilaku melalui method berikut:
    • NewWallet(limit float64) *Wallet - konstruktor yang membuat dompet dengan batas pengeluaran yang diberikan dan saldo nol
    • Deposit(amount float64) bool - menambahkan uang ke dompet, mengembalikan true jika berhasil (jumlahnya harus positif)
    • Spend(amount float64) bool - mengurangi uang jika saldo mencukupi DAN jumlahnya tidak melebihi batas pengeluaran, mengembalikan true jika berhasil
    • Balance() float64 - mengembalikan saldo saat ini
    • Status() string - mengembalikan pesan status dengan format: Balance: $[balance] (Limit: $[limit])
    Simpan logika bantuan apa pun (seperti pemeriksaan apakah transaksi valid) sebagai fungsi atau method yang tidak diekspor. Ini adalah detail implementasi internal yang bisa berubah nanti.
  • main.go: Baca konfigurasi dompet dan transaksi dari input, buat dompet, lakukan operasi, lalu tampilkan hasil setelah setiap tindakan.

Input berikut akan diberikan:

  • Baris 1: Batas pengeluaran
  • Baris 2: Jumlah setoran
  • Baris 3: Jumlah pengeluaran pertama
  • Baris 4: Jumlah pengeluaran kedua

Setelah membuat dompet, cetak status awalnya. Lalu lakukan setiap operasi dan cetak status terbaru (jika berhasil) atau Transaction failed (jika operasi ditolak). Format semua jumlah dolar dengan dua angka desimal.

Misalnya, dengan input 50, 100, 30, dan 80, outputmu seharusnya:

Balance: $0.00 (Limit: $50.00)
Balance: $100.00 (Limit: $50.00)
Balance: $70.00 (Limit: $50.00)
Transaction failed

Transaksi terakhir gagal karena $80 melebihi batas pengeluaran $50, meskipun saldonya mencukupi. Dompet menerapkan aturannya secara internal tanpa mengungkapkan bagaimana keputusan ini dibuat. Kode eksternal cukup memanggil method dan menerima hasilnya, tanpa mengetahui detail implementasi internal.

Coba sendiri

package main

import (
	"fmt"
)

func main() {
	// Baca input
	var limit float64
	var depositAmount float64
	var spend1 float64
	var spend2 float64

	fmt.Scanln(&limit)
	fmt.Scanln(&depositAmount)
	fmt.Scanln(&spend1)
	fmt.Scanln(&spend2)

	// TODO: Buat dompet baru dengan batas pengeluaran yang diberikan

	// TODO: Cetak status awal

	// TODO: Lakukan setoran dan cetak hasilnya (status atau "Transaction failed")

	// TODO: Lakukan pengeluaran pertama dan cetak hasilnya

	// TODO: Lakukan pengeluaran kedua dan cetak hasilnya
}
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 Go online