Menu
Coddy logo textTech

Registro bancario

Fa parte della sezione Programmazione orientata agli oggetti del percorso Kotlin di Coddy. Lezione 57 di 57.

challenge icon

Sfida

Difficile

Crea una piccola banca.

  • BankError(message) è una classe sealed che estende Exception, con le sottoclassi InvalidAmount (invalid amount), Insufficient(id) (insufficient funds in 2), WithdrawalLimit(id) (withdrawal limit on 2) e NoAccount(id) (no account 9).
  • Account(id, owner) è astratta. Il suo balance può essere letto ovunque e modificato solo dalle classi degli account. deposit(amount) e withdraw(amount) generano InvalidAmount per importi inferiori a 1, e withdraw genera Insufficient quando il saldo scenderebbe al di sotto del lowestBalance dell'account. Dichiara kind come astratto e un monthEnd() open che non fa nulla.
  • Checking consente uno scoperto fino a -100. Savings non scende mai sotto 0, consente al massimo 2 prelievi al mese (WithdrawalLimit) e, in monthEnd(), aggiunge l'1% di interesse (arrotondato per difetto) e azzera il conteggio dei prelievi.
  • Bank dispone di open(kind, id, owner), account(id) (genera NoAccount), transfer(from, to, amount), che cerca prima entrambi gli account e poi preleva e deposita, monthEnd() per ogni account e accounts() ordinati per id.

Il codice fornito legge i comandi open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 o month, stampa ok o il messaggio dell'errore e infine ogni account come 1 ada checking: -20.

Il tuo codice va inserito in BankError.kt, InvalidAmount.kt, Insufficient.kt, WithdrawalLimit.kt, NoAccount.kt, Account.kt, Checking.kt, Savings.kt e Bank.kt. Main.kt contiene il codice fornito per l'input/output e non può essere modificato.

Provalo tu

fun main() {
    // Codice di input/output fornito: lascialo così com'è
    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}")
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Playground Kotlin