由于EISaaS的核心功能就是生成各种数据分析报表,因此,报表引擎模块就是整个平台的核心。它一共包含三个子模块,分别是service,runtime,exporter,子模块之间的关系如下图所示:
报表引擎模块的命名空间为:xxx.eisaas.framework.engine.report,项目名称为eisaas-framework-engine-report。如前文所述,该模块依赖于eisaas.framework.engine.entity与eisaas.infrastructure.xml包。
报表引擎模块的设计并无出彩之处,遵循了与其他模块相同的设计思路,即内部由各个子模块的对象相互协作,对外提供统一的门面类封装不必暴露的细节,提升API的易用性。
看起来,这样的设计稍显平庸,但窃以为却是明智的决策,因为它遵循了架构的“一致”原则。Brooks就认为:“好的架构应该是直接的,人们掌握了部分系统后就可以推测出其他部分。「Brooks《设计原本》,转引自Blaauw《Hardware requirements for the Fourth Generation》」”这一说法也就是古人常说的“窥一斑而知全豹”,设计的雷同可以有效降低人们的学习成本,也是降低复杂度的有效原则。
说完一致性原则,再来说说隐喻(metaphor)。隐喻是文学中的修辞手法,而我最初知道在软件设计领域用到隐喻,则来自Kent Beck的XP实践,如下图所示:
有感于隐喻对软件设计乃至软件工程的重要意义,我还曾写过一篇论文《软件隐喻的本质与模式》,发表在某高校的学报上。
Kent Beck在《实现模式》一书中阐述了类库中容器融合的不同隐喻,理解这些不同隐喻,对于了解容器的本质并明确该如何正确使用容器是有裨益的。EISaaS的设计也用到了一个重要隐喻——引擎,包括数据引擎、实体引擎、报表引擎和功能引擎,它们共同构成了整个产品的核心,正如引擎构成了汽车的核心一般。