Als developer, wil ik dat een methode zelf ongeldige aanroepen weigert en vragen kan beantwoorden met True of False, zodat de data van een object nooit in een onmogelijke toestand komt.
Een goed object laat niet alles toe. Je leert een methode schrijven die een ongeldige aanroep weigert en met True of False terugmeldt of het gelukt is.
Een object moet zichzelf beschermen. Een tank van 100 liter kan geen 150 liter bevatten. Zonder bewaker kan iemand van buiten dat toch doen:
class Tank:
def __init__(self, capacity):
self.capacity = capacity
self.level = 0
def fill(self, amount):
self.level += amount # geen controle!
tank = Tank(100)
tank.fill(150)
print(tank.level) # 150 - onmogelijk: de tank is maar 100 groot
De oplossing: de methode zegt nee. Hij controleert eerst en stopt met
return False als er iets niet klopt. Zo'n controle heet een guard (bewaker).
Je kent dit al van guard clauses in sprint 2. Nu zit de guard in de methode van het object.
class Tank:
def __init__(self, capacity):
self.capacity = capacity
self.level = 0
def fill(self, amount):
if amount <= 0: # bewaker 1: onzinnige waarde
return False
if self.level + amount > self.capacity: # bewaker 2: past niet meer
return False
self.level += amount # pas nu veranderen
return True
True betekent: gelukt. False betekent: geweigerd.
Vul de tank en kijk wanneer hij nee zegt.
tank = Tank(100)tank.fill(60) β wat geeft de methode terug?tank.leveltank.fill(50) β past dit?tank.level β is er iets veranderd?tank.fill(-5) β en een negatieve waarde?ok = tank.fill(30) β bewaar het antwoord.oktank.levelJe bouwt de kern van een bankrekening. De rekening beschermt zijn eigen saldo: het wordt nooit negatief en een bedrag van nul of minder wordt geweigerd.
BankAccount met __init__(self, owner, balance=0) en de attributen self.owner en self.balance.deposit(self, amount). Een bedrag van nul of minder wordt geweigerd. Anders komt het bedrag bij het saldo. De methode geeft True of False terug.withdraw(self, amount). Weiger een bedrag van nul of minder, en weiger een bedrag dat groter is dan het saldo. Anders gaat het bedrag van het saldo af. Geef weer True of False terug.account = BankAccount("Sam", 100) en roep achter elkaar aan: withdraw(30), withdraw(500), withdraw(-5), deposit(0) en deposit(25). Print na elke aanroep het antwoord Γ©n het saldo.False geeft?Acceptatiecriteria
withdraw(30) geeft True en het saldo is 70.withdraw(500) en withdraw(-5) geven False en het saldo blijft 70.deposit(0) geeft False; deposit(25) geeft True en het saldo is 95.return (geen print voor het antwoord) en controleren vΓ³Γ³r ze het saldo aanpassen.