知识卡片
领域逻辑边界判断法:新增一层看是否重复实现
内容
判断一段逻辑到底算不算”领域逻辑”、有没有被错放进表现层,最实用的检验方法不是抠概念定义,而是做一个思想实验:假想给系统新增一个完全不同的表现层(比如给已有的Web应用新增命令行界面),或者假想把后台数据库换成XML文件——如果做这件事时发现某些功能必须在新层里重新实现一遍,这就说明原本这段逻辑本该放在领域层,却被错误地塞进了表现层或数据源层。书中给了一个具体案例:某系统”当月销量比上月涨10%的产品要在列表里标红”,如果这个”是否上涨超过10%“的比较逻辑直接写在表现层里决定颜色,那么一旦新增命令行界面就得把比较逻辑重新实现一遍;正确做法是在领域层定义一个返回布尔值的方法(是否显著上涨),表现层只需拿到这个布尔值后决定用什么样式展示——把”要不要标红”拆成”该不该标红”(领域层判断)和”标红长什么样”(表现层展示)两个独立问题。这个方法把”职责该放哪一层”这种容易陷入教条争论的抽象问题,转化成了”新增一层后会不会出现复制粘贴”这种可操作的检验。
参考来源
- 位置:《企业应用架构模式》第一部分"表述"之"第1章 分层"之"1.2 三个基本层次"(源文件:_epub-src/OEBPS/Text/000013.html)
- 结论依据:原文提出"一种不太正规的测试办法就是:假想向系统中增加一个完全不同的新层,例如为Web应用增加一个命令行界面层。如果在这个过程中,发现需要重复实现某些功能,则说明可能有一些本应该在领域层实现的逻辑,现在在表现层实现了",并用"当月销售量比上月销售量大10%的产品需要用红色显示"的具体案例演示如何拆分,直接支撑本卡结论。
- 原始内容:为实现这个功能,开发者在表现层逻辑中比较当月和上月的销售量,然后将差别大于10%的产品显示为红色。这样做的麻烦就是将领域逻辑放到了表现层中。为了进行适当的分离,需要在领域层中定义一个方法,用来指示该产品的销售量是否较上月有较大提高。