Menu
CoddyTech

Sistem Perbankan

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

challenge icon

Tantangan

Mudah

Mari bangun Sistem Perbankan yang mengelola akun, transaksi, dan operasi keuangan! Kamu akan membuat sistem tangguh yang menjaga integritas data: saldo akun hanya boleh berubah melalui method yang sudah divalidasi, dan error seperti penarikan melebihi saldo atau jumlah yang tidak valid harus ditangani dengan baik.

Kamu akan mengatur kodemu dalam lima file:

  • account.go: Definisikan interface Transactable dengan method Deposit(amount float64) error dan Withdraw(amount float64) error. Lalu buat dua tipe akun yang mengimplementasikan interface ini:

    CheckingAccount dengan field id, holder, dan balance yang tidak diekspor. Checking account mengizinkan penarikan yang membuat saldo tepat nol, tetapi tidak boleh kurang dari nol.

    SavingsAccount dengan field tidak diekspor yang sama, ditambah field minBalance. Savings account harus mempertahankan saldo minimum 100.0: penarikan yang membuat saldo turun di bawah batas ini harus gagal.

    Kedua tipe akun memerlukan konstruktor (NewCheckingAccount dan NewSavingsAccount) serta method getter Balance() float64. Untuk deposit, tolak jumlah negatif atau nol. Untuk penarikan, tolak jumlah negatif atau nol serta jumlah yang melebihi dana tersedia.

  • transaction.go: Buat struct Transaction untuk mencatat aktivitas akun. Setiap transaksi memiliki Type (string: "deposit" atau "withdrawal"), Amount (float64), dan AccountID (string). Sertakan konstruktor NewTransaction dan method String() string yang mengembalikan format: [Type] $[Amount] on [AccountID] dengan jumlah yang diformat menjadi dua angka desimal.
  • bank.go: Buat struct Bank yang mengelola beberapa akun dan mencatat transaksi. Simpan akun dalam map berdasarkan ID dan simpan transaksi dalam slice. Implementasikan:
    • NewBank() *Bank: menginisialisasi koleksi kosong
    • AddAccount(id string, account Transactable): mendaftarkan akun
    • Deposit(accountID string, amount float64) error: melakukan deposit ke akun dan mencatat transaksi jika berhasil
    • Withdraw(accountID string, amount float64) error: menarik dana dari akun dan mencatat transaksi jika berhasil
    • Transfer(fromID, toID string, amount float64) error: memindahkan uang antar akun secara atomik (jika penarikan berhasil tetapi deposit gagal, batalkan penarikan)
    • GetBalance(accountID string) (float64, error): mengembalikan saldo akun

    Kembalikan error yang sesuai untuk akun yang tidak ada.

  • errors.go: Definisikan error sentinel untuk operasi perbankanmu:
    • ErrAccountNotFound: ketika ID akun tidak ada
    • ErrInsufficientFunds: ketika jumlah penarikan melebihi saldo yang tersedia
    • ErrInvalidAmount: ketika jumlah deposit atau penarikan bernilai nol atau negatif
    • ErrMinBalanceRequired: ketika penarikan dari savings account akan melanggar saldo minimum
  • main.go: Buat bank dan proses operasi berdasarkan input.

    Baca jumlah akun yang akan dibuat. Untuk setiap akun, baca tipe akun (checking atau savings), ID, nama pemegang akun, dan saldo awal. Buat tipe akun yang sesuai dan tambahkan ke bank.

    Lalu baca jumlah operasi. Setiap operasi adalah salah satu dari berikut:

    • deposit [accountID] [amount]
    • withdraw [accountID] [amount]
    • transfer [fromID] [toID] [amount]
    • balance [accountID]

    Untuk setiap operasi, cetak hasilnya: OK untuk deposit, penarikan, atau transfer yang berhasil, saldo yang diformat menjadi dua angka desimal untuk permintaan saldo, atau Error: [message] untuk kegagalan menggunakan pesan error sentinel milikmu.

Input yang diberikan adalah:

  • Jumlah akun, lalu tipe, ID, pemegang akun, dan saldo awal untuk setiap akun (masing-masing 4 baris)
  • Jumlah operasi, lalu setiap operasi (masing-masing 1 baris)

Contohnya, jika diberikan:

2
checking
ACC001
Alice
500.00
savings
ACC002
Bob
1000.00
6
deposit ACC001 200
balance ACC001
withdraw ACC002 950
withdraw ACC001 800
transfer ACC001 ACC002 100
balance ACC002

Outputmu seharusnya:

OK
700.00
Error: minimum balance required
Error: insufficient funds
OK
1000.00

Dan jika diberikan:

1
checking
C100
Charlie
100.00
4
withdraw C100 100
balance C100
deposit C100 -50
withdraw C999 50

Outputmu seharusnya:

OK
0.00
Error: invalid amount
Error: account not found

Perhatikan bagaimana interface Transactable memungkinkan Bank bekerja dengan kedua tipe akun secara seragam, sementara setiap tipe akun menerapkan aturannya sendiri. Method Transfer menunjukkan operasi atomik. Jika terjadi kesalahan di tengah proses, sistem tetap konsisten!

Coba sendiri

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)

	// Baca jumlah akun
	scanner.Scan()
	numAccounts, _ := strconv.Atoi(scanner.Text())

	// Buat bank baru
	bank := NewBank()

	// Baca dan buat akun
	for i := 0; i < numAccounts; i++ {
		scanner.Scan()
		accountType := scanner.Text()
		scanner.Scan()
		id := scanner.Text()
		scanner.Scan()
		holder := scanner.Text()
		scanner.Scan()
		balance, _ := strconv.ParseFloat(scanner.Text(), 64)

		// TODO: Buat tipe akun yang sesuai berdasarkan accountType
		// dan tambahkan ke bank
		_ = accountType
		_ = id
		_ = holder
		_ = balance
	}

	// Baca jumlah operasi
	scanner.Scan()
	numOps, _ := strconv.Atoi(scanner.Text())

	// Proses setiap operasi
	for i := 0; i < numOps; i++ {
		scanner.Scan()
		parts := strings.Fields(scanner.Text())
		operation := parts[0]

		// TODO: Tangani setiap jenis operasi:
		// - "deposit": setorkan dana ke akun, cetak "OK" atau error
		// - "withdraw": tarik dana dari akun, cetak "OK" atau error
		// - "transfer": transfer dana antar akun, cetak "OK" atau error
		// - "balance": ambil dan cetak saldo dengan format 2 angka di belakang koma
		_ = operation
	}
}

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online