【发布时间】:2018-03-17 03:26:35
【问题描述】:
我即将实现一个文档生成器。我坚持遵循开闭原则,这给我带来了一些麻烦。要求如下:
- 会有多种文件类型(即协议、授权书)
- 会有多种文档格式(即 XML、JSON、HTML、PDF)
- 每种文档类型都需要在文档中显示一组不同的数据(即客户详细信息、全能详细信息)
由于我选择遵循开闭原则,我强烈希望避免使用 switch 语句。这意味着我需要为特定类型的文档和格式类型引入一些抽象和实现。
是否需要提供 m x n 类实现,其中 m 是文档类型的数量,n 是文档格式的数量?我觉得这是错误的做法。能否请您给我一些提示如何正确设计这样的文档生成器?
【问题讨论】:
-
我从来没有想过要始终尊重某个原则。您不应该如此专注于 O/C 或任何其他指南,您应该专注于理解领域并在此基础上进行设计。值对象和适当的聚合是这里的关键。
-
你所说的“适当的聚合”是什么意思?请你举个例子好吗?
-
正确的聚合意味着您需要正确识别域所见的每个文档模型。基本上,您需要了解每个文档的每个细节及其自身的约束和规则。它与代码、OOP、SOLID 等无关。您需要了解领域如何思考和处理事物,即您需要成为领域专家,至少在这个特定主题上。像领域一样思考,使用领域自己的语言。看不到类、函数等。
-
你考虑过非循环访问者模式吗? stackoverflow.com/a/11437892/1168342
-
m x n 个模块来自 OCP。就像@MikeSW 所说,获得正确的域更好。我会让它正常工作,然后考虑在出现新格式或文档类型时重构为不那么脆弱的东西。
标签: oop design-patterns solid-principles open-closed-principle