知识卡片
表模块没有标识符,必须传入键值访问单行数据
内容
表模块处理某个数据库表或视图中所有行的业务逻辑,用一个类对应数据库中的一个表,只用单一的类实例包含对这些数据的各种操作程序——如果有一万个订单,领域模型会为每个订单各建一个对象,表模块却只用一个对象来处理全部订单。表模块表面上看起来像常规对象,但关键区别在于它本身没有标识符来标出它代表的是哪一个具体实体:要查某个雇员的地址,不能像领域模型那样直接对一个”雇员对象”调用方法,而必须写成类似anEmployeeModule.getAddress(long employeeID)这样的形式——每次要针对某个具体记录操作,都得显式传入一个标识符(通常就是数据库主键值)作为参数。表模块通常和面向表的记录集数据结构配合使用:SQL调用的结果被放进一个记录集来模拟数据库表,表模块在此之上提供一套明确的、基于方法的接口来操作这份数据,把行为和它操控的数据封装在一起。一个实际任务往往要动用多个表模块的行为,因此经常能看到多个表模块共同操作同一个记录集的场景——比如某张”合同”记录集,既可能被”合同表模块”操作,也可能被跟合同相关的另一张”收入确认表模块”操作。可迁移启发:表模块看似是”面向对象”的设计,但它刻意舍弃了对象标识这一核心OO特征、换取和关系数据结构的顺畅衔接——评估某个设计是否”够面向对象”时,值得先问清楚它到底保留了对象范式的哪些特征、又主动放弃了哪些,而不是简单地按”是不是类”来判断。
参考来源
- 位置:《企业应用架构模式》第二部分"模式"之"第9章 领域逻辑模式"之"9.3 表模块"(源文件:_epub-src/OEBPS/Text/000068.html)
- 结论依据:原文说明"表面上看起来表模块与常规的对象很相似,但关键区别在于它本身没有标识符来标出它所代表的实体对象。因此,如果想查询某一雇员的地址,需要使用类似anEmployeeModule.getAddress(long employeeID)这样的方法。每当要对某一特定雇员对象进行操作时,都需要传入一个某种类型的标识符",直接支撑本卡结论。
- 原始内容:它与领域逻辑的主要区别在于,如果你有许多订单,领域模型对每一个订单都有一个对象,而表模块则只用一个对象来处理所有订单。