知识卡片
谦卑对象模式在数据库网关、ORM与服务边界的应用
内容
[[谦卑对象模式展示器可测试与视图谦卑的分工]]的思路在数据库和服务边界同样适用。用例交互器与数据库之间的组件叫数据库网关——一个包含应用要在数据库上执行的增删改查操作的多态接口(比如UserGateway需要一个getLastNamesOfUsersWhoLoggedInAfter方法,接收日期参数返回姓氏列表)。因为SQL不该出现在用例层代码里,具体的数据访问功能要通过网关接口提供,实现类归数据库层负责,这些实现类正是谦卑对象——只用SQL或数据库提供的其他接口访问数据;反过来交互器不是谦卑对象(它封装的是特定应用场景的业务逻辑),但依然可测试,因为数据库网关能被替换成测试桩或测试替身类。ORM框架(如Hibernate)该归架构哪一层,取决于一个容易被忽视的事实:所谓”对象关系映射器”其实是个误称——对象内部数据对用户而言是私有不可见的,用户只能看到公有函数,所以从用户视角看对象是一组操作的集合而非数据结构体;数据结构体则是一组没有行为、纯公开数据的变量。所以ORM本质上是把关系型数据库里的数据加载进对应数据结构,更准确的叫法该是”数据映射器”,它在数据库和数据库网关接口之间构建的正是另一层谦卑对象边界,因此属于数据库层。同样的模式也出现在服务边界:应用要和外部服务交互时,会把数据装进简单数据结构、跨边界传给负责格式化并转发到外部服务的模块;反过来在输入端,服务监听器负责从服务接口接收数据、格式化成应用易用的形式。总结来看,系统架构的每一处边界都可能发现谦卑对象模式的踪影——跨边界通信天然需要简单数据结构,边界本身也天然地把系统切成难测试和易测试两部分,在这些边界处运用谦卑对象模式,能大幅提升整个系统的可测试性。
参考来源
- 位置:《架构整洁之道》第23章《展示器和谦卑对象》"数据库网关""数据映射器""服务监听器""本章小结"(源文件:_epub-src/text/part0014_split_008.html)
- 结论依据:原文定义数据库网关接口及其谦卑对象实现类、说明交互器虽非谦卑对象但因网关可替换而可测试,澄清ORM本质是"数据映射器"并归属数据库层,同时说明服务监听器同样应用谦卑对象模式,直接支撑本卡片结论。
- 原始内容:这些数据库网关本身是一个多态接口……交互器则不属于谦卑对象……不过,交互器尽管不属于谦卑对象,却是可测试的……ORM更应该被称为"数据映射器"……ORM其实就是在数据库和数据库网关接口之间构建了另一种谦卑对象的边界。