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 methode kan eerst vragen stellen en dan pas iets doen. Je bouwt een methode die een bedrag van de ene rekening naar de andere overmaakt, met queries als bewakers.
De sterkste methodes combineren beide. Ze vragen eerst (query), beslissen dan (guard) en doen daarna pas iets (verandering).
class Tank:
def __init__(self, capacity):
self.capacity = capacity
self.level = 0
def fill(self, amount):
if amount <= 0 or self.level + amount > self.capacity:
return False
self.level += amount
return True
def can_give(self, amount): # query
return amount > 0 and amount <= self.level
def can_fit(self, amount): # query
return self.level + amount <= self.capacity
def transfer_to(self, other, amount): # guard + verandering
if not self.can_give(amount):
return False
if not other.can_fit(amount):
return False
self.level -= amount
other.level += amount
return True
transfer_to bevat zelf geen rekenwerk voor de regels. Hij vraagt het aan de twee tanks.
Verandert er later een regel, dan pas je hem op รฉรฉn plek aan.
Pomp water van de ene tank naar de andere en probeer het te laten mislukken.
a = Tank(100)b = Tank(100)a.fill(80) โ vul a.a.transfer_to(b, 50) โ lukt dit?a.levelb.levela.transfer_to(b, 50) โ en nog een keer?a.level โ is er iets veranderd?b.levelJe bankrekening kan nu geld overmaken naar een andere rekening. Je gebruikt je eigen queries als bewakers.
BankAccount uit taak 2 over, met deposit, withdraw, can_afford en is_empty.transfer(self, other, amount). Weiger een bedrag van nul of minder. Weiger ook als self.can_afford(amount) False geeft.other. Gebruik daarvoor je eigen methodes withdraw en deposit.True terug bij gelukt en False bij geweigerd. Bij weigeren verandert geen van beide saldo's.sam = BankAccount("Sam", 100) en kim = BankAccount("Kim", 20). Maak 50 over van Sam naar Kim en daarna 500. Print na beide pogingen het antwoord en beide saldo's.Acceptatiecriteria
sam.transfer(kim, 50) geeft de methode True, Sam heeft 50 en Kim heeft 70.sam.transfer(kim, 500) geeft de methode False en de saldo's zijn nog 50 en 70.transfer roept self.can_afford, withdraw en deposit aan; de regels staan niet dubbel in de methode.