Part2:重新组织函数

介绍

  • 过长函数是造成代码混乱的重要原因之一
  • 将一个过长函数分解为多个小函数,每个函数都有自己的单一职责,并且使它们的名字具有自解释的功能(关键)
  • 简短而命名良好的函数粒度很小,复用机会很大
  • 会使高层函数读起来(调用这些小函数的地方)就像注释,前提是在命名上下点功夫,事实上也必须这样做
  • 在重新组织函数中可能会遇见一些比较容易解决的困难,比如局部变量,参数,返回值问题等等.

提炼函数

  • 将大型函数合理的分解,把分解的代码放进多个函数中,并让函数名称解释该函数的用途
public void makeDinner() {
    //这里有50行代码完成买菜的任务

    //这里有65行代码完成洗菜的任务

    //这里有80行代码是完成做菜的任务  
}
  • 上面的makeDinner()函数中总共有195行代码去完成做饭的任务,如果这么多代码挤到一起不仅很多逻辑不好明白,而且非常容易出错,此时我们可以使用本节的技巧:
public void makeDinner() {
    buyFoods();
    handleFoods();  
    braiseFoods();
}
  • 经过这样的处理是不是清晰了很多,举一反三,我们还可以相应的继续在刚分解出来的三个小函数中继续根据逻辑功能职责分解,这样我们的函数结构就非常清晰了.
    当你面对一个庞大的项目时,你想重构某一部分代码,比如用本节的技巧,那么一个比较好的建议是你先将一些函数inline(还原到调用函数中),然后再重新的分解.

用函数取代产生临时变量的语句

double baseFoodPrice = foodCount * perPrice;
if (baseFoodPrice < 100) {
    return baseFoodPrice * 0.5;
} else {
    return baseFoodPrice * 0.6;
}
->
if (baseFoodPrice() < 100) {
    return baseFoodPrice() * 0.5;
} else {
    return baseFoodPrice() * 0.6;
}

double baseFoodPrice() {
    return foodCount * perPrice;
}
  • 局部变量是一个函数过长的重要原因之一
  • 局部变量在一个过长函数中,它的生命周期的范围是一个烦人的问题(我们必须要去思考它的生命周期的范围,而不能瞬间的明白,虽然思考的时间并不长)
  • 当用函数替代产生临时变量的语句后,消除了生命周期的问题,并且复用性提高,一个类中的所有函数都可以获得这份信息.

引入解释性变量

  • 表达式有可能非常的复杂而且难以阅读
if ((platform.toUpperCase().indexOf("MAC") > -1) && (browser.toUpperCase().indexOf("IE") > 1)) {
    //do something
}
  • 看到上面的代码你能在非常短的时间内明白它的作用吗?下面的代码呢
final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;
final boolean isIEBrowser = browser.toUpperCase().indexOf("IE");
if (isMacOs && isIEBrowser) {
    //do something
}
  • 所以说,在合适的时机引入解释性变量会让又长又臭的条件语句变得非常清晰

使临时变量也遵循单一职责

double temp = 2 * (height + width);
System.out.println("周长:" + temp);
temp = height * width;
System.out.println("面积:" + temp);
  • 上面的代码一个temp(命名其实也足够差劲,但是你如果使一个临时变量有多于一个的责任,合理的命名将变得不可能)进行了两次赋值,这意味着它在一段程序中承担了不止一种职责,这样是非常不好的编程习惯,我们应该这样做.
final double perimeter = 2 * (height + width);
System.out.println("周长:" + perimeter);
final double area = height * width;
System.out.println("面积:" + area);

注意上面的final关键字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值