Menu
Coddy logo textTech

Libro mayor bancario

Parte de la sección Programación orientada a objetos del Journey de Kotlin de Coddy. Lección 57 de 57.

challenge icon

Desafío

Difícil

Construye un banco pequeño.

  • BankError(message) es una clase sellada que extiende Exception, con las subclases InvalidAmount (invalid amount), Insufficient(id) (insufficient funds in 2), WithdrawalLimit(id) (withdrawal limit on 2) y NoAccount(id) (no account 9).
  • Account(id, owner) es abstracta. Su balance puede leerse en cualquier lugar y solo las clases de cuenta pueden modificarlo. deposit(amount) y withdraw(amount) lanzan InvalidAmount para cantidades inferiores a 1, y withdraw lanza Insufficient cuando el saldo quedaría por debajo del lowestBalance de la cuenta. Declara el kind abstracto y un monthEnd() abierto que no hace nada.
  • Checking permite un descubierto de hasta -100. Savings nunca baja de 0, permite como máximo 2 retiros por mes (WithdrawalLimit) y, en monthEnd(), añade un 1 % de interés (redondeado hacia abajo) y reinicia el contador de retiros.
  • Bank tiene open(kind, id, owner), account(id) (lanza NoAccount), transfer(from, to, amount), que busca primero ambas cuentas y después retira y deposita, monthEnd() para cada cuenta y accounts() ordenadas por id.

El código proporcionado lee los comandos open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 o month, imprime ok o el mensaje del error y, finalmente, cada cuenta como 1 ada checking: -20.

Tu código va en BankError.kt, InvalidAmount.kt, Insufficient.kt, WithdrawalLimit.kt, NoAccount.kt, Account.kt, Checking.kt, Savings.kt y Bank.kt. Main.kt contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

fun main() {
    // Código de entrada/salida suministrado: déjalo tal como está
    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}")
}

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Playground de Kotlin