Cursus Raku / Addendum 🆕 / Types en tekstmachines / Objecten en klassen / Exercises / Een bankrekening
Oplossing: Een bankrekening
Hier is een mogelijke oplossing voor de taak.
Code
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;🦋 Je kunt de broncode vinden in het bestand bank-account.raku.
Uitvoer
declined: insufficient funds
70Opmerkingen
has $!balance = 0declareert het attribuut private — met de twigil!heeft het helemaal geen gegenereerde accessor, dus de enige manier om het saldo te veranderen is via de methoden die de klasse aanbiedt. Eenmethod balancegeeft de buitenwereld een manier om het te lezen, maar geen manier om het te zetten.Dat is met opzet. Hadden we
has $.balancegeschreven, dan zou de twigil.een publieke accessor toevoegen — standaard alleen-lezen, maar één onachtzameis rwerop zou rechtstreekse toekenning als$account.balance = 1_000_000blootleggen, waarmee iedereen geld kon verplaatsen zonder langsdepositofwithdrawte gaan. Het attribuut private houden sluit dat door constructie uit: het saldo kan alleen ooit veranderen volgens de eigen regels van de rekening, zoals de controle op ontoereikend saldo inwithdraw.De tweede opname vraagt meer dan het saldo, dus wordt hij geweigerd en blijft het saldo op
70.