MVVM的前世今生与在苹果开发中的应用

简介: MVVM的前世今生与在苹果开发中的应用

MVVM是微软于2005年开发出的一种软件架构设计模式,主要是为了在WPF和Sliverlight中更简单的对UI实现事件驱动编程。在WPF和Sliverlight中,通过MVVM成功的实现了UI布局和数据逻辑的剥离。虽然WPF和Sliverlight最后都没有推广开来,但是还是让大家看到了MVVM设计模式的优秀之处。

MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。

MVC在苹果开发中M是数据,View是UIView,C是UIViewController。C在MVC占据支配作用,View加载,数据请求,数据再加工,业务逻辑几乎都集中在C中处理,造成胖UIViewController。一个控制器C甚至达到成千上万行,造成很难开发维护。这样的好处也有,代码集中不用新建很多累,对开发者实现方便(对后期其它维护者是噩梦)。有些人在采用MVC开发时喜欢采用对象拷贝方式,不是强应用方式。由于它结构简单,主要是UIViewController通过设置view的model来更新ui,所以问题不大。

为了解决胖C问题MVC是把一部分逻辑放在View中,虽然瘦身了C,但是C还是很大。为了彻底解决胖UIViewController问题,实现事件驱动编程,抽象出ViewModel。它具体做的是:请求参数校验,和后台进行交互,后台报错显示,对后台数据进行model转换,对后台返回的数据进行再加工以便于直接控制View的数据显示,根据后台结果进行逻辑处理(当然这个逻辑也可以放在c中写逻辑或实现状态机)。

Model是最单主要是数据模型定义, 也可能包含极少的数据再加工函数。

View主要通过setModel来实现数据显示,少数根据数据来区分显示UI。

UIViewController负责加载View,调用ViewModel对象向服务器发送请求,根据服务器的响应结果通过更新View的model来更新UI。

从这里可以看到ViewModel能实现原来MVC的UIViewController和View的绝对大多数功能,也可以重新让他们实现,用来达到他们三者的平衡,防止从胖UIViewController变成胖ViewModel。由于View,ViewModel,UIViewController三者共同持有Model,所以再使用对象拷贝Model会出现数据不一致,一般采用强引用方式三者共享一个大model,来实现三者的数据一致性。

看过这篇文章,若读者有一定的苹果开发经验应该明白mvvm解决了mvc的什么问题(解决胖UIViewController问题,事件驱动View),比它先进在哪里。当然任何事物都有两面性。分的越细,拆分的模块越多,写代码的速度越慢!但是好处也很显然就是能写出高性能,可维护性强的代码。正向很多人对组件化开发的存在的误解一样,认为组件化开发像堆积木一样,堆积起来比一层一层垒起来更快。软件开发是一个系统工程,其实开发组件本身比直接开发更费时间,组件不是直接把代码拷贝出来就是组件。组件要能独立运行,在修改组件时要兼容原来的场景和现在场景,考虑上下问。组件在减少了代码重复性和增加了代码复用性,能统一修改,也增加了抽象组件的时间,组件在使用的兼容性设计。在使用组件化开发不但不会提高开发速度,反而会大大减少开发速度。当产品稳定后,组件化才逐步提高它对对开发速度的提升和可维护性。

好的架构只是提高了软件的可能高度,最终还是看是哪一类程序员开发的。若是开发的既快又差的程序员开发,这不是好事,反而还不如mvc,毕竟越复杂的架构对开发者的素质和能力要求越高。

现在很多老板拼命压榨员工,有想用最新的架构,组件化开发,提高开发质量,又拼命压缩开发人员数和开发时间,制订出根本不可能按时完成的任务。开发人员只能拼命加班,经常996,晚上休息不好,第二天开发效率当然低了,造成恶性循环。这样就是优秀的程序员开发质量也会下降。老板为了经济利益这样拼命让员工加班,怕年龄大的程序猿身体吃不消,不好忽悠大龄程序猿,工资要求高,所以内部规定了程序猿的年龄不能超过35岁,以公司年轻化为荣(平均30岁以下)。这是又想马儿跑,又不想给马儿吃草思想。现在随着高考和研究生扩招,研究生大行其道的年代,正常毕业就25岁了,那么30岁以下工作不到五年。其实软件开发并不是都需要高学历,更需要逻辑思维能力强,不达目的不罢休的性格,独立解决问题的能力。再来看看美国等发达国家的程序猿,主力是30岁和40岁的程序猿。他们是喜欢程序猿这个职业而做程序猿,而我们是为了挣钱而做程序猿。我见到一个招聘信息要求应届毕业生掌握软件开发架构。这不是搞笑吗?三年之内的程序猿能帮你开发,质量不错,知其然不知其所以然,他已经是一个合格的程序猿了。一般的程序猿在无人指导下,野蛮开发环境下可能十年都不会知道架构的具体应用,知道问题本质的东西。我是从事开发10年后,接触到相关架构项目,不断自我总结才完善了架构和技术本质的东西。前五年我只知道开发,只抓住了些皮毛。五年后才处于懵懂状态。不得不承认,有的程序猿确实能力超强,运气很好,但是没有三年也很难真正掌握架构和技术本质的东西。能力强的五年能掌握还是有的。十年一般会知道的更多。 聪明的人用经验换取生命,不聪明人用生命换取经验 ,他们都将会成为将军。

