Menu
Coddy logo textTech

Registre bancaire

Fait partie de la section Programmation orientée objet du Journey Kotlin de Coddy. Leçon 57 sur 57.

challenge icon

Défi

Difficile

Construisez une petite banque.

  • BankError(message) est une classe scellée qui étend Exception, avec les sous-classes InvalidAmount (invalid amount), Insufficient(id) (insufficient funds in 2), WithdrawalLimit(id) (withdrawal limit on 2) et NoAccount(id) (no account 9).
  • Account(id, owner) est abstraite. Son balance peut être lu partout et modifié uniquement par les classes de comptes. deposit(amount) et withdraw(amount) lèvent InvalidAmount pour les montants inférieurs à 1, et withdraw lève Insufficient lorsque le solde passerait sous le lowestBalance du compte. Elle déclare le kind abstrait ainsi qu'un monthEnd() ouvert qui ne fait rien.
  • Checking autorise un découvert jusqu'à -100. Savings ne descend jamais sous 0, autorise au plus 2 retraits par mois (WithdrawalLimit) et, dans monthEnd(), ajoute 1 % d'intérêts (arrondis à l'entier inférieur) et réinitialise le nombre de retraits.
  • Bank possède open(kind, id, owner), account(id) (qui lève NoAccount), transfer(from, to, amount), qui recherche d'abord les deux comptes puis effectue le retrait et le dépôt, monthEnd() pour chaque compte et accounts() trié par identifiant.

Le code fourni lit les commandes open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 ou month, affiche ok ou le message de l'erreur, puis affiche finalement chaque compte sous la forme 1 ada checking: -20.

Votre code doit être placé dans BankError.kt, InvalidAmount.kt, Insufficient.kt, WithdrawalLimit.kt, NoAccount.kt, Account.kt, Checking.kt, Savings.kt et Bank.kt. Main.kt contient le code fourni de lecture des entrées et d'affichage des sorties et ne peut pas être modifié.

Essayez vous-même

fun main() {
    // Code d'entrée/sortie fourni : le garder tel quel
    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}")
}

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Playground Kotlin