重构-改善既有代码的设计之重新组织函数

Extract Method 提炼函数

  • 1、函数过长时或者一段代码需要进行注释时提炼出来;
  • 2、函数的复用度也会较大;
  • 3、不同的函数做的事情不同,通过名字就可以看出;
  • 4、如果提炼出来的函数会涉及多个变量的改动,使用Split Temporary Variable后再进行提炼;或者使用Replace Temp with Query;

 

Inline Method:内联函数

  • 1、跟Extract Method刚好相反;
  • 2、一个函数的本体与名称同样清楚易懂,可以去掉该函数,直接使用代码;

public int getRating() {

int numberOfLateDelivery = 5;

return moreThanFiveLateDeliveries(numberOfLateDelivery) ? 2 : 1;

}

 

private boolean moreThanFiveLateDeliveries(int numberOfLateDelivery) {

return numberOfLateDelivery > 5;

}

  • 3、有很多不合理的小函数,可以将其重新内联到一个大函数后,再提取合理的小函数;
  • 4、使用了太多的间接层,简单委托;

需要将其内联后,去掉无效的间接层;

  • 5、不能内联的几种情况;

有子类继承了的函数、递归调用、多返回点、内联至另一个对象中而该对象并无提供访问函数;

 

Inline Temp:内联临时变量;

  • 1、一个临时变量只被使用了一次,则去掉该临时变量,将其替换为表达式;

double basePrice = anOrder.basePrice;

return (basePrice > 100);

 

return anOrder.basePrice > 100;

 

Replace Temp with Query:以查询取代临时变量

  • 1、将一个临时变量的右侧表达式提取出来成为一个函数;

double basePrice = quality * itemPrice;

if (basePrice > 100) {

return basePrice * 0.95;

} else {

return basePrice * 0.98;

}

变成

if (basePrice(quality, itemPrice) > 100) {

return basePrice(quality, itemPrice) * 0.95;

} else {

return basePrice(quality, itemPrice) * 0.98;

}

 

private double basePrice(Bigdecimal quality, double itemPrice) {

return quality * itemPrice;

}

  • 2、如果临时变量被赋值超过一次,则使用Split Temporary Variable;
  • 3、操作之前,将临时变量前先加上final,检测是否只赋值了一次;

 

Introduce Explaining Variable:引入注释性变量

  • 1、将复杂表达式(或其中一部分)的结果放入一个临时变量中,此临时变量来表达此表达式的含义;

if ((platform.toUpperCase().indexOf("MAC") > -1) && (browser.toUpperCase().indexOf("IE") > -1) && wasInitialized() && resize > 0) {

//doSomething

}

变成:

final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;

final boolean isIEBrowser = browser.toUpperCase().indexOf("IE") > -1;

final boolean wasResized = resize > 0;

 

if (isMacOs && isIEBrowser && wasInitialized() &&wasResized) {

//doSomething

}

  • 2、Introduce Explaining Variable方式经常可以使用Extract Method替代,因为临时变量只在当前方法中才起作用,而提炼方法则可以被其他方法复用;
  • 3、当使用Extract Method提炼方法比较麻烦时,可以使用Introduce Explaining Variable;
  • 4、可以使用其来帮助理解代码逻辑;

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值