公司招聘程序员是要他开发出高质量的软件,还是想高速度的开发软件,这个定位很重要。一般的外包公司接的外包项目强调开发速度,自己的项目最好要求开发高质量的软件。想前期开发高度开发,不断叠加功能,想后期优化改善质量。认为这样用的时间最短。实际上这样用的时间更长。一般的程序猿开发完成,心理抗拒推到重来。一个高度开发的程序猿基本上也变不成高质量的开发程序猿。个性决定结果。什么都想最好,最好什么都难达到,有舍才有得。

目录
相关文章
|
9月前
|
Web App开发 前端开发 JavaScript
SAP UI5 应用开发教程之一百零七 - SAP UI5 OverflowToolbar 容器控件介绍的试读版
SAP UI5 应用开发教程之一百零七 - SAP UI5 OverflowToolbar 容器控件介绍的试读版
SAP UI5 控件 ObjectStatus 的使用方法介绍试读版
SAP UI5 控件 ObjectStatus 的使用方法介绍试读版
SAP UI5 控件 ObjectStatus 的使用方法介绍试读版
|
8月前
|
传感器 存储 移动开发
SAP UI5 应用开发教程之五十 - 如何使用 Cordova 将 SAP UI5 应用生成一个能在 Android 手机上安装的混合应用试读版
SAP UI5 应用开发教程之五十 - 如何使用 Cordova 将 SAP UI5 应用生成一个能在 Android 手机上安装的混合应用试读版
|
8月前
|
Web App开发 前端开发 JavaScript
如何给 SAP UI5 SmartField 添加 Value Help 功能试读版
如何给 SAP UI5 SmartField 添加 Value Help 功能试读版
|
8月前
|
开发者
SAP UI5 应用开发教程之二十九 - SAP UI5 的路由和导航功能介绍试读版
SAP UI5 应用开发教程之二十九 - SAP UI5 的路由和导航功能介绍试读版
|
存储 安全 容器
SwiftUI极简教程37:构建一个AppStore应用市场推荐页面(下)
承接上一章的内容,我们继续完成构建一个AppStore应用市场推荐页面。 本章我们完成最难的部分,即摘要视图和完整视图的页面状态切换。
250 0
SwiftUI极简教程37:构建一个AppStore应用市场推荐页面(下)
|
容器
SwiftUI极简教程36:构建一个AppStore应用市场推荐页面(中)
SwiftUI极简教程36:构建一个AppStore应用市场推荐页面(中)
227 0
SwiftUI极简教程36:构建一个AppStore应用市场推荐页面(中)
|
前端开发 Swift
SwiftUI极简教程35:构建一个AppStore应用市场推荐页面(上)
SwiftUI极简教程35:构建一个AppStore应用市场推荐页面(上)
385 0
SwiftUI极简教程35:构建一个AppStore应用市场推荐页面(上)
|
JavaScript 前端开发 NoSQL
微信开发系列之五 - 将SAP UI5应用嵌入到微信中
微信开发系列之五 - 将SAP UI5应用嵌入到微信中
157 0
微信开发系列之五 - 将SAP UI5应用嵌入到微信中
|
存储 NoSQL JavaScript
SAP系统和微信集成的系列教程之六:如何通过OAuth2获取微信用户信息并显示在SAP UI5应用中
SAP系统和微信集成的系列教程之六:如何通过OAuth2获取微信用户信息并显示在SAP UI5应用中
SAP系统和微信集成的系列教程之六:如何通过OAuth2获取微信用户信息并显示在SAP UI5应用中