重构“fA()”和“fB()”到“fAB(){return report;}”的可维护性问题

时间:2017-02-01 08:01:56

标签: c++ architecture maintainability

当我的程序非常年轻时,通常会有很多功能可以做很简单的事情。

当它变老时,我发现将一些类似的函数捆绑在一起更方便,并将旧函数的返回结果分组为“Report”。

“报告”可以很容易地作为不同模块之间的通信包传递。

示例1

代码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);
    }
};

示例2

代码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个呼叫者)以匹配新签名。

如何最大程度地降低以后需要重构的可能性?如果将来可能发生重构,如何最大限度地降低重构成本?

1 个答案:

答案 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