将要讨论到的架构
- Standard Cocoa Model-View-Controller (MVC) Apple 官方提及到的架构模式
- Model-View-ViewModel+Coordinator (MVVM-C) 是 MVC 的一种变种,分离出 view-model 和 coordinator 去管理 viewController 的层级,MVVM 使用 data binding 去建立 view-model 到 view layer 之间的关系
- Model-View-Controller+ViewState (MVC+VS) 将 view state 集中在单独的位置
- ModelAdapter-ViewBinder(MAVB) MAVB 主要关注的是声明 view 的构造,然后使用 bind, 而不是使用 controllers 去建立 model 和 view 的通信
- The Elm Architecture (TEA) 它使用虚拟 view 来构造 view layer 和使用 reducers 来和 model 和 views 交互
Model-View-Controller
controller 接收所有 view actons, 处理所有相关的交互逻辑,然后触发相关的 model actions,接受所有 model 改变的通知,为 view 准备好相关的数据展示。
image.png虚线表示的是 runtime references
, view layer 和 model layer 不是直接的去引用 controller,实线表示的是 compile-time references
, controller 是知道 view 和 model object 的存在的和如何连接它们。
-
Construction
controller 设置 view 和 需要 data 的来源。controller 拥有 model layer
-
Updating the Model
在 MVC 中, controller 接收 view 的事件,controller 知道 view 的存在,但是 view 不知道 controller 的存在,当有 view 的事件来了的时候,controller 知道改变他内部的状态,改变 model 的状态,或直接改变 view 的状态。
-
Changing the View
在我们解释的 MVC 中, 当发生 view actions 的时候, model 改变了,controller 不应该直接改变 view,而是 controller 订阅 model 的通知,当 model 改变的通知来了,才改变 view。view actions 另 model 改变,然后 model 的改变发送通知,另 view 改变
-
View Sate
View State 由 viewController 或者 view 自行管理
-
Testing
在 MVC 中, controller 集合了其他层的东西,缺乏界限,所以难以测试。
Model-View-ViewModel+Coordinator
VM 可以直接暴露 view 所需要的属性,然后同 data bind 来渲染,因为 VM 没有对 view layer 直接引用,所以相对独立,所以在测试过程中,也相对独立,方便测试
在 VM 中如果有一个 object 提供了界面的转换,在 MVVM-C 中,这个对象叫做 coordinator。coordinator 知道 model layer 和 view controller 的层级结构,所以它可以为当 view controller 所需要 model 的这个点作出支持。
不像 MVC,view controller 在 MVVM-C 中不直接引用其他 view controllers, view controller 通知 coordinator (通过某些机制,例如 delegate) 相关的 view actions.然后 coordinator 呈现新的 VC 并设置相关的 model data, view controller 的层级的管理是通过 coordinator,而不是 view controller 自己。
image.pngVM 和 VC,view 进行分离了,方便测试,coordinator 的加入,移除了 VC 相关的责任(呈现跳转别的 VC)。
- Construction
model 的构建还是和 MVC 的一样没有变,有顶级的 controllers 来构建,这里指的是构建,但是对于单独的 model 来说,它是被 VM 所持有的,而不是由 VC 持有,view 层的构建和 MVC 差不多,但是和 MVC 中不同的是,VC 不之间为 view 做数据源的获取和准备工作。这个交给了 VM 去做,VC 创建 VM,然后为 view 做数据绑定 - Updating the Model
MVVM 中,VC 接收事件和 MVC 中的一样,当事件到达,VC 不直接改变内部的状态,view state 或者 model,而是调用 VM 的方法,然后通过 VM 改变内部的状态或者 model 的更新 - Changing the View
和 MVC 不同的是,VC 不观察 model 的变化,而是,通过 VM 去观察 model 的变化,然后把 model 的变化转化为某种能被 VC 感知到的方式,VC 订阅 VM 的变化,VM 的事件到达了,VC 就更新 view。view-model 通常会发生 model 更新相关的 view actions 给 model,然后 model 更新后会通知它的观察者 - View State
view state 可以在 view 或者 view-model 中,和 MVC 不同的是,view controller 不含有 view state,当使用 coordinators 的时候,view controller 的 view state 交给它去管理 - Testing
因为 view-model 它和 view 和 controller 比较独立了,所以 VM 方便测试,而不想 MVC 那样,需要集合很多东西一起测试。
Model-View-Controller+ViewState
在 MVC+VS 中引入了一个新的模型 view state model,在 MVC+VS 中不再忽略 navigation 的更改,row 的选择,text field 的编辑,scroll position change 或者其他 view state 的变化。传递相关的 view state model action ,给 view state model,每个 view controller 观察 view state model 的变化,它可以使改变边的直观,无论在是交互逻辑还是呈现逻辑。不在通过 view 来获取 view state 的状态,而是通过 view state model
image.png
- Construction
controller 还是应用 model data 到 view 中,view controller 订阅 view state。
2.Updating the Model
当有 view acton 发生的时候,view controller 改变 model 或者 view state model,我们不直接改变 view,而是,所有改变的操作都通过 document model 和 view state model 来反馈 - Changing the View
controller 观察 document model 和 view state model 的变化来更新 view
4.View State
View State 被明显的区分出来,controller 观察 document model 和 view state model 的变化来更新 view - Testing
在 MVC+VS 中测试流程很像 MVC,但是需要设置 document model 和 view state model,困难的部分是集合其他部分,测试 view state.
ModelAdapter-ViewBinder
MAVB 有 3 个重要的组成部分:view binders
, model adapters
和 bindings
view binders 是包装了 view 或者 view controller 的类,它构建 view 和 暴露一系列的绑定,一系绑定是为 view 提供数据,一些事发送事件
model apapter 是包装了一些可变状态,它通过 reducer
来实现,model adpater 提供了输入的绑定(发送事件)和 输出绑定(接收更新)
MAVB 中不用直接创建 view,而是通过 view binders,view binder 和 model adapters 的变化是通过 bindings 来通信
MAVB 移除了 controller 层,构建逻辑通过 view binders,变化逻辑通过 bindings,状态的变化通过 model adapters
image.png
-
Construction
model adapter 包装了 main model, view state adpater 包装了 view state,view binders 是通过普通的函数来构成的,它获取 model adapter 的一些参数 -
Updating the Model
view 可以发送动作,然后 view binding 允许 action binding,数据流是由 view 到 action binding,输出连接了 model adapter,然后通过 binding 把信息转到 model adapter,最后 MA 通过 reducer 来更新状态 -
Changing the View
model apater 的状态改变了,然后发送通知信号给 view binder,然后更新 view
4.View State
view state 被看成 model layer 中一部分,view state actions 和 view state 通知和 model actions model notifications 一样
- Testing
MAVB 中通过 view binders 来测试,测试 MAVB 和 MVVM 类似,它也是暴露了一些逻辑给 view controller,MAVB 中没有 view controller,binding 是唯一一个地方在 MA 和 VB 中。
The Elm Architecture
TEA 中 model 和 view state 被集合到一个单独的状态模型中,发送的所有改变都通过给这个模型发送消息,然后出来消息的更新状态的函数称为 reducer
TEA 中状态的改变通过创建新的 virtual view hierarchy
,它描述了 view 是怎么渲染的,virtual view hierarchy 允许我们通过纯函数去实现,没有副作用。
-
Construction
state 通过 driver 构建。store 是个单例,view 是通过 VVH 来计算当前的状态。 -
Updating the Model
Driver 接收到 message 后,使用更新函数来改变状态。 -
Changing the View
通过改变状态来改变 view -
View State
VS 也是在 state 中,state 的改变反应到 view 上 -
Testing
只需要测试 VVH 它计算的 state 是否真确
网友评论