知识卡片

谦卑对象模式:展示器可测试,与视图谦卑的分工

普通读书笔记卡

内容

谦卑对象模式最初是为了帮单元测试作者区分”容易测试的行为”和”难以测试的行为”、并把两者拆开:一组模块叫”谦卑组”,装那些已经被简化到不能再简化的难测试行为;另一组模块装其余所有行为。GUI是这个模式最典型的应用场景——让计算机自动检视屏幕内容、检查指定元素是否出现,本身就很难测试,但GUI里的大部分逻辑其实完全可测。谦卑对象模式把GUI拆成展示器和视图两部分:视图是难以测试的谦卑对象,代码应该越简单越好,只负责把数据填充到GUI上,不该对数据做任何处理;展示器是可测试的对象,负责从应用程序接收原始数据并按视图需要的形式格式化——比如应用传来一个Date对象,展示器把它格式化成需要的字符串填进视图模型;传来一个Currency对象,展示器按小数位数格式化并加上货币符号,如果金额为负还要在视图模型里设一个恰当的布尔值来标记要显示成红色;每个按钮的名称、是否变灰的开关变量、每个菜单项的显示文本、单选多选框的名字和文本框内容,甚至一张数值表要展示的内容,都由展示器格式化成字符串/布尔值/枚举值填进视图模型——总之应用能控制的、要在屏幕上显示的一切东西,都该以这些简单类型的形式存在于视图模型里,视图除了把视图模型的值加载上去,不该再做任何其他事。可测试性是架构设计优劣的一个显著标准,而谦卑对象模式正是这方面的典型范例:把系统行为切成可测试和不可测试两部分的过程,往往同时定义了系统的一条架构边界——展示器与视图之间的边界只是这类边界的一种,还有很多别的边界同样适用这个模式。

参考来源

- 位置:《架构整洁之道》第23章《展示器和谦卑对象》"谦卑对象模式""展示器与视图""测试与架构"(源文件:_epub-src/text/part0014_split_008.html) - 结论依据:原文说明谦卑对象模式把难测试行为与可测试行为拆开、以GUI为例定义展示器(负责格式化数据成简单类型放入视图模型)与视图(只负责加载,不做处理)的分工,并指出这类切分往往定义了系统架构边界,直接支撑本卡片结论。 - 原始内容:视图部分属于难以测试的谦卑对象……展示器则是可测试的对象。展示器的工作是负责从应用程序中接收数据,然后按视图的需要将这些数据格式化……视图部分除了加载视图模型所需要的值,不应该再做任何其他事情。