上一章节中,引入了展示器
的概念(presenter)
。它实际上是采用谦卑对象(humble object)模式
的一种形式,这种设计模式可以帮助试别和保护系统架构的边界。上一章节中,介绍的整洁架构就充满了大量的谦卑对象的实现体。
谦卑对象模式
最初的设计目的,是为了帮助单元测试的编写者,区分容易测试
的行为和难以测试
的行为,并将其隔离。其设计思路,就是将这两类行为拆分为两组模块或类。
其中难以测试的行为分组,就叫谦卑组
。
例如GUI
通常很难写单元测试,因为很难让计算机自行检查屏幕内容。但是GUI
中的行为
是容易测试的。这个时候我们就可以使用谦卑对象模式
,将GUI
的这两种行为拆分为展示器
,和视图
两个部分。
视图部分属于难以测试的谦卑对象,这种对象的代码通常越简单越好,它只负责将数据填充到GUI
上,而不进行任何处理数据的行为。
展示器是可测试的对象,它的工作是从应用程序中接收数据,然后按视图的需要,将数据格式化,以便展示在屏幕上。比如接收的数据是个对象,或者时间戳,那么它的工作就是将其展示为格式化的字符串。比如某一些字段需要标红,那么展示器就要负责给出一个开关布尔值。
也就是说视图只负责展示,一切逻辑应当在展示器中完成。所以我们将视图部分叫做是谦卑的,因为它只接收并展示。
强大的可测试性,是一个架构设计是否优秀的显著衡量标准之一。
谦卑对象模式就是这方面的一个非常好的例子。将系统切分为可测试和不可测试部分的过程中,往往也就定义了系统的架构边界。
展示器与视图之间的边界,只是多种架构边界的一种。
用例交互器,与数据库中间的组件,我们称为数据库网关。上一章节中,UseCaseInteractor
就是用例交互器
,DataAccessInterface
就是数据库网关
,这个网关是一个多态接口。包含了应用程序中所有对数据库的增删改查操作。
之前我们说过,SQL
不应该出现在用例层的代码中。所以用例层只提供接口,实现则由数据库层来提供。提供的这些实现,也应当做谦卑对象
,因为它们只利用SQL
或其它数据库提供的接口来访问数据。
但是用例交互器
,则不属于谦卑对象
,因为它们封装的是系统的业务逻辑
。
ORM
应当属于数据库层。因为它只是一个简单的数据结构,不包含行为信息。它们只是将数据从关系型数据库加载到了对应的数据结构中。ORM
实际上,就是在数据库和数据网关接口之间,构建的一种谦卑对象
的边界。
如果我们的程序需要和其他服务进行交互,或者该应用本身自己对外提供服务,我们也能够在相关服务边界处,看到谦卑对象
。
我们的程序会将收到的数据,加载到简单的数据结构中,并将数据跨越边界,传递给能够将其格式化的其他外部服务。即,纯监听器就是谦卑对象
,只负责接收和和转发。
在每个系统架构的边界处,都可能发现谦卑对象
的存在。因为跨边界的通信,肯定需要用到某种简单的数据结构,而边界会自然而然的将系统分割成难以测试的部分,和容易测试的部分,所以通过在系统边界运用谦卑对象
模式,可以大幅的提高系统的可测试性。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。