2
下面我有一個簡單的類,其中包含一些事件。 不要擔心Event
課,它完美無瑕。更好的邏輯發射事件和做實際事件?
class Warrior:
def __init__(self, health, damage):
self.health = health
self.damage = damage
# events
self.e_hurt = Event()
self.e_attack = Event()
def hurt(self, damage):
self.health -= damage
self.e_hurt.fire()
def attack(self, target):
target.hurt(self.damage)
self.e_attack.fire()
我無法弄清楚是在哪裏開火我的活動。 在戰士受傷後觸發e_hurt
事件以及戰士受到攻擊後發生事件e_attack
是最有意義的。 attacker.e_attack
前 但是,這導致進入victim.e_hurt
被炒,當attacker
攻擊victim
:
def on_hurt():
print "Someone was hurt."
def on_attack():
print "Someone attacked."
def main():
victim = Warrior(50, 0)
victim.e_hurt.subscribe(on_hurt)
attacker = Warrior(50, 20)
attacker.e_attack.subscribe(on_attack)
attacker.attack(victim)
兩個事件得到 「錯誤」(編程正確的,但語義錯誤的)順序輸出:
Someone was hurt.
Someone attacked.
很明顯,戰士必須在其他戰士受傷之前進行攻擊。 當然我可以只改變attack
- 方法看起來像這樣:
def attack(self, target):
self.e_attack.fire()
target.hurt(self.damage)
但實際攻擊發生之前就感覺不對,提高攻擊事件,以及其他一些事件可能需要被調用襲擊發生後。
我能想到的唯一的實際解決方案是有兩個事件(before_attack
和after_attack
),但有沒有更好的解決方案,不需要兩個事件的一個實際事件(攻擊)?