【发布时间】:2010-09-19 04:54:07
【问题描述】:
我负责项目中的关键应用。它执行与解析业务消息(传统标准)相关的工作,处理它们,然后将一些结果存储在数据库中(另一个应用程序会选择它)。经过一年多的工作(我还有其他应用程序需要照顾),该应用程序终于稳定了。我引入了严格的 TDD 政策,并且我有 20% 的单元测试覆盖率(感谢 Michael Feathers 的书!),其中大部分都在关键部分。我也有一些白盒健身测试(那里涵盖了整个业务场景)。我觉得我无法进一步重构这个应用程序,我可以放心地使用它。设计的太差了,我想重写。应用程序本身大约有 20k 具有挑战性的遗留 C/C++ 代码。还有其他依赖项,但我设法将它们中的大多数解耦。
我只有 Sun C++ 编译器、cppunitlite、STLPort 和 Boost。请不要建议其他技术(没有 XML、Java 等),因为这不是我的组织中的选项。 我想用现代 C++(也许玩元编程......),从头到尾的 TDD。
我需要解析大约 30 种类型的 msg。它们每个都由 3-10 行组成,其中大多数都非常相似。 这是万恶之源-> 大量代码重复。 每个 msgs 都有一个类描述它应该如何被解析。看一下主继承树:
MSG_A MSG_B
/ \ / \
MSG_A_NEW MSG_A_CNL MSG_B_NEW MSG_B_CNL
这两棵树都更深。 MSG_A_NEW 和 MSG_B_NEW 之间有非常小的差异。它应该由可以注入一些小的自定义的单个类来处理。
我最初的计划是拥有一个可以定制的通用 msg 类。一些实体(构建器...?)将查看味精并初始化能够解析味精的适当对象。另一个实体将能够发现它是哪一行,并且此信息将由构建器使用。我打算编写几个解析器,它们只负责解析一个特定的行。这将允许我在解析不同的 msgs 时重用它。
我很难以一种优雅且可扩展的方式解决几个挑战。 每种味精:
如果行有最小和最大数量 - 有一些必备的台词 - 有一些可选行 - 某些行必须在某些地方(即日期不能在 msg 类型之前),顺序很重要
我需要能够验证消息的格式。
我不确定我在这里解释的设计挑战是否足够好。我的设计经验非常有限。我已经修复了一段时间的错误,最后我将进行一些更改以进行一些有趣的编码:)
您对此有什么高层次的建议?您可以在此描述中识别哪些设计模式?主要的设计约束是可维护性和可扩展性,性能处于底层(无论如何我们还有其他瓶颈......)。
【问题讨论】:
标签: c++ design-patterns oop templates