Menu
CoddyTech

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