设为首页 加入收藏

TOP

代码重构(一):函数重构规则(二)
2017-10-10 12:16:23 】 浏览:9743
Tags:代码 重构 函数 规则
ace Temp with Query规则的一个特定Demo,接下来我们要对getPrice()函数使用Replace Temp with Query规则进行重构。

  

 

 

对上面的小的demo创建对应的测试用例是少不了的,因为我们要根据测试用例还测试我重构后的代码是否一致,下方截图就是该代码的测试用例以及输出结果,具体如下所示。

   

 

2.接下来就是对Procut类中的getPrice()函数进行分析并重构了。在getPrice()函数中的第一个红框中有一个basePrice临时常量,该常量有一个较为复杂的赋值表达式,我们可以对其使用Replace Temp with Query进行重构,可就是创建一个函数来返回该表达式的值。第二个红框中的discountFactor临时变量被多次使用,我们可以对其通过Replace Temp with Query规则进行重构,具体重构后的代码如下所示。

由重构后的代码容易看出,上面我们提到的临时常量或者变量都不存在了,取而代之的是两个查询方法,对应的查询方法返回的就是之前消除的临时变量或常量的值。

   

 

四、Inline Temp ---内联临时变量:与上面的Replace Temp with Query相反

当临时变量只被一个简单的表达式赋值,而该临时变量妨碍了其他重构手法。此时我们就不应该使用Replace Temp with Query。之所以有时我们会使用到Inline Temp规则,是因为Replace Temp with Query规则使用过度造成的情况,还是物极必反,使用Replace Temp with Query过度时,就需要使用Inline Temp进行修正,当然Inline Temp的示例与Replace Temp with Query正好相反,在此就不做过多的赘述了。

 

五、Introduce Explaining Variable---引入解释性变量:将复杂的表达式拆分成多个变量

当一个函数中有一个比较复杂的表达式时,我们可以将表达式根据功能拆分成不同的变量。拆分后的表达式要比之前未拆分的表达式的可读性更高。将表达式拆分成相应的临时变量,也就是Introduce Explaining Variable,如果临时变量被多次使用的话,我们还可以尝试着使用Replace Temp with Query规则去除临时变量,也就是将临时变量换成查询函数。

1.在下方Product类中的getPrice()方法中返回了一个比较长的表达式,第一眼看这个函数感觉会非常的不舒服。因为它返回的表达式太长了,而且可读性不太好。在这种情况下就很有必要将该表达式进行拆分。

   

 

2.接下来就可以使用Introduce Explaining Variable规则,引入解释性变量。顾名思义,我们引入的变量是为了解释该表达式中的一部分的功能的,目的在于让该表达式具有更好的可读性。使用Introduce Explaining Variable规则,就相当于为该表达式添加上相应的注释。下方截图就是使用 Introduce Explaining Variable规则进行重构后的结果。

   

 

3.引入临时变量是为了更好的可读性,如果临时变量所代表的表达式多次使用,我们就可以对上述函数在此使用Replace Temp with Query规则进行重构。也就是去除经常使用而且表达式比较复杂的临时变量,下方代码段是对上述函数进行Replace Temp with Query重构,去掉临时变量,再次重构后的结果如下所示。

    

 

六、Split Temporary Variable-----分解临时变量:一心不可二用

什么叫分解临时变量的,具体说来就是在一个函数中一个临时变量不能做两种事情,也就是一个临时变量不能赋上不同意义的值。如果你这么做了,那么对不起,请对该重复使用的临时变量进行分解,也就是说你需要创建一个新的临时变量来接收第二次分配给第一个临时变量的值,并为第二个临时变量命一个确切的名字。

下方第一个函数是重构前的,可以看出temp被重复的赋值了两次的值,如果这两个值关系不大,而且temp不足以对两个值的意思进行说明。那么就说明该段代码就应该被重构了。当然,重构的做法也是非常简单的,只需要术业有专攻即可,各司其职,并且为每个临时变量命一个合适的名字即可。具体做法如下所示。

 

 

 七、Remove Assignments to Parameters----移除对参数的赋值

“移除对参数的赋值”是什么意思呢?顾名思义,就是在函数中不要对函数参数进行赋值。也就是说你在函数的作用域中不要对函数的参数进行赋值(当然,输入输出参数除外),当直接对函数的参数进行修改时,对不起,此时你应该对此重构。因为这样会是参数的原始值丢失,我们需要引入临时变量,然后对这个临时变量进行操作。

1.下方这个discount()函数就做的不好,因为在discount()函数中直接对非inout参数inputVal进行了修改并且返回了,我们不建议这样做。遇到这种情况,我们需要使用Remove Assignments to Parameters规则对下方的函数进行重构。

   

  

2.当然重构的手法也特别简单,就是需要将上面的inputVal使用函数的临时变量进行替代即可,下方就是重构后的函数。

   

 

八.Replace Method with Method Object----以函数对象取代函数

当一个特别长的函数,而且函数中含有比较复杂的临时变量,使用上述那些方法不好进行重构时,我们就要考虑将该函数封装成一个类了。这个对应的类的对象就是函数对象。我们可以将该场函数中的参数以及临时变量转变成类的属性,函数要做的事情作为类的方法。将函数转变成函数类后,我们就可以使用上述的某些方法对新的类中的函数进行重构了。具体做法请看下方示例。

1.下方示例中的discount函数有过多的参数(当然,现实项目工程中参数比这个还要多),并函数中含有多个临时变量,假设函数功能比较复杂,而且比较长。下方示例对该函数使用上述那些规则进行重构会比较复杂,此时我们就可以将该函数抽象成一个类。

   

 

2.重构的第一步就是将上述discount()函数抽象成Discount类。在Discount类中有六个属性,这六个属性分别对应着discount()函数的不同参数。除了添加参数属性外,我们在函数类提取时还添加了一个Account的委托代理对象。该委托代理对象是为了在Discount类中访问Account类中依赖的数据,下方是第一次重构后的代码。

   

 

3.接着,我们就可以在新的Discount类中的compute()方法中使用我们上述介绍的规则进行重构。对compute()方法进行分析,我们发现importandValue等属性是可以通过Replace

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇窥探Swift编程之错误处理与异常抛.. 下一篇Swift开发第十一篇——Designated..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目