函数参数已更改:如何重构代码,尽可能少

Function arguments have changed: how to refactor the code, changing as little as possible

本文关键字:重构 代码 尽可能 何重构 参数 函数      更新时间:2023-10-16

有一个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个参数定义默认值,而您只需要更改它们所需的位置。或在整个项目中使用find并纠正它们。

这实际上取决于三个参数的来源。如果我们不能有默认值,并且不可能为额外的参数创建一个共同的模式,那么您可能别无选择,只能攻击组中的50个调用中的每一个。在这种情况下,您将保留原始呼叫,并以略有不同的名称进行直接副本。然后,您逐渐移动,以最终使用额外的参数来调用新函数。然后,您可以退休旧的。

另一方面,如果我们可以从默认值开始或至少使它们独立于调用代码,那么以下可能是一个好的计划。要记住的是,作为一个很大的变化,大概必须在阶段进行以控制潜在的影响,如果有任何问题。

首先,我将功能的名称从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);
}

关键点也是为将来的维护者添加评论,描述了该包装器的存在。不幸的是,这是这些更改中的一些变化,因此代码落后于目的并不明显。

然后,我计划在说为五个或十组的50个更改中逐步分阶段,以便您将原始呼叫更改为新呼叫:

xxxx(p1, p2);

变为:

xxxx_tag(p1, p2, p3, p4, p5);

可以单独测试调用代码的每个部分,以便您很高兴(a)它像往常一样工作(即完全向后兼容),并且(b)它解决了任何问题。

最后,一旦完成了所有这些,您就可以进行一次更改以删除新功能xxxx()并将xxxx_<tag>重命名为xxxx,您必须完全重建和测试。

结论

无论您走哪种方式,我都建议:

  1. 在分阶段进行 - 这最大程度地减少了出现问题的风险。
  2. 测试,测试和测试再次 - 再次,这减少了您对问题的暴露。