来自 电脑系统 2019-09-19 12:05 的文章
当前位置: 金沙澳门官网网址 > 电脑系统 > 正文

什么防止if,iOS重构施行

刚在观察这几个标题的时候。我不假思考的回了一句if return不就行了嘛。后来才晓得,那些题材的问的不是那样简单。确实if return是二个很好的编码习贯。可是当大家蒙受一些政工场景例如:

品类简单介绍和MVP情势重构

- needDoSomethingWithErrorCode:(NSInteger)errorCode{ if (errorCode == 0) { //任务1 }else if (errorCode == 2){ //任务2 }else if (errorCode == 3){ //任务3 }..} 

项目简单介绍

金沙澳门官网网址 ,要么大家兴许这么写

首先简介一下项目意况。大家原来项目标架构是比较正式的MVC格局,也是苹果官方推荐的架构情势。Model层用来表示实体类,View层肩负分界面展现和传递UI事件,Controller层担任大多数的政工逻辑。除却,对部分公共的可复用的逻辑,我们抽象出Service层,提须要Controller使用,别的网络层也单身出来。下图比较清楚地展现了完整架构

- needDoSomethingWithErrorCode:(NSInteger)errorCode{ switch (errorCode) { case 0: //任务1 break; case 1: //任务2 break; case 2: break; //任务3 ... default: break; }}

金沙澳门官网网址 1

那样写有失常态吧?满足日常的支出是从未难点的。可是当须求加贰个分支逻辑就务须得去if else结构中改代码,那样不实惠程序扩大,同不日常候也要命难保证,纵然事情复杂到早晚的档案的次序那块代码可能没有办法去重构了。

全体架构

回去刚才拾分题目哪些制止if else,笔者以为那些主题材料应该有相当的多的答案。笔者的if return不见得就是大错特错的……,可是那么些标题应当是问大家一种架构观念。

MVC格局的标题

- needDoSomethingWithErrorCode:(NSInteger)errorCode{ [self dealWithErrorCode:errorCode];}- dealWithErrorCode:(NSInteger)errorCode{ NSString *methodString = @"dealWithErrorCode"; methodString = [methodString stringByAppendingPathExtension:[NSString stringWithFormat:@"%0.0ld",errorCode]]; SEL method = NSSelectorFromString(methodString); if ([self respondsToSelector:method]) { [self performSelector:method withObject:nil]; }else{ [self dealWithNoDefineErrorCode:errorCode]; }}//处理错误类型0- dealWithErrorCode0{ NSLog(@"//处理错误类型0");}//处理错误类型1- dealWithErrorCode1{ NSLog(@"//处理错误类型1");}//未定义的方法类型- dealWithNoDefineErrorCode:(NSInteger)errorCode{ NSLog(@"//未定义的方法类型");}

MVC框架结构作为苹果官方推荐的架构格局,把数量Model和显现View通过Controller层隔开开,在品种规模十分小的时候是贰个不错的选项。随着项目复杂性的升高,大家也日益感到到到MVC格局的弊病,主要浮以往底下多少个地点

诸如此比的写法的好处正是从此要新扩展新的秘技就能够,无需去管理needDoSomethingWithErrorCode其一函数。通过反射和总结的工厂形式,也许是战术方式去设计大家的代码。能够让咱们防止使用部分重叠的if else

Controller层职分过多,Model和View层太轻便Controller处管事人务逻辑,管理UI更新,管理UI事件,同步Model层,我们差不离全部的代码都写在了Controller层。设计形式里有单纯格局原则,你看这里的Controller层已经足足有种种任务了。

政工逻辑和UI混杂在同步,难以编写单元测量试验那一点一方面是因为Cocoa框架里的Controller层,便是我们最熟谙的UIViewController和View是先天耦合的,比较多view的生命周期方法如viewWillAppear都设有于VC,另一方面大家广大时候也习贯于把UI操作以致初叶化操作放在VC里,导致UI和业务逻辑混杂在一道。当您想对事情逻辑编写单元测量试验的时候,瞧着专门的职业逻辑代码里夹杂的UI操作,就明白哪些叫步履维艰——数据足以Mock,UI是不容许被Mock的。

业务逻辑代码多量存在于Controller层,维护困难当七个分界面成效比较复杂的时候,大家具备的逻辑代码都会积聚在Controller中,举个例子大家本来的WebViewController的代码就多达5000行,在这种情况下维护代码大概是临深履薄。

MVP情势的重构

对于Controller层过于臃肿的主题材料,MVP格局则能较好地消除那几个主题素材——既然UIViewController和UIView是耦合的,索性把那二者都归为View层,业务逻辑则单独存在于Presenter层,Model层保持不改变。下图相比较清除得显得了MVP情势的构造

金沙澳门官网网址 2

MVP格局简单介绍

大家来看一下MVP方式能还是无法化解MVC方式存在的标题

Controller层任务过多,Model和View层太轻巧在MVP方式下,Controller层和View层已经济合作并为View层,专责处理UI更新和事件传递,Model层照旧作为实体类。原来写在ViewController层的职业逻辑已经搬迁到Presenter中。MVP形式较好地化解了Controller层职分过多的标题。

事务逻辑和UI混杂在共同,难以编写单元测量检验Presenter层首要处管事人情逻辑,ViewController层达成Presenter提供的接口,Presenter通过接口去革新View,这样就完成了事情逻辑和UI解耦。借使大家要编写制定单元测验的话,只要求Mock二个对象完结Presenter提供的接口就好了。MVP形式较好地消除了UI和逻辑的解耦。

事务逻辑代码多量留存于Controller层,维护困难通过把业务逻辑迁移到Presenter层,Controller层的窘况如同收获了化解,然而只要某些供给逻辑较为复杂,单纯的把作业逻辑迁移化解不了根本的难题,Presenter层也会存在大量业务逻辑代码,维护困难。那些主题素材,大家下边商琢磨什么消除。

MVC格局立异——Router方式

此间根本是牵挂分界面间跳转的代码怎么样重构,附图一张

金沙澳门官网网址 3

Router模式

实例深入分析

前面我们提到,MVP方式就算能一下子就解决了多数MVC情势下存在的主题材料,但对此比较复杂的急需,照旧会设有逻辑过于复杂,Presenter层也油可是生麻烦保证的主题素材。下边大家就经过二个其实的例子,来探视面临纷纷的业务逻辑,我们理应怎么着去设计和贯彻。

多数参差不齐的供给,在早期都是从五个简便的景色,一步步往上加码效果与利益。在那个进度中,假如不到处的进展优化和重构,到最后就成了所谓的"独有上帝能看懂的代码"。说了如此多,步向正题,来看那些需求。

V1.0 单文件上传

兑现三个归纳的单文件上传,文件的目录存款和储蓄在数据库中,文件存款和储蓄在App的沙箱里面。这么些相应对此有经历的客商端开荒者来讲是小菜一碟,相比较简单也易于达成。我们可以把那几个供给大概拆分成以下多少个子须要

开始化上传View

更新上传View

点击上传按键事件

数据库中获得上传模型

倡议HTTP诉求上传文件

自己商议互连网状态

如上几项借使应用守旧的MVC形式,完毕起来如下图所示

金沙澳门官网网址 4

MVC

小编们能够看来上述供给为主都一贯在UploadViewController中贯彻,近来需求依然比较轻易的状态下边,还是勉强尚可,也不供给越来越多的斟酌。如若运用MVP的格局开展优化,如下图所示

金沙澳门官网网址 5

MVP.png

以往UploadPresenter担任管理上传逻辑了,而UploadViewController潜心于UI更新和事件传递,全体的结构进一步清晰,今后维护代码也会相比较便利。

V2.0 多文件上传

须求来了!供给在原先的基础上支撑多文件上传,意味着大家多了二个子必要

7.维护上传模型队列

很显著,我们须求在UploadPresenter中追加贰个掩护上传队列的效果与利益,最初本身也确实是那样达成的,但是出于文件上传要求监听的风云相当多,回调也比较频仍,直接在Presenter中继续写这么的逻辑代码,已经成倍扩充了代码的复杂。

为此经过一番想想,作者思索把文件上传那有的的逻辑单独提抽出一层FileUploader,而UploadPresenter只承担掩护FileUploader的队列以及检查互联网状态。具体的达成如下所示。

金沙澳门官网网址 6

MVP2.png

咱们能够看来,分层之后的构造又尤为清楚了,每一层的任务都相比较单纯,最近看起来一切OK!

V3.0 多来自上传

原本作者们的上传文件的源于是存在于App沙箱里的,大家透过数据库查询能够找到那几个文件的目录和路子,进而得到到这几个文件举办上传。未来万恶的须要又来了,须要支持上传系统相册中获取的图片/录像。

8.支持系统相册和App沙箱中获得文件

到这边或者有些读者已经有一些头大了,若无留神商讨,很大概从此处就走向了代码品质崩溃的道路。

以此时候,大家就要思量,他们是多来自,但是对于FileUploader来讲,它实在不爱戴模型的来源,它只需求得到到模型的二进制流。于是,我们得以抽象出一个BaseModel,提供三个stream只读属性,三种来自分别承袭BaseModel,各自重载stream只读属性,完结和睦的结构文件stream的艺术。对于FileUploader来说,它只持有BaseModel就可以,那就是连续和多态的二个突出的利用情况。

借使接二连三还或然有更加的多来自的文本,例如互联网文件(先下载再上传?),也只要求后续持续BaseModel,重载stream就能够,对于FileUploader和它的具备上层来讲,一切都以透明的,无需实行退换。经过如此的宏图,我们的代码的可维护性和可扩大性又好了。上面是架构图。

金沙澳门官网网址 7

MVP3.png

V4.0 多格局上传

在HTTP文件上传中,大家能够直接上传文件的二进制流,这种就供给服务端做一定的支撑。但进一步常用和帮忙广大的做法是运用HTTP表单文件传输,即组装HTTP央浼的body时使用multipart/form-data的正统组装,传输数据。于是,我们又多了二个需要:

9.援助表单传输和流传输

思路和刚刚的多来自上传差不离,大家把上面包车型地铁二种来源的模子,即FSBaseM和ABaseM抽象为父类,父类含有各自的文件二进制数据的肤浅,子类分别落成二进制直接组装流,和按multipart/form-data格式组装流,达成如下图。

金沙澳门官网网址 8

MVP4.png

V5.0 支持FTP/Socket上传

刚才大家的文本上传,底层的商业事务是基于Http,此时我们供给扶助FTP/Socket合同的传导,应该咋办?

10.支持HTTP/FTP/Socket

由此地点的考虑,相信你势必明白该如何是好了。

对比

终极,我们把当前的须求全都整理一下

初阶化上传View

履新上传View

点击上传开关事件

数据库中收获上传模型

倡议HTTP哀告上传文件

反省互连网状态

保卫安全上传模型队列

补助系统相册和App沙箱中拿走文件

支撑表单传输和流传输

支持HTTP/FTP/Socket

咱俩看看,倘使分别选取MVC、MVP_V1、MVP_V2、MVP_V3、MVP_V4、MVP_V5,来兑现近日的13个要求,大家的代码大概会布满在哪几层。

金沙澳门官网网址 9

优化后的架构格局之间的可比

孰优孰劣一望而知。假诺应用最原始的MVC形式以来,保守估摸ViewController代码量至少3K行以上。

总结

应用MVP的设计方式,逻辑和UI操作解耦

本文由金沙澳门官网网址发布于电脑系统,转载请注明出处:什么防止if,iOS重构施行

关键词: