2.8. Dragon ADR Damage Take¶
Make 10 points damage to the dragon
Make 5 points damage to the dragon
Make 3 points damage to the dragon
Make 2 points damage to the dragon
Make 15 points damage to the dragon
Make 25 points damage to the dragon
Make 75 points damage to the dragon
2.8.1. Option 1¶
>>> dragon.set_damage(DMG)
Pros and Cons:
Good: easy to use
Good: clear intent
Good: encapsulation
Bad: the name indicates a setter of a
damage
attributeBad: not Pythonic way
Decision: rejected, method name indicates something else
2.8.2. Option 2¶
>>> dragon.wound(DMG) # dragon -> enemy
>>> dragon.hurt(DMG) # dragon <- enemy
>>> dragon.hit(DMG) # dragon <-> enemy
>>> dragon.damage(DMG) # dragon -> enemy
Pros and Cons:
Bad: Indication of direction is too weak
dragon <-> enemy
Decision: rejected, indication of direction is too weak
Example:
>>> dragon.hit(10) # bad, dragon make or take 10 damage?
Rationale:
dragon --> enemy
dragon -> enemy
dragon <-> enemy
dragon <- enemy
dragon <-- enemy
2.8.3. Option 3¶
>>> dragon.hurt_self(DMG)
>>> dragon.receive_damage(DMG)
Pros and Cons:
Good: Explicit relation
dragon --> enemy
Good: Consistent with
deal_damage()
Bad:
hurt_self()
is too use-case specificBad: Inconsistent with
make_damage()
Decision: rejected, method names are too use-case specific
Example:
>>> dragon.hurt_self(DMG)
>>> chair.hurt_self(DMG)
>>> barrel.hurt_self(DMG)
>>> dragon.receive_damage(DMG)
>>> chair.receive_damage(DMG)
>>> barrel.receive_damage(DMG)
2.8.4. Option 4¶
>>> dragon.take_damage(DMG)
Pros and Cons:
Good: Explicit relation
dragon --> enemy
Good: Consistent with
make_damage()
Decision: candidate
Example:
>>> dragon.take_damage(DMG)
>>> chair.take_damage(DMG)
>>> barrel.take_damage(DMG)
2.8.5. Option 5¶
>>> dragon.health - DMG
>>> dragon.health -= DMG
Pros and Cons:
Good: simple
Good: can use
@property
for validation if neededBad: requires knowledge of API
Bad: violates encapsulation
Decision: rejected, violates encapsulation
2.8.6. Option 6¶
>>> dragon.health - Damage(20)
>>> dragon.health -= Damage(20)
Pros and Cons:
Good: simple
Good: can use
@property
for validation if neededBad: requires knowledge of API
Bad: violates encapsulation
Decision: rejected, violates encapsulation
2.8.7. Option 7¶
>>> dragon - DMG
>>> dragon -= DMG
Pros and Cons:
Good: simple
Good: can use
.__sub__()
for validation if neededBad: requires knowledge of API
Decision: rejected, not explicit and requires knowledge of API
2.8.8. Option 8¶
>>> dragon - Damage(20)
>>> dragon -= Damage(20)
Pros and Cons:
Good: simple
Good: can use
.__sub__()
for validation if neededBad: requires knowledge of API
Decision: rejected, not explicit and requires knowledge of API
2.8.9. Option 9¶
>>> dragon < Damage(20)
>>> dragon <= Damage(20)
>>> dragon << Damage(20)
Pros and Cons:
Good: simple
Good: can use
.__lt__()
,.__le__()
for validation if neededBad: requires knowledge of API
Decision: rejected, not explicit and requires knowledge of API
2.8.10. Decision¶
>>> class Dragon:
... def take_damage(damage: int, /) -> None: ...
>>>
>>>
>>> dragon.take_damage(DMG)
Pros and Cons:
Good: provides encapsulation
Good: easy to use
Good: explicit relation
dragon --> enemy