当前位置:网站首页>被误解的 MVC 和被神化的 MVVM(二)
被误解的 MVC 和被神化的 MVVM(二)
2022-08-03 16:50:00 【HelloWorld杰少】
MVVM 的历史
MVVM 是 Model-View-ViewModel 的简写。相对于 MVC 的历史来说,MVVM 是一个相当新的架构,MVVM 最早于 2005 年被微软的 WPF 和 Silverlight 的架构师 John Gossman 提出,并且应用在微软的软件开发中。当时 MVC 已经被提出了 20 多年了,可见两者出现的年代差别有多大。
MVVM 在使用当中,通常还会利用双向绑定技术,使得 Model 变化时,ViewModel 会自动更新,而 ViewModel 变化时,View 也会自动变化。所以,MVVM 模式有些时候又被称作:model-view-binder 模式。
具体在 iOS 中,可以使用 KVO 或 Notification 技术达到这种效果。
MVVM 的神化
在使用中,我发现大家对于 MVVM 以及 MVVM 衍生出来的框架(比如 ReactiveCocoa)有一种敬畏感。这种敬畏感某种程度上就像对神一样,这主要表现在我没有听到大家对于 MVVM 的任何批评。
我感觉原因首先是 MVVM 并没有很大程度上普及,大家对于新技术一般都不熟,进而不敢妄加评论。另外,ReactiveCocoa 本身上手的复杂性,也让很多人感觉到这种技术很高深难懂,进而加重了大家对它的「敬畏」。
MVVM 的作用和问题
MVVM 在实际使用中,确实能够使得 Model 层和 View 层解耦,但是如果你需要实现 MVVM 中的双向绑定的话,那么通常就需要引入更多复杂的框架来实现了。
对此,MVVM 的作者 John Gossman 的 批评 应该是最为中肯的。John Gossman 对 MVVM 的批评主要有两点:
第一点:数据绑定使得 Bug 很难被调试。你看到界面异常了,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题。数据绑定使得一个位置的 Bug 被快速传递到别的位置,要定位原始出问题的地方就变得不那么容易了。
第二点:对于过大的项目,数据绑定需要花费更多的内存。
某种意义上来说,我认为就是数据绑定使得 MVVM 变得复杂和难用了。但是,这个缺点同时也被很多人认为是优点。
ReactiveCocoa
函数式编程(Functional Programming)和响应式编程(React Programming)也是当前很火的两个概念,它们的结合可以很方便地实现数据的绑定。于是,在 iOS 编程中,ReactiveCocoa 横空出世了,它的概念都非常 新,包括:
函数式编程(Functional Programming),函数也变成一等公民了,可以拥有和对象同样的功能,例如当成参数传递,当作返回值等。看看 Swift 语言带来的众多函数式编程的特性,就你知道这多 Cool 了。
响应式编程(React Programming),原来我们基于事件(Event)的处理方式都弱了,现在是基于输入(在 ReactiveCocoa 里叫 Signal)的处理方式。输入还可以通过函数式编程进行各种 Combine 或 Filter,尽显各种灵活的处理。
无状态(Stateless),状态是函数的魔鬼,无状态使得函数能更好地测试。
不可修改(Immutable),数据都是不可修改的,使得软件逻辑简单,也可以更好地测试。哇,所有这些都太 Cool 了。当我看到的时候,我都鸡冻了!
我们应该客观评价 MVVM 和 ReactiveCocoa
但是但是,我突然想到,我好象只需要一个 ViewModel 而已,我完全可以简单地做一个 ViewModel 的工厂类或 Service 类就可以了,为什么要引入这么多框架?现有的 MVC 真的有那么大的问题吗?
直到现在,ReactiveCocoa 在国内外还都是在小众领域,没有被大量接受成为主流的编程框架。不只是在 iOS 语言,在别的语言中,例如 Java 中的 RxJava 也同样没有成为主流。
我在这里,不是想说 ReactiveCocoa 不好,也不是想说 MVVM 不好,而是想让大家都能够有一个客观的认识。ReactiveCocoa 和 MVVM 不应该被神化,它是一种新颖的编程框架,能够解决旧有编程框架的一些问题,但是也会带来一些新问题,仅此而已。如果不能使好的驾驭 ReactiveCocoa,同样会造成 Controller 代码过于复杂,代码逻辑不易维护的问题。
总结
有一些人总是追赶着技术,有什么新技术不管三七二十一立马就用,结果被各种坑。又有一些人,总是担心新技术带来的技术风险,不愿意学习。结果现在还有人在用 MRC 手动管理引用计数。而我想说,我们需要保持的是一个拥抱变化的心,以及理性分析的态度。在新技术的面前,不盲从,也不守旧,一切的决策都应该建立在认真分析的基础上,这样才能应对技术的变化。
边栏推荐
- 组件通信-父传子组件通信
- 软考 --- 软件工程(1)概念、开发模型
- Understand the recommendation system in one article: Outline 02: The link of the recommendation system, from recalling rough sorting, to fine sorting, to rearranging, and finally showing the recommend
- protobuf 反射使用总结
- Kubernetes 笔记 / 目录
- 【目标检测】Focal Loss for Dense Object Detection
- 高效的组织信息共享知识库是一种宝贵的资源
- 【带你了解SDN和网络虚拟化】
- C专家编程 第3章 分析C语言的声明 3.8 理解所有分析过程的代码段
- 【AppCube】零代码小课堂开课啦
猜你喜欢
随机推荐
C专家编程 第3章 分析C语言的声明 3.8 理解所有分析过程的代码段
【There is no tracking information for the current branch. Please specify which branch you want to 】
Async的线程池使用的哪个?
Kubernetes 笔记 / 目录
Cookie和Session的关系
最强分布式锁工具:Redisson
面试不再被吊打!这才是Redis分布式锁的七种方案的正确打开方式
Excuse me this hologres dimension table is cached?How to Finished
高效的组织信息共享知识库是一种宝贵的资源
C专家编程 第3章 分析C语言的声明 3.6 typedef int x[10]和#define x int[10]的区别
How ArkUI adapter somehow the screen
设置海思芯片MMZ内存、OS内存详解
2年开发经验去面试,吊打面试官,即将面试的程序员这些笔记建议复习
基于DMS的数仓智能运维服务,知多少?
面试突击71:GET 和 POST 有什么区别?
阿里二面:没有 accept,能建立 TCP 连接吗?
11. Container With Most Water
Big guys.Use flink-cdc-sqlserver version 2.2.0 to read sqlserver2008R
Selective Search学习笔记
LeetCode·72.编辑距离·动态规划









