Menu
CoddyTech

Buku Besar Bank

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Kotlin di Coddy. Pelajaran 57 dari 57.

challenge icon

Tantangan

Sulit

Buat sebuah bank kecil.

  • BankError(message) adalah class tersegel yang memperluas Exception, dengan subclass InvalidAmount (invalid amount), Insufficient(id) (insufficient funds in 2), WithdrawalLimit(id) (withdrawal limit on 2) dan NoAccount(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) dan withdraw(amount) melempar InvalidAmount untuk jumlah di bawah 1, dan withdraw melempar Insufficient ketika saldo akan turun di bawah lowestBalance akun. Class ini mendeklarasikan kind abstrak dan monthEnd() terbuka yang tidak melakukan apa pun.
  • Checking mengizinkan saldo negatif hingga -100. Savings tidak pernah turun di bawah 0, mengizinkan paling banyak 2 penarikan per bulan (WithdrawalLimit) dan, dalam monthEnd(), menambahkan bunga 1% (dibulatkan ke bawah) serta mengatur ulang jumlah penarikan.
  • Bank memiliki open(kind, id, owner), account(id) (melempar NoAccount), transfer(from, to, amount), yang mencari kedua akun terlebih dahulu lalu melakukan penarikan dan penyetoran, monthEnd() untuk setiap akun dan accounts() 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

Latihan sendiri: Playground Kotlin