当我的程序非常年轻时,通常会有很多功能可以做很简单的事情。
当它变老时,我发现将一些类似的函数捆绑在一起更方便,并将旧函数的返回结果分组为“Report”。
“报告”可以很容易地作为不同模块之间的通信包传递。
代码V1
class B{
float getWidth(C c){
float width= ... (very cheap function about "c") ;
return width;
}
float getHeight(C c){
float height= ... (very cheap function about "c") ;
return height;
}
};
代码V2
class ReportSize { float width; float height; }
class B{
ReportSize getSize(C c){ //<-- grouped
float width = ... ;
float height= ... ;
return ReportSize(width ,height);
}
};
代码V1
class D{
Vector3 calculateNarrow(){ ... }
Vector3 calculateBoard(){ ... }
};
代码V2
class ReportVector3Pair{
Vector3 resultNarrow;
Vector3 resultBoard;
Vector3 get(NARROW_OR_BOARD paramEnum){
//return "resultNarrow" or "resultBoard"
}
};
class D{
ReportVector3Pair calculate(){ ... } //<-- grouped
};
重构需要一些开发时间。必须手动重构所有代码位置(最多100个呼叫者)以匹配新签名。
如何最大程度地降低以后需要重构的可能性?如果将来可能发生重构,如何最大限度地降低重构成本?
答案 0 :(得分:3)
如何最大程度地降低以后需要重构的可能性?
创建可以返回更高级别对象的非成员函数,而不是更改现有类。
例如,不要编写B
的V2,而是保留现有的B
并使用:
class ReportSize { float width; float height; }
ReportSize getReportSize(B const& b, C c)
{
return {b.getWidth(c), b.getHeight(c)}
}
同样,不要创建D
的V2,而是保留现有的D
并使用:
Vector3 calculate(D const& d, NARROW_OR_BOARD paramEnum) {
//return "resultNarrow" or "resultBoard"
}
如果将来可能发生重构,如何最大限度地降低重构成本?
使用非成员函数来扩展功能,而不是修改现有类。
根据Scott Meyers的说法,using non-member functions improves encapsulation.
使用非成员函数添加新功能也遵循The Open/Closed Principle。