我有一个类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
向侦听器函数发送某些数据。
问题是,我希望所有四个事件同时发送attacker
和victim
。
这使它变得有些复杂,我必须将attacker
作为hurt()
方法的参数,然后在victim
的hurt()
方法中再次引发attacker
事件:
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)
我认为我甚至不应该给attacker
作为hurt()
-方法的参数,因为伤害不需要它,只需要引发事件。
另外,在受害者的hurt()
方法中引发攻击者的event_kill
事件也很难反对封装。你知道吗
我应该如何设计这些事件,使它们遵循封装并通常更有意义?你知道吗
你根据一个非常具体的情况要求一个非常笼统的答案。我想给你一个更模糊的回答,但有点忘记了你目前的具体情况。所以这可能太笼统了,不能直接应用于你的情况。你知道吗
在Tubmud中,我们设计了一个事件系统,我们对它进行了多次重新设计,以满足我们的所有需求,但它仍然不能处理我们所能想到的所有事情。但你的例子是非常有名的,应该在那里找到一个恰当的表示。你知道吗
该系统基于一个全局事件服务器(singleton,GES),事件的所有侦听器都将注册到该服务器,所有事件分布都将由GES处理。不会直接调用其他对象。你知道吗
如果一个人对另一个人进行攻击,它只会告诉GES发送了一个攻击事件。然后,GES(基于事件发生的位置,但超出范围)将该事件发送给所有相关的攻击侦听器(守护天使、受害者、攻击者、武器……)。你知道吗
现在,受害者也会收到该事件(GES会呼叫),然后作为反应安排伤害事件(同样,只告诉GES该事件)。事件数据中是否会提到伤害的来源仅仅是一个设计决策(也许你不想给伤害的听众提供治疗咒语或类似的任何手段来找出谁是攻击者,无论出于何种原因)。在Tubmud,我们尽可能多地发送信息,这样做没有任何缺点。你知道吗
受害者现在会再次被GES呼叫,以接收它自己发送的伤害事件(因为可能其他一些听众会改变伤害中的某个东西,例如减少疼痛阻滞剂造成的伤害)。对它作出反应,实际上会降低它的健康。你知道吗
如果健康状况的下降导致死亡,那么它就会引发死亡事件,因为在我们的理解中,死亡是更容易发生的物理事件(我们让它先发生)。这同样是通过GES发送的事件,受害者再次收到。如果您决定在伤害事件中不提及攻击者,那么它也不会出现在死亡事件中。所以也许你现在会做出不同的决定;-)
最后,在我的理解中,杀人不是一个物理事件,而是对发生的事情的一种解释。如果一个攻击事件导致伤害并导致死亡,那么这就是杀戮。所以,严格地说,正确的检测方法应该是一种全视法官,它只注意到所有这些事件,并根据它们的结果决定发送一个杀戮事件。你知道吗
我不确定这些想法是否对你有帮助。我只是把这篇文章作为我们如何做到这一点的报告。你知道吗
关于你的问题:
如果您设计了一个物理世界的模拟,并且希望能够在一系列事件之后决定它们的含义,那么不要急于封装数据,试图将数据粘贴到它所属的位置。攻击者在hurt事件中可能看起来并不重要,因此您可能会试图忽略它,但是一旦结果完整地被解释,丢失的数据就很烦人了。毕竟,在现实生活中,警察可能也会发现丢失的数据(因此,事实上,在现实生活中,造成损害的信息通常存在于伤害中)。你知道吗
相关问题 更多 >
编程相关推荐