一个页面开始时只有输入框和按钮,后来加上加载状态、错误提示、数据转换,负责连接界面和数据的那层代码就容易越写越大。MVC、MVP、MVVM 等模式,讨论的正… · @BaiBtw · TwKit
@BaiBtw
一个页面开始时只有输入框和按钮,后来加上加载状态、错误提示、数据转换,负责连接界面和数据的那层代码就容易越写越大。MVC、MVP、MVVM 等模式,讨论的正是这些职责怎么分。 Alex Xu 的英文图把 MVC、MVP、MVVM、MVVM-C 和 VIPER 放在一起。先抓住共同点:View 负责显示内容、接收输入,Model 管理业务数据;中间的 Controller、Presenter 或 ViewModel,负责把两边连接起来。 MVC 的图里,View 把操作通知 Controller,Controller 更新 Model,View 再获取数据。重点是分开界面、控制和数据职责。具体框架的调用关系会有差异,不必把这张示意图当成唯一实现。 MVP 把 Presenter 放在 View 和 Model 中间。图中的 View 通知 Presenter,Presenter 获取或更新 Model,再更新 View。拿一个搜索页作例子,界面报告“用户点了搜索”,由 Presenter 协调查询,并告诉界面显示结果还是错误。 MVVM 则把 ViewModel 与界面的绑定关系突出出来。ViewModel 提供界面需要的状态,View 根据状态变化更新。还是搜索页,可以用“正在加载、结果列表、错误信息”来理解这层暴露给界面的内容。数据绑定并不等于所有状态都必须双向同步。 MVVM-C 在这三层之外加上 Coordinator,把一部分协调职责单独提出来。它没有让 View 或 Model 消失,而是继续拆分容易堆在一起的工作。 VIPER 拆得更细:View、Interactor、Presenter、Entity、Router。图里,Presenter 连接界面与 Interactor,Interactor 处理 Entity,Router 单独承担路由职责。看它时,可以先追踪一次用户操作经过哪些角色,而不是只记住五个字母。 这些模式不是从左到右升级的等级表。拆分能让职责更清楚,也会增加接口和沟通路径。选型前可以先看当前代码哪里最难改、最难单独测试,再决定是否值得多拆一层。仅仅把一个大文件改成五个文件,并不会自动消除耦合。 英文原文及示意图: https://x.com/alexxubyte/status/1804899079505457590
曝光 3 · 评论 0 · 点赞 0 · 书签 0
查看原帖