App Architecture 读书笔记
第二章 Overview of Application Design Patterns
第一篇:App Architecture 笔记 - 1 Introduction
第二篇:App Architecture 笔记 - 2 Overview, MVC/MVVM-C
Model-View-Controller
Overview
- 少数的 controller 对象负责处理所有 model 层与 view 层之外的任务,包括:
- 收集所有 view actions
- 处理所有交互逻辑
- 分发 model actions
- 收集所有 model notifications
- 准备所有用于展示的数据
- 将变更应用到视图
- 依赖:
- view / model 不在代码中直接引用 controller
- controller 实例知道 view / model 的接口以及连接对象
5 Tasks
- Construction:
- 构建顶层 view controllers -> 加载与配置 view,及要展示的 model 数据
- controllers 创建并持有模型层,或使用懒加载的单例访问模型
- 与视图有关的模型对象缓存在控制器中
- Updating the Model:
- MVC 中 controller 通常使用 target/action、delegate 等方式来接收 view events
- 当 view events 到来时,控制器改变期内部的状态、更改模型或直接改变视图层级结构
- Chaning the View:
- 控制器订阅 model notifications,当 model notifications 到达时,controller 去改变视图层级结构,以使数据能够单向流动
- View State:
- View State 按需被存在 view 或 controller 中
- 影响 view 或 contrller 状态的 view action 不要求通过 model 传递
- Testing:
- MVC 中,由于 controllers 与其他组件间需紧密结合,缺乏边界,导致很难编写单元/接口测试
- 集成测试可行。在测试中构建 view/model/controller 间的连接部分,测试逻辑与组件间的连接
Importance of Model-View-Controller
- 系统中默认的设计模式
- MVC 的相对自由是的多种变体模式都能被整合进其中
- 历史:
- MVC 首次被用在 1979 年,Smalltalk-76 中。
- 原始公式中,视图直接被附给 model 对象,控制器仅用于捕获事件与转发给对象
- 原始 Smalltalk 对 MVC 实现中,持续下来的理念是 view 层与 model 层应当分离
Model-View-ViewModel+Coordinator
Overview
- 与 MVC 相同,都围绕一个 scene(视图层级结构中的一个子视图场景)来构建
- 每个 scene 使用一个 view-model 来描述场景中展示与交互的逻辑用于描述 view 上要展示值的属性,这些值从底层模型中经过一系列转化得来,可被直接用于视图
- 通过绑定确保发生变化后视图可及时展示
- 响应式是用于表达这种类型与转换的工具,天然适合 MVVM
- 对 view 层级没有直接引用使得 view-model能脱离框架方便测试
- MVVM-C 中,使用 coordinator 协调器来负责场景间转换的逻辑。coordinator 持有对模型层的引用,并了解视图控制器树,因此它可为每个场景提供其所需要的 model 对象与 view-model
- 与 MVC 不同,MVVM-C 中试图控制器间不直接引用其他控制器,而是通知 coordinator 有关的 view actions,让 coordinator 来展示新 VC 与设置模型数据,相当于用 coordinator 来管理 tree
- View Controller 不再有内部的 view state,而将其移动到 view-model 中,使得 VC 原始的双重身份(A,作为视图层级结构的一部分 / B,调解 view 与 model 间交互)减少到单层(单纯作为视图层级结构一部分),同时,coordinator 负责了 VC 的另一个工作,展示出其他 VC
5 Tasks
- Construction:
- 单独的模型对象,交由 view-model 持有而不再是 view controllers
- 与 MVC 不同,VC 不再直接获取或准备数据,而是在构建时创建 view-model,并将 view 绑定到 view-model 暴露出的相关属性上
- Updating the Model:
- 与 MVC 不同,当 view event 到达后,VC 不改变其内部状态,而是调用 view-model 上的方法,由 view-model 改变其内部状态或模型
- Chaning the View:
- 与 MVC 不同为,VC 不观察模型,view-model 观察模型,并将 model notifications 进行转化
- VC 观察 view-model(通常通过响应式),当 view-model 事件到来,VC 改变其视图层级结构
- View State:
- 视图状态在 view 中或 view-model 中
- 与 MVC 不同,VC 中不含任何 view state,controller 观察 view-model 的 view state 变化
- Testing:
- 由于 view-model 与 view 层和 controller 层解耦,view-model 可进行接口测试而不是 MVC 中的集成测试
- 为使接口测试尽可能多的覆盖,VC 需要尽量保持简洁
Importance of Model-View-Controller
- MVVM 与 MVC 最大区别在于使用响应式将 view-model 中的状态表达成一系列转换和依赖关系,清晰地描述出模型与要展示值之间的关系,可以让人更好的理解 app 中的依赖关系
- 使用 coordinator 来管理 VC 层级的概念非常重要。coordinator 不与 MVVM 直接绑定,因此也可以用在 MVC 等其他模式中
- 历史:
- MVVM 由 Ken Cooper 和 Ted Peters 指定(他们在微软参与开发 WPF)
- WPF 中使用一种叫做 XAML 的基于 XML 的声明式语言来描述视图绑定到 view-model 上的属性
- Cocoa 中没有 XAML,所以需要使用如 RxSwift 之类的框架来执行 view-model 与 view 间的绑定
- iOS 中的 coordinator 概念由 Soroush Khanlou 2015 年在其网站上提出