函数参数已更改:如何重构代码,尽可能少
Function arguments have changed: how to refactor the code, changing as little as possible
有一个C 函数可以计算某些内容(无论如何,我不确定C 是否完全重要...)。它在50个或更多的地方被称为。现在,事实证明,此功能可以错误地工作。为了正确工作,它需要另外三个参数。
如何根据必要的更改和紧凑性最有效地重构此代码。
btw新添加的参数如此,使其具有默认值是不合理的。它们应该始终传递给功能。
许多人要求一个例子。在这里是:
//old syntax of function
int f(int a1, int a2)
{
return a + b;
}
//new syntax of function
int f(int a1, int a2, int a3, int a4, int a5)
{
if (a3 == 10)
{
return a1 + a2;
}
else
{
return a1 + a2 + a4 + a5;
}
}
此示例有帮助吗?我需要一种使用一般方法(例如设计模式)这样做的方法,例如重构原则,但对于特定的例子而不是... 您可以为这3个参数定义默认值,而您只需要更改它们所需的位置。或在整个项目中使用 这实际上取决于三个参数的来源。如果我们不能有默认值,并且不可能为额外的参数创建一个共同的模式,那么您可能别无选择,只能攻击组中的50个调用中的每一个。在这种情况下,您将保留原始呼叫,并以略有不同的名称进行直接副本。然后,您逐渐移动,以最终使用额外的参数来调用新函数。然后,您可以退休旧的。 另一方面,如果我们可以从默认值开始或至少使它们独立于调用代码,那么以下可能是一个好的计划。要记住的是,作为一个很大的变化,大概必须在阶段进行以控制潜在的影响,如果有任何问题。 首先,我将功能的名称从 接下来,我将更改 关键点也是为将来的维护者添加评论,描述了该包装器的存在。不幸的是,这是这些更改中的一些变化,因此代码落后于目的并不明显。 然后,我计划在说为五个或十组的50个更改中逐步分阶段,以便您将原始呼叫更改为新呼叫: 变为: 可以单独测试调用代码的每个部分,以便您很高兴(a)它像往常一样工作(即完全向后兼容),并且(b)它解决了任何问题。 最后,一旦完成了所有这些,您就可以进行一次更改以删除新功能 结论 无论您走哪种方式,我都建议:find
并纠正它们。xxxx
更改为xxxx_<tag>
,其中<tag>
是更改的处理方法 - 可能是从缺陷跟踪器或更改管理系统中的错误#。然后,我将创建一个名为xxxx
的新功能,该功能只需称xxxx_<tag>
重新编译所有内容。到目前为止很好:void xxxx_tag(int p1, int p2)
{
// ....
}
void xxxx(int p1, int p2)
{
xxxx_tag(p1, p2);
}
xxxx_<tag>
的签名,以添加额外的三个参数和呼叫。现在我会再次重建:void xxxx_tag(int p1, int p2, int p3, int p4, int p5)
{
// ....
}
void xxxx(int p1, int p2)
{
// XXX, YYY, and ZZZ and constants or at least can be derived at this point.
xxxx_tag(p1, p2, XXX, YYY, ZZZ);
}
xxxx(p1, p2);
xxxx_tag(p1, p2, p3, p4, p5);
xxxx()
并将xxxx_<tag>
重命名为xxxx
,您必须完全重建和测试。
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 重构类:无法将派生类中成员函数的公共代码移回基类
- 重构此代码以进行优化
- 在C++中重构代码
- 将样本代码重构为类,并没有提高过载功能的实例
- 如何将此代码重构为多线程版本
- 使用OTool进行了重构代码的二进制比较
- 如何重构这个类模板以最小化锅炉板代码
- 函数参数已更改:如何重构代码,尽可能少
- 解开高德纳的结:如何重构意大利面条代码?
- 重构多线程方案的单线程 GUI 代码
- 重构代码以使用 Boost 共享指针
- 使用函数对象重构 C++ 代码
- 绘制游戏组件的重构代码
- 代码重构尝试使用多态性和std::map
- 如何重构C++代码以支持动态数组大小
- 有没有一种方法可以将C++11代码重构为C++代码,这些代码可以由能力较弱的编译器编译
- 重构常规c++代码模式
- 用c++中已有的类重构代码
- 不使用goto来重构代码