我今天对事件和代表们都很敏感,并且这样做,我一直在考虑体验酒吧的想法,那些来自游戏的进度条。但我对解决问题的更好方法有疑问 - 它可能就像糟糕的设计一样简单。我来提供一些细节。
我使用ExperienceBar类对我的想法进行了建模。
它包含属性:
和方法
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:我希望我尽可能清楚地说明这一点,但我可以尝试澄清是否有人遇到麻烦。我相信我的想法可能已经存在一些冗余,但请尽量不要偏离这个问题。我很清楚他们!谢谢:))答案 0 :(得分:5)
嗯......要我,事件就是良好的方式。
但是,如果我要设计应用程序,那么问题就是一个问题:除了调用UpdateBar的类之外,其他任何人都可以使用ExperienceBars的事件,当它到达EndValue 时。
如果您正在设计一个在很多地方使用的组件(这似乎是目标),我的答案似乎几乎肯定是是,因此我的回答是 使用活动 !
/维克多
答案 1 :(得分:2)
在我看来,没有最佳方法可以做到这一点。实现该类的方法有多种,取决于它将如何使用,更好或更差。
当您想要为需要了解对象状态的许多“客户”或“观察者”实现观察者模式时使用事件,并且需要在状态发生变化时收到警报。这适用于只有一个客户端的退化情况,但更改对象状态的方法的调用者不是需要知道更改的那个。
当调用者只需知道状态时使用返回值,该类没有其他观察者。这很简单,并且将类状态的知识范围限制为立即需要知道它的项目。
最后,不要过度设计这个。如果只需要通知调用者,请不要实现事件。如果在以后的某个日期需要“观察”该类,那么在那时实现事件。
答案 2 :(得分:2)
这一切都取决于组件的耦合和程序的流程。事件的缺点是会增加程序的复杂性,因为当任何代码可以订阅您的事件时,很难准确地跟踪执行流程。好处是它允许更灵活和可扩展的设计,因为任何代码都可以订阅您的活动。
所以这就是问题,如果Player
将负责处理与升级相关的所有事情,那么Player
和ExperienceBar
之间的紧密耦合就可以了。假设您想要公开一个AddIn框架,在这种情况下,您可能希望公开升级到外部插件,在这种情况下,事件更有意义。
就个人而言,我会让XP成为Player
的一部分,让Player
公开LevelUp
事件,但我不知道这对你来说是不是一个好主意以及您的框架/域建模,而无需查看现有代码。
答案 3 :(得分:1)
我会使用事件而不是返回值。为什么?有两个原因:
我会有一个与达到某个级别相关的事件,然后是那个可以做出相应响应的事件的“听众”。
答案 4 :(得分:0)
我认为让体验栏触发事件是不合理的 - 在这种情况下,返回值就没问题了。然后它可以调用Player的LevelUp函数,如果需要,它可以从Player类触发OnLevelUp事件。