当前位置: 首页 > 编程日记 > 正文

业务组件架构的思考

iOS开发中,我们接触比较多的是MVC架构,下面我们先来分析一下MVC架构。

1.MVC

MVC是一种软件架构模式,在1978年由Trygve Reenskaug提出,它把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):

  • 视图(View):用户界面。
  • 控制器(Controller):业务逻辑处理,协调所有的工作。它使数据从模型传出来然后显示在视图上,监听事件,在必要的时候操作数据。
  • 模型(Model):用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。

1.1iOS中的MVC

MVC是我们在客户端开发中最常见的模式,在iOS中,模型、视图、控制器之间的相互调用有一些规范和约定,借用斯坦福大学公开课第一课的一张截图,如下所示:

对于上图的理解,有如下几点:

  • 先说明一下上图中的三种线:黄色实线、白色实线、白色虚线。可以看到,Model和View之间是两条黄色实线,这表示不能穿越这黄线,任何一个方向都不行,即Model和View完全分离。白色虚线表示可以自由的穿越它,只要是安全的。白色实线表示可以穿越,但需要交过路费。
  • 绿色的箭头表示直接引用。简单的说,就是包含引用类的头文件和类的实例变量。上图中只有 Controller 中,有对 Model 和 View 的直接引用。
  • View对Controller的通信有三种方式:Target-Action(如按钮的点击事件)、delegate(如表格的UITableViewDelegate)、data source(如表格的UITableViewDataSource)。通过这三种方式,View 达到了既能向 Controller 通信,又不需要知道具体的 Controller ,从而达到解耦的目的。
  • Model 主要是通过 Notification 和 KVO 来和 Controller 通信的。

1.2MVC的优点

  • 低耦合和高重用性。View和Model完全隔离,这样我们既可以很容易让同一套Model来适配不同的View(比如同时做iPad版和iPhone版),也可以很容易让多套Model在同一个View上展现(比如说根据数据源不同显示表格)。

  • 可维护性。各层分离,使得应用更易于维护和修改。

1.3MVC的缺点

上图介绍的MVC是一种理想化的MVC,在我们实际项目中,MVC常常是这样的:

在iOS的项目开发中,View和Controller分的并不是特别清楚,导致写出臃肿的ViewController,最终让人感觉不是MVC,而是Model+ViewController。出现这种情况是为什么呢?这是因为UIViewController中自带了一个View,且控制了View的整个生命周期(viewDidLoad,viewWillAppear...)。自带的这个View,不光可以展示视图,更主要的任务是作为一个容器,来添加别的视图。

1.4怎样划分MVC的职责?

MVC是最基本的架构,在MVC的规范下,可以演化出其他的各种架构,如对胖Controller的拆分成MVCS,拆分胖Model成MVVM等等。不管怎么拆分,一定符合MVC规范。这里先继续介绍怎样划分MVC的职责,能比较好的规避臃肿ViewController的问题。

  • Model的职责
  1. 给Controller提供数据;
  2. 给Controller存储数据;
  3. 提供业务基本组件(可以这样来理解基本组件:把Controller里面的私有方法单独封装出来),供Controller调用。
  • View的职责
  1. 显示页面视图;
  2. 响应与业务无关的事件,比如说动画效果、视图更新等等。
  • Controller的职责
  1. 管理视图容器的生命周期;
  2. 负责生成所有的View实例,并放入视图容器;
  3. 监听来自View与业务有关的事件,通过与Model的合作,来完成对应事件的响应。

1.5MVC小结

从上面的分析,我们可以看到:MVC是一种很优秀的架构,但它也存在一些问题,最大的问题是导致写出臃肿的ViewController,当前我们的做法是引入了一个DataHelper类来分解一部分VC里面的职能。有没有其他的方案呢?我们继续来分析。

2.MVVM

MVVM,Model-View-ViewModel,一个从 MVC 模式中进化而来的设计模式,最早于2005年被微软的 WPF 和 Silverlight 的架构师 John Gossman 提出。在 iOS 开发中实践 MVVM 的话,通常会把大量原来放在 ViewController 里的视图逻辑和数据逻辑移到 ViewModel 里,从而有效的减轻了 ViewController 的负担。另外通过分离出来的 ViewModel 获得了更好的测试性,我们可以针对 ViewModel 来测试,解决了界面元素难于测试的问题。MVVM 通常还会和一个强大的绑定机制一同工作,一旦 ViewModel 所对应的 Model 发生变化时,ViewModel 的属性也会发生变化,而相对应的 View 也随即产生变化。

