Methods 具有大量参数的现有代码库中的重构方法

Methods 具有大量参数的现有代码库中的重构方法,methods,arguments,Methods,Arguments,我继承了一个现有的代码库,其中“特性”如下: 具有 (字面上)100个成员变量 和一页一个的方法 (er.屏幕) 具有大量参数的公共和私有方法 我试图清理和重构代码,让它更好一点 而不是我怎么找到的。所以我的问题是 是否值得(或者您是否需要)用10个左右的参数重构方法,以使它们更具可读性 是否有关于方法应使用多长时间的最佳实践?你通常保存多久 整体课程不好吗 是否值得(或者您是否需要)用10个左右的参数重构方法,以使它们更具可读性 是的,这是值得的。通常,重构那些不“合理”的方法比那些已

我继承了一个现有的代码库,其中“特性”如下:

  • 具有 (字面上)100个成员变量 和一页一个的方法 (er.屏幕)
  • 具有大量参数的公共和私有方法
我试图清理和重构代码,让它更好一点 而不是我怎么找到的。所以我的问题是

  • 是否值得(或者您是否需要)用10个左右的参数重构方法,以使它们更具可读性
  • 是否有关于方法应使用多长时间的最佳实践?你通常保存多久
  • 整体课程不好吗
是否值得(或者您是否需要)用10个左右的参数重构方法,以使它们更具可读性

是的,这是值得的。通常,重构那些不“合理”的方法比那些已经很好、很短且参数列表很小的方法更重要

通常,如果你有很多参数,那是因为一个方法做的太多了——很可能,它应该是它自己的一个类,而不是一个方法

也就是说,在需要许多参数的情况下,最好将这些参数封装到单个类(即SpecificAlgorithmOptions)中,并传递该类的一个实例。通过这种方式,您可以提供干净的默认值,并且很明显哪些方法是必需的,哪些是可选的(基于构造options类所需的内容)

是否有关于方法应使用多长时间的最佳实践?你通常保存多久

方法应该尽可能短。它应该有一个目的,并在可能的情况下用于一项任务。如果可以将它分成单独的方法,每个方法都作为一个真实的、定性的“任务”,那么在重构时就这样做

整体课程不好吗


是的。

如果代码正常工作,并且不需要触摸它,我就不会重构。我只会在必须接触到问题的情况下重构问题严重的案例(为了扩展功能或修复bug)。我喜欢务实的方式:只有(95%)的接触,你改变了什么

关于您的具体问题的一些初步想法(尽管在不了解代码的情况下很难进行详细说明):

  • 开始对实例变量进行分组,然后将这些组作为“提取类”的目标
  • 当对这些变量进行分组后,您希望能够对一些方法进行分组,这些方法在执行“提取类”时也会被移动
  • 通常有许多方法不使用任何字段。使它们成为静态(它们很可能是helper方法,可以提取到helper类中
  • 如果许多方法中混合了不相关的实例字段,请加载“extract method”
  • 尽可能多地使用自动重构工具,因为您很可能没有测试,自动化更安全
关于你的其他具体问题

是否值得(或者您是否需要)用10个左右的参数重构方法,以使它们更具可读性

当然。10个参数对我们人类来说太多了,很可能这个方法做得太多了

有关于方法应该保留多长时间的最佳实践吗?您通常保留多长时间

这取决于…偏好。我在这方面做了一些陈述(尽管问题是PHP)。但我会将这些数字/指标应用于任何语言

整体课程不好吗

这取决于,你说的单片是什么意思。如果你说的是很多实例变量,无尽的方法,很多if/else复杂性,是的


另外,请看一看真正的gem(对我来说,这是每个开发人员必须具备的):

假设代码正常运行,我建议您首先考虑以下问题:

  • 代码是否有良好的文档记录
  • 你懂密码吗
  • 多久添加一次新功能
  • 错误报告和修复的频率是多少
  • 修改和修复代码有多困难
  • 代码的预期寿命是多少
  • 您落后了多少版本的编译器(如果有的话)
  • 它运行的操作系统在其生命周期内是否会发生变化

如果系统将在五年内被替换,记录良好,将经历很少的更改,并且bug很容易修复-不管类的大小和参数的数量如何,都不要管它。如果你决心进行重构,请以最小的更改和最大的收益的顺序列出重构建议,并对其进行攻击递增。

根据经验,如果你不能在一句话中描述一个类或方法不使用“and”这个词所做的事情,那么该类或方法应该被拆分。是的。它应该有一个特定的函数/任务。这通常意味着你可以说“X类句柄…”,只有一个单词,没有变位符。为什么要使用“•”而不是编辑框中的引号功能?只是好奇。@wcoenen:我刚刚复制并粘贴了OP的项目。我将此更改为使用>(blockquote),只为您;)