设为首页 加入收藏

TOP

代码重构(四):条件表达式重构规则(二)
2017-10-10 12:15:43 】 浏览:8571
Tags:代码 重构 条件 表达式 规则
人建议,在平时开发中尽量的要少使用标记变量。不到万不得已,不要在你的代码中引入标记变量。如果有,尝试着去除标记变量。

   

标记变量一般是可以使用其他语句进行替换的,可以使用break、return、continue等等,这个要根据具体情况而定。总之,代码中有标记变量不是什么好的事情。下方代码段就是对上述代码去除标记变量的重构。重构后的代码如下所示,当然还有好多其他去除的方法,此处仅仅给出了一种。

   

 

五、Replace Nested Condition with Guard Clauses(以卫语句取代嵌套的条件)

条件表达式的嵌套是令人讨厌的东西。代码中有多层if-else嵌套会降低代码的可读性以及可维护性,如果此时在加上for循环等等其他逻辑语句,想想都可怕。这种业务逻辑较强的代码要慎重对待。尽量不要将if-else进行嵌套,因为嵌套的if-else确实不好理解,如果在出现bug时,更是不好定位bug。要记住,你写的代码不是给机器看的,而是给人看的,这一点非常重要。不光是代码编写规范,也尽量不要使用理解起来比较费劲的语句来实现你的逻辑。

下方我们将创建一种场景,人为的创建多个if嵌套的情况。下方的demo理解起来应该不难,第一个数组中存储的是第二个字典的key,第二个字典中存储的value是下一个字典也就是第三个字典的key,以此类推。将我们在使用从相应的字典中取出的value做为key再次取值时,我们要保证该值不为nil,所以我们要进行if-let判断。if-let所表示的意思是在取值时,如果当前取出的值不为nil,那么就执行if后的语句体,如果为nil,那么就不执行。这样一来,就会出现多层if-let嵌套的情况。

当然,在一些业务逻辑比较复杂的需求中,嵌套的每层if后都跟着不同的表达式,而不仅仅是if-let。因为为了创建这个if嵌套的场景,再次我们使用了if-let嵌套。这么多的if-let嵌套显然不是什么好的事情,所以我们要对此重构。

   

如果多层if嵌套,会出现一种叫做“厄运金字塔”的现象,因为在if左边会出现一个三角号的空间。这可不是什么好的标志,这样的代码结构一般理解起来会比较困难,维护起来也不是那么的理想。所以下方我们要对上述代码进行结构。要去除上面的嵌套模式,我们可以将if后的条件进行翻转,根据具体需求再引入return、break、continue等卫语句。下方是讲条件进行翻转然后引入了continue语句,代码如下:

   

该部分的第二段代码要比第一段代码容易理解的多。经过条件翻转+continue,将上述嵌套的条件语句进行了拆分。拆分成了三个独立的if语句,虽然代码结构不同,但是其实现功能都是一样的。不过上面的解决方案在Swift中并不完美。因为Swift语言是非常优雅的,Swift语言在设计的时候就考虑到了这种情况,所以在Swift 2.0时推出了guard语句。在这种情况下使用guard语句再合适不过了,下方代码段就是使用guard语句进行了重构。

使用guard let声明的变量与guard本身同在一个作用域,也就是说下方代码在guard let中声明的变量可以在for循环中直接使用。guard语句的用法就是如果guard 后方的赋值语句所取出的值为nil,那么就会执行else中的语句,否则就会继续往下执行。在else中一般是break、return、continue等卫语句。这种语法形式很好的对上述糟糕的形式进行了解决,而且还易于理解。

   

 

六、Replace Condition with Polymorphism(以多态取代条件表达式)

在介绍“以多态取代条件表达式”之前呢,首先要理解面向对象中多态是什么,也就是说多态是干嘛的。顾明思议,多态就是类的不同类型的对象有着不同的行为状态。如果在你的条件表达式中条件是对象的类型,也就是根据对象的不同类型然后做不同的事情。在这种情况下使用多态在合适不过了。如果该部分在设计模式中,应该对应着状态模式这一部分。这就是以多态来取代条件表达式。

下方是一个比较简单的示例,这也正是我们要进行重构的示例。在Book类中有三中类型,也就是我们的书有三种,具体每种书是什么这不是该示例的重点。在Book类实例化时,需要为书的对象指定该书的类型(三种类型中的一种)。在Book类中,还有一个核心方法,那就是计算书的价格。在charge()函数中,根据不同的书的种类,给出了不同的价格。当然在Switch中的分支的计算方法在本例中非常简单,但是我们要假设每个分支的计算非常复杂,而且有着多行代码

在这种假设的情况下,下方的条件语句是非常糟糕的,因为庞大的业务逻辑增加了代码维护的成本。在这种情况下我们就可以使用多态来取代复杂的条件表达式。

     

 

 

如果想使用多态,引入其他类是必不可少的,而且每个类中也必须有相应的对应关系。“以多态取代条件表达式”的做法的本质是将不同状态的业务逻辑的处理的代码移到相应的类中。在本示例中,我们要创建三种书籍的价格类,并且将上述case中的“复杂”计算移入到相应的书籍类中。因为每个书籍价格中都会有相应的计算方法,也就是charge()方法,所以我们为这三个书籍价格定义了一个协议(接口或者抽象类),在协议中就给出了charge()函数。然后我们就可以将不同种类的书籍实现该协议,在相应的方法中给出价格计算的代码。具体做法如下所示:

    

引入上述几个类后,在我们的Book中就可以使用多态了。在Book类中添加了一个price字段,这个字段的类型就是我们的Price协议。也就是只要是符合我们的Price协议的对象都可以。然后在Book中也添加了一个charge()方法,在Book中的charge方法做的一件事情就是调用price对象的charge方法。关键的是根据不同的书籍类型创建不同的书籍价格对象。这样一来,我们就把每个分支中的业务逻辑进行了分离,并使用了多态来获取价格。重构后的优点不言而喻。

   

 

今天关于“条件表达式的重构”的规则,当然这不是全部的,只是列举了一些常见的,而且经常使用重构规则。篇幅有限,今天的博客就先到这儿,还会继续更新其他的重构规则。

今天博客中的Demo在github上的分享地址为:https://github.com/lizelu/CodeRefactoring-Swift

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇代码重构(三):数据重构规则 下一篇iOS 疑难杂症 — — UIButton 点..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目