2.1MVVM介绍

  • 面向协议的 MVVM 架构介绍
  • Introduction to MVVM

2.2MVVM的优点

  • 减轻了VC的负担;

  • 提高了可测试性;

  • 强大的绑定机制。

2.3MVVM的缺点

  1. 学习成本和开发成本较高;
  2. 数据绑定使得BUG更难调试;
  3. VM的职责过重。

3.MVVMWithDC

3.1View和ViewController

  1. 每一个View都有一个与之对应的ViewModel,View的数据展示和样式都由它确定;
  2. 不引入双向绑定机制和观察机制,而是通过传统的代理回调或通知将UI事件传给ViewController;
  3. ViewController只负责将ViewModel装配给View,接受UI事件。

这样做的优点是:

  1. View可以完全解耦,只要确定好ViewModel和回调接口;
  2. ViewController可以尽可能少的和View的具体实现打交道,将这部分职责转给了ViewModel,降低了ViewController的负担;
  3. 使用传统的代理回调和通知方式,学习成本低,降低了维护和调试的成本。

3.2ViewController和Model

  1. 将获取数据和处理数据的职责从传统MVVM的VM中抽离出来,成为DataController;
  2. VC请求数据或修改数据的UI事件传递给DC来处理;
  3. DC接收到数据请求后,向DataRequest获取数据或修改数据,并使用Model包装,返回给VC。

这样做的优点是:

  1. 避免了传统MVVM的VM过于臃肿的问题,另外模块的职责更清晰;
  2. 业务逻辑解耦,数据的加工和处理放在DC,VC不关心数据的获取和加工;DC不关心页面的展示和交互;

3.3完整的架构图

3.3.1优点

  • 层次清晰,职责明确:和界面有关的逻辑完全划到 ViewModel 和 View 一遍,其中 ViewModel 负责界面相关逻辑,View 负责绘制;DataController 负责页面相关的数据逻辑,而 Model 还是负责纯粹的数据层逻辑。 ViewController 仅仅只是充当简单的胶水作用。
  • 耦合度低,测试性高:除开 ViewController 外,各个部件可以说是完全解耦合的,各个部分也是可以完全独立测试的。同一个功能,可以分别由不同的开发人员分别进行开发界面和逻辑,只需要确立好接口即可。
  • 复用性高:解耦合带来的额外好处就是复用性高,数据逻辑代码不放在 ViewController 层可以更方便的复用。
  • 学习成本低: 本质上来说,这个架构属于对 MVC 的优化,主要在于解决 Massive View Controller 问题,把原本属于 View Controller 的职责根据界面和逻辑部分相应的拆到 ViewModel 和 DataController 当中,所以是一个非常易于理解的架构设计,即使是新手也可以很快上手。
  • 开发成本低: 完全不需要引入任何第三方库就可以进行开发,也避免了因为 MVVM 维护成本高的问题。
  • 实施性高,重构成本低:可以在 MVC 架构上逐步重构的架构,不需要整体重写,是一种和 MVC 兼容的设计。

3.3.2缺点

  •  当页面的交互逻辑非常多时,需要频繁的在 DC-VC-VM 里来回传递信息,造成了大量胶水代码。
  • 另外,由于在传统的 MVVM 中 VM 原本是一体的,一些复杂的交互本来可以在 VM 中直接完成测试,如今却需要同时使用 DC 和 VM 并附上一些胶水代码才能进行测试。
  • 没有了 Binding,代码写起来会更费劲一点。

3.3.3代码

GofArchDemo

3.4参考资料

  • 猿题库 iOS 客户端架构设计

4.总结

每个业务的需求不一样,难度和业务场景都不一样,因此在选择业务组件架构的时候,个人认为应该是根据需要进行合理的安排业务组件的架构。原则上如果业务很简单,那么使用MVC即可,毕竟MVC架构层次清晰,类结构也简单,对于业务复杂度较低的,没必要使用MVVM或者更深层次的架构,来人为的增加复杂度。

这里给一个参考标准:如果使用MVC架构,Controller的代码行数超过500行,那么可以考虑使用MVVM或者其他架构来分化Controller的部分职责。

转载于:https://www.cnblogs.com/LeeGof/p/6747384.html

相关文章:

强化学习:10种真实的奖励与惩罚应用

作者 | Patrycja翻译 | Katie,责编 | 晋兆雨出品 | AI科技大本营头图 | 付费下载于视觉中国在强化学习(Reinforcement Learning)中,对代理进行奖励和惩罚机制的培训。代理的正确行为会得到奖励,而错误的行为会受到惩罚…

