Decompose Conditional(分解条件式 )

有一个复杂的(if-then-else)语句。

从if-then-else三个段落中分别提炼出独立的函数

f(date.before(SUMMER_START) || date.after(SUMMER_END))
    charge=quantity*_winterRate+_winterServiceCharge;
else
    charge=quantity*_summerRate;
==>
if(notSummer(date))
    charge=winterCharge(quantity);
else
    charge=summerCharge(quantity);

 动机

程序之中,大型函数会使代码可读性下降,逻辑复杂的代码更加难以阅读。
应该将它分解成多个独立的函数,根据每小块的功能命名函数,将原来对应的代码换成函数调用,从而清晰的表达自己的意图。
将每一个分支条件分解形成新函数,还可以突出条件逻辑,更清楚的表明分支的作用。

作法

1. 将if段落提炼出来,构成一个独立的函数。

2. 将then段落和else段落都提炼出来,各自构成一个独立的函数。

3. 如果发现嵌套的条件逻辑,应该先看看是否可以使用Replace Nested Conditional with Guard Clauses[以卫语句取代嵌套条件式]如果不行才开始分解其中的每个条件。

 

假设我要计算购买某样商品东西的总价(总价=数量*单价),而这个商品在夏季和冬季的价格是不同的:

if(date.before(SUMMER_START) || date.after(SUMMER_END))
    charge=quantity*_winterRate+_winterServiceCharge;
else
    charge=quantity*_summerRate;
我把每个分支的判断条件都提炼到一个独立函数中,如下所示

if (notSummer(date))
charge = winterCharge(quantity);
else charge = summerCharge (quantity);
private boolean notSummer(Date date) {
return date.before (SUMMER_START) || date.after(SUMMER_END);
}
private double summerCharge(int quantity) {
return quantity * _summerRate;
}
private double winterCharge(int quantity) {
return quantity * _winterRate + _winterServiceCharge;
}

通过这个代码你可以看出,整个重构带来的清晰性。实际工作中,我会逐步进行每一次提炼,并在每次提炼之后编译并测试。

像这样的情况下,许多程序员都不会去提炼分支条件。因为这些分支条件往往非常短,看上去似乎没有提炼的必要。但是,尽管这些条件往往很短,在代码意图和代码自身之间往往存在不小的差距。哪怕在上面这样一个小小例子中,notSummer(Date)这个语句也能够比原本的代码更好地表达自己的用途,对于原来的代码,我必须看着它,想一想,才能说出其作用。当然,在我们这个简单例子中,这并不困难。不过,即使如此,提炼出来的函数可读性也更高一些,它看上去就像一段注释那样清楚而明白。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值