Курс Raku / Додаток 🆕 / Типи та текстові машини / Об’єкти та класи / Вправи / Банківський рахунок

Розв’язання: Банківський рахунок

Ось одне з можливих розв’язань задачі.

Код

class Account {
    has $!balance = 0;

    method deposit($amount) {
        $!balance += $amount;
    }

    method withdraw($amount) {
        if $amount > $!balance {
            say 'declined: insufficient funds';
        }
        else {
            $!balance -= $amount;
        }
    }

    method balance { $!balance }
}

my $account = Account.new;
$account.deposit(100);
$account.withdraw(30);
$account.withdraw(200);

say $account.balance;

🦋 Знайдіть програму у файлі bank-account.raku.

Вивід

declined: insufficient funds
70

Коментарі

  1. has $!balance = 0 оголошує атрибут приватним — із тайглом ! він узагалі не має згенерованого аксесора, тож єдиний спосіб змінити баланс — це методи, які надає клас. method balance дає зовнішньому світові спосіб його прочитати, але не спосіб його встановити.

  2. Це зроблено навмисно. Якби ми написали has $.balance, тайгл . додав би публічний аксесор — типово лише для читання, але одне необачне is rw на ньому відкрило б пряме присвоєння на кшталт $account.balance = 1_000_000, дозволивши будь-кому рухати гроші повз deposit чи withdraw. Приватний атрибут виключає це за побудовою: баланс може змінюватися лише за власними правилами рахунку — такими, як перевірка на нестачу коштів у withdraw.

  3. Друге знімання просить більше, ніж є на балансі, тож його відхилено, а баланс лишається на 70.

Навігація курсом

Банківський рахунок   |   Фігури зі спільною роллю