规则系统的设计模式?


12

作为一个快速有趣的项目,我尝试编写了单人纸牌游戏。但是在编写规则系统时,我感到很脏,因为我的代码感觉完全是非结构化且不可扩展的,主要是因为我的游戏逻辑是完整的意大利面条式代码。

我以前遇到过这个问题,在编写程序的这一部分时总是感到尴尬,所以我想知道,在定义游戏规则时是否有任何经过实践检验的最佳实践


1
最大化封装和最小化耦合
John McDonald

Answers:


2

我不认为有一个独特的解决方案,因为很多关注点都来自于特定的问题。

您可以使用“模型视图控制器”模式:这将您的问题转移(限制)到“如何在控制器上实现行为”,这是始终遵循规则的行为。

除非我们谈论的是非常简单的规则,否则您组织它们的方式会带来表达问题。您总是面临简单(结构化)和表达(编写有趣的规则)的冲突需求。

使用MVC可以简化您的工作,因为模型将状态(即在其中强制执行规则的上下文)形式化了。

话虽如此,您可能会发现使用策略模式和/或状态模式来实现Controller很有用,以便根据更简单的可切换行为组成复杂的行为。一个链方面的责任心模式可以帮助你表达规则,而国家机器应该小心使用,因为它的“状态”部分重叠“状态”的模型的含义。

在Controller中使用Command模式可能有助于减少Controller的可使用性(Command知道如何处理模型),并易于在Controller中添加撤消/重做功能。

无论如何,您应该尝试使用设计模式作为指导:它们对于避免重新发明轮子(尤其是方形轮子)很有用,但是并非每个问题的解决方案都由一堆(圆形)轮子组成。


2

我不确定是最好还是更好,但是我通常使用观察者模式。对我来说效果很好。


1
你能举个例子吗?
Gustavo Maciel '02

您可以为每个规则创建一个观察者,然后将它们附加到游戏状态。每次回合之后,游戏状态会呼叫所有观察者以检查是否应用了这些规则中的任何一个。
Ali1S232'2

0

除非您之前已经做过很多次,否则您总是会得到意粉代码。实际上,到目前为止,您才刚刚开始:您所拥有的只是初步规格的草稿。在此处查看其他一些建议,并进行认真的重写。然后再进行一些重写,然后...。就我个人而言,我永远不确定我是否将自己的代码变成了真正好的形状,或者只是厌倦了对其进行重写,但是我似乎最终还是正确地做到了。

从两端解决问题。尝试使整体设计有意义,挑选能够处理简单杂务的小零件并使它们正确无误。然后尝试从两端到中间。然后从中间向两端工作。然后从上向下,然后从下向上。然后重复整个过程。

本质上,您拥有的是类的集合。考虑一下A类。如果A类构建良好,则使用它的类会自动工作得更好,无论它们是好是坏。如果A类很好地使用了类,那么这些用过的类将做得更多,无论它们是好是坏。因此,请尽最大可能组织课程,然后确保每个课程都是最好的课程。

重要的是要使其尽可能正确。错误代码会困扰您直到您将其丢弃为止。使用软件,总能获得额外的抛光效果。(除非没有人最终使用该代码...。)

总结一下:查看其他答案中给出的实际建议,然后重新编写代码,直到获得所需的内容为止。


因此,您的答案基本上是“阅读其他答案并编写清晰的代码,否则您会后悔的” ...
kaoD 2012年

@kaoD:是的。而且:您的第一次编码尝试可能是垃圾。(如果不是,那么您就不会努力地努力。)将其整合在一起将需要大量的艰苦工作,同时还要进行一些研究和大量思考。编写涉及的程序时,这是正常的。从长远来看,以这种方式花费的所有精力将节省时间,精力和痛苦(如果该程序从长远来看仍然存在)。而且:如果您能把握机会,OOP可以帮助您节省大量时间。(最好的办法是我不用看代码即可。)
RalphChapin 2012年

4
您知道您实际上没有回答问题吗?
kaoD 2012年

实际上,无论Ralph的帖子在技术上是否是答案,我都认为Ralph的回复表明了OP最初提出问题的动机。我相信对于没有意识到您很少会在第一次尝试中就最好地设计代码的程序员来说,它具有很大的价值。另外,他提供了一种处理方法,该方法似乎源于拉尔夫(Ralph)的经验。
史蒂夫H

@SteveH我认为他的回答几乎适用于所有软件工程过程。您可以将其复制并粘贴到任何适合的位置。
kaoD 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.