Buku Besar Bank
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Kotlin di Coddy. Pelajaran 57 dari 57.
Tantangan
SulitBuat sebuah bank kecil.
BankError(message)adalah class tersegel yang memperluasException, dengan subclassInvalidAmount(invalid amount),Insufficient(id)(insufficient funds in 2),WithdrawalLimit(id)(withdrawal limit on 2) danNoAccount(id)(no account 9).Account(id, owner)bersifat abstrak.balance-nya dapat dibaca di mana saja dan hanya dapat diubah oleh class akun.deposit(amount)danwithdraw(amount)melemparInvalidAmountuntuk jumlah di bawah 1, danwithdrawmelemparInsufficientketika saldo akan turun di bawahlowestBalanceakun. Class ini mendeklarasikankindabstrak danmonthEnd()terbuka yang tidak melakukan apa pun.Checkingmengizinkan saldo negatif hingga -100.Savingstidak pernah turun di bawah 0, mengizinkan paling banyak 2 penarikan per bulan (WithdrawalLimit) dan, dalammonthEnd(), menambahkan bunga 1% (dibulatkan ke bawah) serta mengatur ulang jumlah penarikan.Bankmemilikiopen(kind, id, owner),account(id)(melemparNoAccount),transfer(from, to, amount), yang mencari kedua akun terlebih dahulu lalu melakukan penarikan dan penyetoran,monthEnd()untuk setiap akun danaccounts()yang diurutkan berdasarkan id.
Kode yang disediakan membaca perintah open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 atau month, mencetak ok atau pesan error, lalu mencetak setiap akun dengan format 1 ada checking: -20.
Kodemu ditulis di BankError.kt, InvalidAmount.kt, Insufficient.kt, WithdrawalLimit.kt, NoAccount.kt, Account.kt, Checking.kt, Savings.kt dan Bank.kt. Main.kt berisi kode input/output yang disediakan dan tidak dapat diedit.
Coba sendiri
fun main() {
// Kode input/output yang disediakan: biarkan apa adanya
val input = generateSequence(::readLine).toList()
val bank = Bank()
for (cmd in input) {
val p = cmd.split(" ")
try {
when (p[0]) {
"open" -> bank.open(p[1], p[2].toInt(), p[3])
"dep" -> bank.account(p[1].toInt()).deposit(p[2].toInt())
"wd" -> bank.account(p[1].toInt()).withdraw(p[2].toInt())
"tr" -> bank.transfer(p[1].toInt(), p[2].toInt(), p[3].toInt())
else -> bank.monthEnd()
}
println("ok")
} catch (e: BankError) {
println(e.message)
}
}
for (a in bank.accounts()) println("${a.id} ${a.owner} ${a.kind}: ${a.balance}")
}
Semua pelajaran di Pemrograman Berorientasi Objek
1class dan object
Bekerja dengan fileMendefinisikan classKonstruktor utamaBlok init dan validasiKonstruktor sekunderRingkasan: Kartu Perpustakaan2property dan Enkapsulasi
Accessor KustomModifier VisibilitasSetter Privatlazy dan lateinitRingkasan: Rekening Bank5Interface
Mendeklarasikan Interfacemethod DefaultBeberapa InterfaceInterface sebagai TipeUlasan: Metode Pembayaran11Proyek: Pengelolaan Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Kotlin