重构第六章
7.Remove Assignments to Parameters(去除对参数的赋值)
以一个临时变量取代该参数的位置
你的代码对一个参数进行赋值作用
Example:
int disCount(int inputVal, int quantity, int yearToDate){
if(inputVal>50) inputVal -=2;
return inputVal;
}
Analyse:
在函数中去除对参数的修改、赋值,因为这样使得程序是否修改到参数本体位置让人搞不清楚(即传值、传址导致不同的问题)。
所以尽量减少函数对参数的修改,这可以养成一个习惯,有关通过返回值赋值的,定义一个res变量,返回需要的值。如果需要有多个返回值,我以为还是使用传址、引用来进行操作
End:
int disCount(int inputVal, int quantity, int yearToDate){
int res = inputVal;
if(inputVal>50) res -=2;
return res;
}
8.Replace Method With Method Object(函数对象取代函数)
将这个函数放在单独对象中,如此一来局部变量就就变成了对象内的值域,然后你可以在同一个对象中将这个大型函数分解成为数个小型函数
你有一个大型函数,由于其中临时变量泛滥导致你无法使用Extract Method
Example:
class Order...
double price() {
double primaryBasePrice;
double secondaryBasePrice;
double tertiaryBasePrice;
...
}
Analyse:
使用Replace Method With Method Object(函数对象取代函数)可以使得Eetract Method(提炼函数)的进行无比的顺畅,因为你将临时变量消除掉,使之作用域获得了一定的扩大,使得同类的方法可以不通过传值就获得变量的值,完成必要的运算。
不过,如果过度使用这个方法,会不会使得程序在一定程度上变得臃肿,出现过度的委托,使得程序结构不再清晰,所以使用也要因情况而定
Example:
class Order...
double price() {
double primaryBasePrice;
double secondaryBasePrice;
double tertiaryBasePrice;
...
}
End:
定义一个相当于数据类的BasePrice存在
class BasePrice{
public:
BasePrice(double primaryBasePrice, double secondaryBasePrice, double tertiaryBasePrice)
:m_primaryBasePrice(primaryBasePrice),
m_secondaryBasePrice(secondaryBasePrice),
m_tertiaryBasePrice(tertiaryBasePrice) {
}
double GetPrice(){
//primaryBasePrice、secondaryBasePrice、tertiaryBasePrice的计算
}
private:
double m_primaryBasePrice;
double m_secondaryBasePrice;
double m_tertiaryBasePrice;
}
class Order...
double price() {
return new BasePrice(primaryBasePrice,secondaryBasePrice,tertiaryBasePrice)->GetPrice();
}
Conclusion:
Replace Method With Method Object(函数对象取代函数)可以使得程序使用其他重构手法变得更加的简单,不过也是因为如此,这种方法对程序的影响要更大一些,使用过多,容易使得程序更加的冗杂,适得其反。
所以,要看清实际情况,使用Replace Method With Method Object(函数对象取代函数),同时在重构之后,不能放松,需要使用其他的方法辅助,使得程序结构清晰,减少委托,使得重构达到预期目的
注意
重构必须在有单元测试的情况下,保证之前的功能修改后不收影响。切记!!!
网友评论