我正在努力自学编程。我开始的方式与我相信大多数人的开始方式相同;制作小而凌乱的应用程序和游戏,以不那么简单的方式做简单的事情。最近,我一直试图通过编写一个使用OOP设计的更复杂的游戏来编写更好,更模块化的代码来进行下一步!
我遇到的主要问题是我的主要StateManager(FSM)类的设计(在介绍/菜单/游戏/等屏幕状态之间切换)。我看起来又高又低,我真的只看到了两种设计方法:
使用switch / case语句+枚举来切换状态..
创建一个单独的FSM类,用于处理向/从向量推送/弹出状态..
现在,我的问题是,switch case语句是非常重复和笨重的,这有点违背了我使用这个项目自学OOP的目标。
我的第二个问题是“单身”建议。
正如我之前所说,我正在努力自学,在编程时我还有很多需要学习的东西,特别是在OOP和设计模式以及所有这些方面。我遇到了一个问题,对于每个单身'单身人士都是邪恶'的线索和我发现的讨论,我发现同样多的教程和参考,人们在他们的代码中使用单例来制作'引擎'类和FSM 。这是一个非常一致的混合信息。
我想我只是不明白为什么......即使你只想要/打算拥有一个类的单个对象,为什么使构造函数私有并创建一个单例是必要/有益的?我已经阅读了很多关于单身人士是如何坏,他们如何基本上是全球性的,他们如何妨碍多线程,以及有多少程序员认为他们过度使用或只是简单的糟糕设计......但我看到例子后面的例子人们使用它们,很少有反例显示替代方法。
不能只用常规课做同样的事情吗?明确限制实例创建的目的是什么?我只听到过关于单身人士的负面消息,但人们似乎经常使用它们......我完全错过了关于单身人士和OOP的事情吗?
单身人士的使用只是一种趋势,还是只是人们称单身人士为“邪恶”的趋势?我该怎么解决这个问题? 开关/外壳FSM和单例FSM之间没有什么东西?有没有人能够以完全相同的方式设计他们的程序的状态系统,而不需要他们的任何课程单身人士?这会改变什么吗? [ confused ]
答案 0 :(得分:6)
与普通班级无法完成相同类型的事情吗?明确限制实例创建的目的是什么?我只听过关于单身人士的负面消息,但人们似乎经常使用它们......我是否完全错过了关于单身人士和OOP的事情?
不,我相信你已走上正轨:绝对没有理由阻止创建两个实例。因此,宇宙不会崩溃。
这是一个完全不必要的限制。由于您必须手动编写该限制,因此根本不需要它(如果您必须编写代码来提升它,那将是另一回事。)
我想可能会出现奇怪和罕见的情况,如果创建了第二个实例,Universe会崩溃,但这听起来很牵强。无论如何,它并不能证明整个互联网上单身人士的普遍存在。
我无法解释为什么人们经常使用它们而不会侮辱这些人的推理能力,所以我不会这样做。
如果某人没有为他们的任何单身单身人士设计他们的程序的状态系统,那么他们是否完全相同?这会改变什么吗?
它唯一改变的是,通过使它成为单身,你可以防止自己为单元测试创建一次性实例。其他一切都是一样的。
答案 1 :(得分:2)
通常情况下,没有一个简单的答案。在C ++中, 单例模式还管理初始化问题的顺序 如果要在静态对象的构造函数中使用它很重要。 并且存在某些类型的对象,其中只有多个实例 是一个编程错误;如果你可以阻止它们,为什么不呢。
另一方面,想象一个案例我有很多困难
其中StateManager
类应该是单身。绝不是
管理一些独特的资源,或一些元功能(例如
记录)其本质上必须是唯一的。我无法想象
它也用在静态对象的构造函数中。
诸如“单身人士不好”之类的陈述非常具有误导性;对于一些 事情,他们是最合适的解决方案。但仅仅因为他们 绝对不坏并不意味着它们是合适的 到处。他们解决了一个非常有限的问题。当你 需要解决这个问题,不使用单例是不好的。但是(原样 对于几乎所有事情都是如此),在不合适时使用它 坏。
答案 2 :(得分:1)
我不明白为什么FSM类应该是单例。有很多现实世界的FSM系统没有单例,哎呀,有些地方是在SM遍历状态时创建和销毁状态实例,而where状态机本身就是一个启用状态分层状态机的易组合性。
在复杂的应用程序中,您将拥有多个状态机,其中一些状态机突然出现。处理(例如,客户端 - 服务器交互)的那些必须具有与客户端一起来去的多个实例。其他一些人可能会从组成多个分层状态机中受益,其中一些可能在许多地方重复使用。因此,您将状态机作为单例类的想法对我来说是愚蠢的。例如,您可能在单个应用程序类中包含特定状态机的实例,它封装了您的应用程序,但这远不是单例类状态机。
为了更好地了解各种状态机实现技术,包括平坦FSM和分层状态机(HSM)之间的对比,您需要查看Miro Samek的PSICC2书。他有很多可免费下载的articles,其中解释了常用的技术。
state machine framework in Qt中提供了可用于UI的分层状态机的合理C ++实现。