【发布时间】:2011-11-15 15:44:30
【问题描述】:
我目前正在进行的项目有很多问题。该项目已有 10 多年的历史,它基于 90 年代非常流行的商业 C++ 框架之一。问题在于状态图。该框架提供了相当常见的状态模式实现。每个状态都是一个单独的类,有进入动作、状态动作等。有一个开关可以根据接收到的事件设置当前状态。
魔鬼隐藏在细节中。那个项目是巨大的。大约2000 KLOC。肯定有太多的状态图(我见过使用状态图实现的“for”循环)。更重要的是......框架允许将状态图嵌入到另一个状态图中,因此有许多状态图具有七个甚至更多级别的嵌套。因为状态图在不同的线程中运行,并且可以在状态图之间发送事件,所以我们有很多同步问题(以及接口中的大混乱)。
我必须承认这个问题的规模是巨大的,我不知道如何去解决它。我的第一个想法是尽可能多地从状态图中删除代码并将其放入单独的类中。然后从状态图中委派这些类来完成工作。但结果我们将有许多单独的函数,它们在逻辑上没有任何特定的功能,并且状态图架构的任何更改也需要更改这些类和函数。
所以我寻求帮助: 你知道任何可以帮助我解决这个问题的书籍/文章/魔法文物吗?我想至少在不引入任何隐藏依赖项的情况下,尽可能多地从状态图中分离代码,并保持分离的代码可维护、可测试和可重用。
如果您对如何处理此问题有任何建议,请告诉我。
【问题讨论】:
-
这个系统不是偶然发生的。有人以一种你不理解的对他们有用的方式构建它;你最好弄清楚这一点。那么这个系统是使用状态图编辑器/代码生成器构建的吗?如果你丢失了它,你就丢失了实际的源代码;您正在处理的是生成器编译的“目标代码”。还是所有这些状态图都是手工生成的?你怎么知道? (确实注定:)
-
...考虑到这一点,我想知道问题是否真的是状态图它们只是一种组织控制的方式,很像 if 语句和 while 循环,具有允许并行性的额外优势子图表。这应该有助于了解代码的工作原理;你可以只用“低级 C++”结构来编码这些东西,这有点像只使用 goto 来编码结构化控制流。除非最初的编码员完全是傻瓜,否则他们可能会像理解结构化控制流一样理解这个流程。
-
ira baxter:有一个用于状态图设计的图形工具,状态图存储在某种伪代码中。第一件事是不可能将这些文件作为文本文件保存在 svn 中,因为合并对它们不起作用。第二个:不幸的是,这个工具被错误地使用了。开发人员和架构师在架构设计和应用程序框架实现的第一个也是最重要的阶段学习这个工具。现在我们有了基于框架相关事件的接口,而且代码根本不可移植。
-
对于 2 MSLOC 的代码?对于没有学会如何使用他们的工具的人来说,这是一大块东西。一般来说,面对一个大系统时,你应该对最初的设计师仁慈。他们可能很聪明,并且可能对他们的意图有所了解,甚至在某种程度上实现了它。你是这里缺乏理解的人,或者至少这是你应该下的赌注,除非你真的,真的知道你在做什么。可能他们都搞砸了。但是,如果它们是有组织的,而您却不知道是如何组织的,那么您就是受到伤害的人。
-
您关于“无法在 svn 中存储为文本文件”的评论...那又如何?您仍然可以存储它们。如果它们不是文本也没关系;重要的是它们代表了您的一些代码结构,在您确定可以丢弃它们之前,您不应该这样做。 (你这样想的事实表明你不是真的,真的确定你在做什么)。 YMMV。
标签: c++ design-patterns architecture refactoring state-pattern