【发布时间】:2017-02-01 08:01:55
【问题描述】:
当我的程序还很年轻的时候,通常会有很多功能做简单的事情。
等老了,发现把一些类似的函数捆绑在一起比较方便,把老函数的返回结果组合成一个“报表”。
“报告”可以作为不同模块之间的通信包轻松传递。
示例 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 个调用者)都必须手动重构以匹配新签名。
如何最小化以后需要重构的机会?如果将来可能发生重构,如何最小化成本?
【问题讨论】:
-
我推荐这本书 Clean Code: A Handbook of Agile Software Craftsmanship (by Robert C Martin)(请注意,此链接仅引用了一个 PDF,其中只有几个免费示例章节 - 完整的书可在优秀的书店或在线供应商处获得)
-
如果宽度/高度对是你经常传递的东西,那么声明一个类型并不是一个糟糕的计划。我会使用
struct而不是class,因为这意味着它只是一个基本结构,没什么特别的。第二个例子看起来很奇怪,但也许额外的上下文将有助于澄清。抽象是您申请的原因,而不仅仅是因为。 -
@Christoph Bimminger 是哪一章或该章的名称是什么?
标签: c++ architecture maintainability