2016-06-01 54 views
1

我的班级有3个州。在每一种状态下,它都会做一些工作,并进入其他状态,或者保持在相同的状态(95%或更多的情况下,它将保持在相同的状态)。我可以实现状态模式(我假设你知道它)。我很喜欢的另一种方法是:“状态模式”vs“每个状态的一个成员函数”?

我有一个每个状态的成员函数,还有一个指向成员函数的指针,它指向当前状态函数。当我想进入另一个状态时,我只是将该函数指针指向另一个状态函数。 (也许这不完全等同于状态模式,但在我的情况下它工作正常)。

我想这两种方式几乎是一样的。

所以,我的问题是:

  1. 哪种方案更好(取决于什么)?
  2. 是否值得为每个状态声明一个类(它只有一个函数)?我认为这是人为的。
  3. 性能怎么样?没有创造新的国家阶级对象(在国家模式的情况下)带来轻微的开销? (当然状态类不应该有会员,但无论如何,它应该花费的东西)
+0

如果您的代码工作那么代码审查可能是因为它在正确的地方。 –

+0

我的问题是一般,不与我的代码连接。 – user1289

+0

考虑浏览/张贴程序员板然后 –

回答

1

你真的不提下,你的程序将运行的约束,所以专门很难评价关于一个实现比其他的开销,所以我就做出有关代码的可维护性评论。

我个人认为,除非你的状态机非常简单并且保持简单,那么为每个状态声明一个类是可维护的,可扩展的&可读。一个好的经验法则可能是,如果你不能看你班上的代码,并把整个图片放在脑海中,那么你的班级可能会做太多。在为每个状态声明一个类时,您付出的小额开销可能非常值得您从编写模块化代码(或任何最终维护它的人)获得的生产力提高。我遇到了太多'超级'类,它们本质上是一个大型(非常难以维护)的状态机,可能是作为一个简单的状态机开始的,否则就会推荐。

的“S”和“O”的SOLID缩写的部分(https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)总是好东西要牢记。

+0

这就是我想的,为了保持简单我会有一些开销像国家班级将参考主要班级,必须是它的朋友访问私人成员等......),但可能它更有意义。谢谢。 – user1289

0
  1. 这取决于如果你需要访问对象或没有的私有成员。如果不是这样,那么类外实现会将您的代码打碎成更小的碎片,因此可能更可取(但这不是客观的:这两种解决方案有利有弊)。

  2. 这不是必需的,但增加了一层抽象并放松耦合。使用接口,您可以更改每个实现而不影响其他实现(例如,添加类字段...)

  3. 无关紧要,分配新的空类或调用函数的开销相同。

+1

通常是有帮助的,空的类包含malloc调用?我想是的,因为它应该有一个地址(它的大小是1而不是0)。所以如果它调用malloc,它应该会影响性能。 – user1289

+0

它可能会。那么,我在这里有点挑衅,我从C世界走了一段路,发现C程序员太担心他们的代码在他们不应该执行的地方执行。 1.你说切换状态不是很频繁,2.你仍然可以使用像mobdnilo这样的静态实例指出,所以不要将你的代码设计决策放在性能问题上。 –

+0

是的,在我的情况下,它并没有太大的影响,是的molbdnilo的解决方案很好,但总的来说,我们应该总是考虑性能:) – user1289