PHP feof() 函数读文件的使用

(PHP 4, PHP 5) feof — 测试文件指针是否到了文件结束的位置 如果服务器没有关闭由 fsockopen() 所打开的连接,feof() 会一直等待直到超时而返回TRUE。默认的超时限制是 60 秒,可以使用 stream_set_timeout() 来改变这个值。 文件指针必须是有效的&a…

批处理解决“易语言难题”

为什么80%的码农都做不了架构师?>>> 发现还没有Win批处理的,也就是DOS,我来凑个热闹,哈哈~ maxos 汇总贴 APPLEUFO 原题链接 不罗嗦,上代码啦: echo off set c_title批处理…

\r与\n有何差别,编码的时候应该怎样使用

差别: \r: 全称:carriage return (carriage是“字车”的意思。打印机上的一个部件)简称:return缩写:rASCII码:13作用:把光标移动到当前行的最左边\n: 全称:new line别名…

深度学习中的注意力机制(一)

作者 | 蘑菇先生来源 | NewBeeNLP头图 | CSDN下载自视觉中国目前深度学习中热点之一就是注意力机制(Attention Mechanisms)。Attention源于人类视觉系统,当人类观察外界事物的时候,一般不会把事物当成一个整体去看,往往…

Hibernate 异常org.hibernate.LazyInitializationException: could not initialize prox

Hibernate的Lazy初始化1:n关系时,必须保证是在同一个Session内部使用这个关系集合,不然Hiernate将抛出异常。 两种处理方法: 一、这是延时加载的问题,把有关联的所有pojo类,在hibernate.cfg.xml文件中。一般在many-to-…

XHTML基础问答

作者:阿捷 2004-6-26 1:43:36本文是2002年为硅谷动力网站翻译的稿件。当时xhtml1.0刚刚开始被设计师所接触,所以有下面这个基础问答。 HTML语言是我们建立网页的工具,从它出现发展到现在,规范不断完善,功能越来越强。…

958毕业,苦学Java,竟被二本毕业生吊打!网友:确实厉害!

最近收到一位中型公司 HR 的反馈,她说,我推荐的一个普通本二毕业生在校招面试中表现非凡,当时两个人争抢一个名额,他竟然完胜另一位 985 毕业生。普通本二毕业生对公司的技术提问对答如流,曾在小公司实习,做…

css布局中的居中问题

css布局中的居中问题 作者:阿捷 2004-7-5 14:35:49#sample{HEIGHT:240px;WIDTH:400px;BACKGROUND: url(http://www.w3cn.org/style/001/logo_w3cn_194x79.gif) #CCC no-repeat center;} 如何使DIV居中 主要的样式定义如下: body {TEXT-ALIGN: center;…

领域驱动设计_软件核心复杂性应对之道

领域驱动设计_软件核心复杂性应对之道转载于:https://www.cnblogs.com/MarvinGeng/archive/2013/02/21/2920968.html

谈谈Boost网络编程(2)—— 新系统的设计

写文章之前。我们一般会想要採用何种方式,是“开门见山”,还是”疑问式开头“。写代码也有些类似。在编码之前我们须要考虑系统总体方案,这也就是各种设计文档的作用。在设计新系统之初,我基本的目的是:保证高效率&…

64岁Python之父退休失败,正式加入微软搞开源

来源 | CSDN今天,64岁的Python 之父 Guido van Rossum 在 Twitter 上正式宣布,退休太无聊,如今加入了微软开发者部门。Guido van Rossum 去年宣布退出 Python 核心决策层事实上,近几年来,随着人工智能的飞速发展&#…

Java实现HTTP文件下载(转)

文章出自: http://www.360doc.com/content/12/1218/17/2718300_254818081.shtml 本人用这种方法解决了工作中遇到的问题,再次谢谢文章的作者. 序言 许多用户可能会遇到这样的情况:在网站上发现一个很好的资源,但是这个资源是分成了很多个文件存放的&…

初学web标准的几个误区

