目录
第6章 重新组织函数
- ExtractMethod(提炼函数)
- InlineMethod(内联函数)
- InlineTemp(内联临时变量)
- ReplaceTempwithQuery(以查询取代临时变量)
- IntroduceExplainingVariable(引入解释性变量)
- SplitTemporaryVariable(分解临时变量)
- RemoveAssignmentstoParameters(移除对参数的赋值)
- ReplaceMethodwithMethodObject(以函数对象取代函数)
- SubstituteAlgorithm(替换算法)
重新组织函数
提炼函数
- 将一段可以被组织在一起并可以独立出来的代码放进一个独立函数中,并让函数名称解释该函数的用途。
内联函数
- 一个函数的本体与名称同样清楚易懂,那么在函数的调用点插入函数本体,然后移除该函数。
// 整容前
private int GetRating(){
return (IsTopFive()) ? 1 : 0;
}
private bool IsTopFive(){
return mRanking >5;
}
//整容后
private int GetRating(){
return mRanking >5 ? 1 : 0;
}
内联临时变量
//整容前
int heroHp = Hero.currentHp;
return heroHp >= 0;
//整容后
return Hero.currentHp >= 0;
以查询代替临时变量
- 把一个由临时变量保存结果的表达式提炼到一个独立函数中,然后将这个变量的引用点换成该函数。
//整容前
private float GetTotalPrice(){
float basePrice = quatity * itemPrice;
if(basePrice > 10) return basePrice * 0.9f;
return basePrice;
}
//整容后
private float GetTotalPrice(){
if(GetBasePrice() > 10) return GetBasePrice()* 0.9f;
return GetBasePrice();
}
private float GetBasePrice(){
return quatity * itemPrice;
}
引入解释性变量
- 将一个复杂的表达式的结果放进一个临时变量。
//整容前
private float GetTotalPrice(){
return quatity * itemPrice - Math.max(0,quatity - 5) * itemPrice * 0.5f +
Math.min(quatity * itemPrice * 0.2f, 1000);
}
//整容后
private float GetTotalPrice(){
float basePrice = quatity * itemPrice;
float baseQuantity =Math.max(0,quatity - 5) * itemPrice * 0.5f ;
float shiping = Math.min(basePrice * 0.2f, 1000);
return basePrice - baseQuantity + shiping ;
}
分解临时变量
- 每个变量只承担一个责任
// 整容前
float price = quatity * itemPrice;
System.Console.Write(price);
// price变量承担了两个 责任
price = quatity * itemPrice * 0.9f;
System.Console.Write(price);
// 整容后
float basePrice = quatity * itemPrice;
System.Console.Write(basePrice );
float discountPrice = quatity * itemPrice * 0.9f;
System.Console.Write(discountPrice );
移除对参数的复制
- 当参数是引用类型时,直接修改会导致上层的也会修改
// 整容前
private int Discount(int inputVal, int quantity , int yearToDate){
if(inputVal > 10) inputVal -= 1;
if(quantity > 10) inputVal -= 2;
if(yearToDate > 10) inputVal -= 3;
return inputVal;
}
// 整容后
private int Discount(int inputVal, int quantity , int yearToDate){
int result = inputVal ;
if(inputVal > 10) result -= 1;
if(quantity > 10) result -= 2;
if(yearToDate > 10) result -= 3;
return result ;
}
以函数对象取代函数
- 跟提取方法到另一个类有类似的思想,只是以对象存在
//整容前
class Account {
int gamma(int inputVal, int quantity, int yearToDate) {
int importantValue1 = (inputVal + quantity) + delta();
int importantValue2 = (inputval * yearToDate) + 100;
if((yearToDate - importantValue1) > 100)
importantValue2 -= 20;
int importantValue3 = importantValue2 * 7;
return importantValue3 - 2 * importantValue1;
}
}
//整容后
class Account {
int gamma(int inputVal, int quantity, int yearToDate) {
return new gamma(this, inputVal, quantity, yearToDate).compute;
}
}
替换算法
- 你想把某个算法替换成另一个算法时,将函数本体替换成另一个算法。
网友评论