次のようなクラスPerson
があります。
class Person(object):
def __init__(self, health, damage):
self.health = health
self.damage = damage
def attack(self, victim):
victim.hurt(self.damage)
def hurt(self, damage):
self.health -= damage
Event
イベントが発生したときに呼び出されるリスナー関数を保持するクラスもあります。インスタンスにいくつかのイベントを追加しましょう。
def __init__(self, health, damage):
self.health = health
self.damage = damage
self.event_attack = Event() # fire when person attacks
self.event_hurt = Event() # fire when person takes damage
self.event_kill = Event() # fire when person kills someone
self.event_death = Event() # fire when person dies
さて、私はイベントがリスナー関数に特定のデータを送信するようにしたいと思います**kwargs
. 問題は、4 つのイベントすべてで と の両方を送信することattacker
ですvictim
。attacker
これにより、やや複雑になります。パラメータとして-methodに渡してから、 inの-methodのhurt()
イベントを再度発生させる必要があります。attacker
victim
hurt()
def attack(self, victim):
self.event_attack.fire(victim=victim, attacker=self)
victim.hurt(self, self.damage)
def hurt(self, attacker, damage):
self.health -= damage
self.event_hurt.fire(attacker=attacker, victim=self)
if self.health <= 0:
attacker.event_kill.fire(attacker=attacker, victim=self)
self.event_death.fire(attacker=attacker, victim=self)
イベントを発生させるためだけに、傷つけるためには必要ないので、 -methodattacker
のパラメーターとして与えるべきではないと思います。hurt()
また、event_kill
被害者のメソッド内で攻撃者のイベントを発生させることhurt()
は、カプセル化にほとんど反しません。
これらのイベントがカプセル化に従い、一般的により意味のあるものになるように、これらのイベントをどのように設計すればよいですか?