初学web标准的几个误区作者:阿捷 2004-7-7 11:37:11非常高兴地看到很多设计师开始关注和尝试使用web标准制作网页。但从网友们的问题和制作中发现几个问题,在这里特别提醒一下: 1.不是为了通过校验才标准化。 web标准的本意是实现内容(结构…

nginx系列:nginx反向缓存代理详解

小生博客:http://xsboke.blog.51cto.com如果有疑问,请点击此处,然后发表评论交流,作者会及时回复。-------谢谢您的参考,如有疑问,欢迎交流一、 代理和nginx相关概念1. 代理类型正向代理:代理局域网对internet的连接请求反向代理&…

编辑PDF文档,Word 2013可以是您的选择

题外话:记得刚进公司的时候,几乎所有的培训文档都是PDF、标准文档,公司使用的软件是Adobe Acrobat 5.0(不知道多少钱,呵呵),软件当然是购买正版的;去年,公司购买了新版本…

中国人工智能学会2020年度优秀科技成果出炉,百度文心ERNIE入选

11月14日,由中国人工智能学会(CAAI)主办的2020第十届中国智能产业高峰论坛(CIIS 2020)正式开幕,CAAI理事长戴琼海院士、何积丰院士、何友院士、王恩东院士、陆军院士等多位中外院士、专家齐聚嘉兴南湖&…

web标准,我们去向何方?一些想法...

web标准,我们去向何方?一些想法...作者:阿捷 2004-7-5 0:52:42原文作者:Veerle 原文出处:veerle.duoh.com 原文发表时间:2004年6月14日 译者注:本文是"你应该关注web标准的真正原因"…

事件源ES的优势

多年来,开发人员实现持久性使用传统的创建、读取、更新、删除(CRUD)模式。正如前面介绍的,如果采购模型实现持久性存储状态更改为历史事件捕获业务活动发生之前写的数据存储。这将事件存储机制,允许他们被聚合,或者放在一个组与逻辑边界。事件采购的模式之一,使并发、分布式系统…

你应该关注web标准的真正原因

你应该关注web标准的真正原因作者:阿捷 2004-7-4 2:28:39原文作者:Andrei Herasimchuk 原文出处:designbyfire.com 原文发表时间:2004年6月11日 译者前言:这是一篇让人震惊的文章。作者的分析深刻,文笔犀…

为什么我们需要开源的系统芯片?

作者 | bunnie译者 | 弯月,编辑 | 杨碧玉来源 | CSDN(ID:CSDNnews)现代的小型电子产品往往基于某个高度集成的芯片构建,这种芯片称为“系统芯片”(System on aChip,缩写:SoC&#xf…

InnoDB和MyISAM区别

MySQL作为当前最为流行的免费数据库服务引擎,已经风靡了很长一段时间,不过也许也有人对于MySQL的内部环境不很了解,尤其那些针对并发性处理的机制。今天,我们先了解一下MySQL中数据表的分类,以及它们的一些简单性质。 …

图书管理系统5W1H

Who 图书管理员 When 图书管理员在图书馆借阅期间管理用户的借书还书,非借阅时间管理后台图书、管理用户信息 Where 借书台、办公室 What 一个图书管理系统,能实现图书的借书还书操作、管理后台图书信息、管理用户信息 Why 能够方便快捷的实现图…

程序员奶爸用树莓派制作婴儿监护仪:哭声自动通知,还能分析何时喂奶

作者 | Fabio Manganiello译者 | 弯月,责编 | 杨碧玉头图 | CSDN 下载自东方 IC来源 | CSDN(ID:CSDNnews)首先,告诉大家一个好消息,我当爸爸了!我不得不暂停一下我的项目来承担一些育儿的重任。…

python快速小教程

http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html

web标准的投资回报

web标准的投资回报(ROI)作者:阿捷 2004-7-6 0:17:49原文作者:D. Keith Robinson 原文出处:asterisk 原文发表时间:2004年6月1日 用web标准开发能够带来实际利益,这一点还有人怀疑吗? 如果有,…

使用javascript让项目支持热插拔

2019独角兽企业重金招聘Python工程师标准>>> 突然想起之前做过的一个小项目,项目虽小,需求却不小,要求解析特定格式的字符串,并且特定格式并非一成不变,想要一套系统能够支持解析多变的规则且更改规则时不能…

设计模式:状态模式(State Pattern)

作者:Wang Juqiang 创建于:2012-07-16 出处:http://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html 收录于:2013-03-01 结构图 意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 适用性…

拼命学的编程,你却可能错过一个亿!

先来看 2 则新闻:近日 AI 圈最火的新闻当属“AI独角兽依图科技上市”,“AI四小龙”先后开启了上市之路,继旷视科技、云从科技分别谋求港股、A股上市后,依图科技也加入了 IPO 队伍。国内 AI 科技公司的发展,也标志着国家…

web标准的商业价值

web标准的商业价值作者:阿捷 2004-7-3 0:37:26原文来自:adaptivepath.com 作者介绍:Jeffrey Veen是AdaptivePath.com的合伙人之一,专门研究网页设计新技术,你可以在他的个人站点veen.com上学到更多知识。 自从开始we…