作家
登录

iOS代码里逻辑分支的处理

作者: 来源: 2017-11-20 12:12:30 阅读 我要评论

Sequence

Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践


我们大年夜致上可以将代码按履行方法分化为三类:Sequence,Selection,Iteration。

这种方法在 switch 的基本之上再封装了一层函数调用,将分支的处理写进函数签名琅绫擎,好处很明显,当你新增 EUserLoginStatusKickedOut case 的时刻,只要更改 matchUserStatusLoggedIn 函数,新增一个参数:

Sequence即为按前后次序依次履行,大年夜第一行按序一向履行到第 n 行。比如:

  1. NSString *name = @"default"; //definition 
  2. name = @"peak"; //assignment 
  3. NSLog(@"name is %@"name); //send message 

3 行代码包含 Definition,Assignment,Send Message 不合类型的指令,但他们被运行的时刻作为一个整体是按照 Sequence 模式依次履行。

Selection

Selection即为前提模式,说的简单一点就是平常我们写代码时所用的 if else,switch。这是我们代码的逻辑产生分支的处所,也是这篇文┞仿的主题。记得之前读到过一句话,大年夜意说是当我们想要重构代码的时刻,if else 总会是个好的着手点,或者说 if else 是我们代码最轻易掉足的处所。

按我小我懂得,逻辑分支之所以轻易掉足在于两点。

其一是所依附的前提不肯定,或者不稳定。比如:

  1. if ([users objectAtIndex:0] == currentUser) { 
  2.     ... 

看似简单的前提代码 [users objectAtIndex:0] == currentUser 会在各类情况下掉足,比如 users 傍边没有任何元素会产生越界,比如 users 已被释放导致内存拜访异常,同样的情况也会产生在 currentUser 身上,一个前提语句所包含的状况越多,掉足的可能性也就越大年夜。

其二是漏掉某个前提分支。比如:

  1. typedef enum : NSUInteger { 
  2.   EUserLoginStatusLoggedIn, 
  3.   EUserLoginStatusLoggedOut, 
  4.   EUserLoginStatusKickedOut, 
  5. } EUserLoginStatus; 
  6.  
  7. EUserLoginStatus userStatus; 
  8. ... 
  9. if (userStatus == EUserLoginStatusLoggedIn) { 
  10.     ... 
  11. else if (userStatus == EUserLoginStatusLoggedOut) { 
  12.     ... 

比瘸琅绫擎代码忘记处理 EUserLoginStatusKickedOut, 当然如不雅代码是同一小我所写,一般不会漏掉。但如不雅代码交由后面的人保护,EUserLoginStatus 新增了 status,而 if else 的处理有散落的工程的各个角落,忘记处理新的分支就很轻易产生了。

Iteration

Iteration产生在我们须要轮回或多次处理某些数据的时刻,比如我们常见的 while,for 轮回。iteration 有时也会依附某些数据或者某些前提语句,在处理的时刻也会存在 Selection 语句轻易碰到的状况不稳定问题。

之后工程师 B 在 File A 中又加了一种 enum 值 EUserLoginStatusKickedOut,那么此时编译器会以警告的方法,赞助我们检查漏掉的类型,这里的关键在于写 switch 时不要写 default case,不然编译器会认为新增的 enum 值有默认的处理逻辑了。

Sequence,Selection,Iteration 可以概括我们所写的全部代码。个中 Selection 是最轻易掉足的处所,也是我小我日常平凡 review 代码的重点。

Selection 第一个所依附状况不稳定的问题,多留意数据或者对象的生命周期,弗成变性,多线程安然即可。

分支遗留

第二个分支漏掉的问题,出现的概率比大年夜多半人想象的要高,尤其是跟着项目代码的膨胀,工程师的更替。所以大年夜代码层面做一些限制可以有效的避免这一问题出现。

一种常见的做法是针对多分支的逻辑处理,尽量应用 switch 而非 if else,比如工程师 A 先写了如下代码:

  1. // File A 
  2. typedef enum : NSUInteger { 
  3.   EUserLoginStatusLoggedIn, 
  4.   EUserLoginStatusLoggedOut, 
  5. } EUserLoginStatus; 
  6.  
  7. // File B 
  8. EUserLoginStatus userStatus; 

      推荐阅读

      带你深入理解有效的MongoDB索引

    Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践周全集合扫描请求我们拜访所有1,000,000个文档。仅索引surname就削减到20,028个文件 - 实际上是收集中的所有“SMI>>>详细阅读


    本文标题:iOS代码里逻辑分支的处理

    地址:http://www.17bianji.com/lsqh/39022.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)