我应该使用事件通知课程还是只使用返回?

时间:2009-09-21 20:56:12

标签: c# events event-handling

我今天对事件和代表们都很敏感,并且这样做,我一直在考虑体验酒吧的想法,那些来自游戏的进度条。但我对解决问题的更好方法有疑问 - 它可能就像糟糕的设计一样简单。我来提供一些细节。

我使用ExperienceBar类对我的想法进行了建模。

它包含属性:

  • int StartValue
  • int CurrentValue
  • int EndValue

和方法

  • void UpdateBar(int)

UpdateBar将参数添加到CurrentValue,然后测试它是否已达到EndValue。如果超过金额,则EndValue会增加,金额会继续。请注意,最初在我的想法中,它并不关心达到可能的最大量的效果,只是结束值增加并且StartValue被重置为零。

另一个名为Player的类具有类ExperienceBar的属性。

在我的小演示中,当Player.ExperienceBar.UpdateBar(int)到达EndValue时,它会触发一个由Player类处理的事件。它将Player.Level属性更新为一个。

我刚刚意识到只需将UpdateBar(int)更改为返回类型“true”即可实现相同的功能。此方法可以由Player类测试,当为true时,Player.Level增加1。

所以我的问题 - 这是处理这种特殊环境的最佳实践方法吗?作为这种情况的一般经验法则,处理事件是否更好,或者只是通过测试return语句来保持简单?

PS:我希望我尽可能清楚地说明这一点,但我可以尝试澄清是否有人遇到麻烦。我相信我的想法可能已经存在一些冗余,但请尽量不要偏离这个问题。我很清楚他们!谢谢:))

5 个答案:

答案 0 :(得分:5)

嗯......要,事件就是良好的方式。

但是,如果我要设计应用程序,那么问题就是一个问题:除了调用UpdateBar的类之外,其他任何人都可以使用ExperienceBars的事件,当它到达EndValue

如果您正在设计一个在很多地方使用的组件(这似乎是目标),我的答案似乎几乎肯定是,因此我的回答是 使用活动

/维克多

答案 1 :(得分:2)

在我看来,没有最佳方法可以做到这一点。实现该类的方法有多种,取决于它将如何使用,更好或更差。

当您想要为需要了解对象状态的许多“客户”或“观察者”实现观察者模式时使用事件,并且需要在状态发生变化时收到警报。这适用于只有一个客户端的退化情况,但更改对象状态的方法的调用者不是需要知道更改的那个。

当调用者只需知道状态时使用返回值,该类没有其他观察者。这很简单,并且将类状态的知识范围限制为立即需要知道它的项目。

最后,不要过度设计这个。如果只需要通知调用者,请不要实现事件。如果在以后的某个日期需要“观察”该类,那么在那时实现事件。

答案 2 :(得分:2)

这一切都取决于组件的耦合和程序的流程。事件的缺点是会增加程序的复杂性,因为当任何代码可以订阅您的事件时,很难准确地跟踪执行流程。好处是它允许更灵活和可扩展的设计,因为任何代码都可以订阅您的活动。

所以这就是问题,如果Player将负责处理与升级相关的所有事情,那么PlayerExperienceBar之间的紧密耦合就可以了。假设您想要公开一个AddIn框架,在这种情况下,您可能希望公开升级到外部插件,在这种情况下,事件更有意义。

就个人而言,我会让XP成为Player的一部分,让Player公开LevelUp事件,但我不知道这对你来说是不是一个好主意以及您的框架/域建模,而无需查看现有代码。

答案 3 :(得分:1)

我会使用事件而不是返回值。为什么?有两个原因:

  1. 从UpdateBar返回时返回true是什么意思?它已更新? xyz发生了什么?其他人看这个(或者你,两个月后)也会好奇。
  2. 如果达到限制时会发生多件事怎么办?然后,您必须将与这些事项相关的所有代码(调平,获取新项目,等等)绑定到您用于更新条形图的方法中。
  3. 我会有一个与达到某个级别相关的事件,然后是那个可以做出相应响应的事件的“听众”。

答案 4 :(得分:0)

我认为让体验栏触发事件是不合理的 - 在这种情况下,返回值就没问题了。然后它可以调用Player的LevelUp函数,如果需要,它可以从Player类触发OnLevelUp事件。