重构第十章
8.Replace Parameter with Methods(以函数取代参数)
对象调用某个函数,并将所得结果作为参数,传递给另一个函数。而接受该参数的函数也可以调用前一个函数。让参数接受者去除该项参数,并直接调用前一个函数。
Example:
public double getPrice() {
int basePrice = _quantity * _itemPrice;
int discountLevel;
if (_quantity > 100) discountLevel = 2;
else discountLevel = 1;
double FinalPrice = discountedPrice(basePrice, discountLevel);
return FinalPrice;
}
private double discountedPrice(int basePrice, int discountLevel) {
if(discountLevel == 2) return basePrice * 0.2;
else return basePrice * 0.05'
}
Analyse:
discountedPrice函数包含有两个参数basePrice和discountLevel为了使的discountedPrice有其他途径获得这两个参数,我将getPrice中的代码提炼成为函数,可以通过discountedPrice函数直接调用。
private int getBasePrice() {
return _quantity * _itemPrice;
}
private int getDiscountLevel() {
if (_quantity > 100) return 2;
else return 1;
}
public double getPrice() {
int basePrice = getBasePrice();
int discountLevel = getDiscountLevel();
double FinalPrice = discountedPrice(basePrice, discountLevel);
return FinalPrice;
}
之后再去除discountedPrice的参数得到:
private double discountedPrice() {
if(getDiscountLevel() == 2) return getBasePrice() * 0.2;
else return getBasePrice() * 0.05;
}
public double getPrice() {
return discountedPrice();
}
End:
public double getPrice() {
if(getDiscountLevel() == 2) return getBasePrice() * 0.2;
else return getBasePrice() * 0.05;
}
Conclusion:
过长的参数列表会增加程序阅读者的理解难度,因此我们应该尽可能的缩短参数列的长度。
Replace Parameter with Methods(以函数取代参数)使得函数可以通过其他的途径获得参数值,从而减少参数的个数。
注意
重构必须在有单元测试的情况下,保证之前的功能修改后不收影响。切记!!!
网友评论