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

时间:2010-01-06 01:01:02

标签: methods arguments

我继承了现有的代码库,其中“功能”如下:

  • 巨大的整体课程 (字面意思)100的成员变量 和一个页面的方法 (呃。屏幕)
  • 包含大量参数的公共和私有方法。

我正在尝试清理和重构代码,让它更好一些 而不是我发现它。所以我的问题

  • 是否值得(或者你)使用10个左右的参数重构方法,以便它们更具可读性?
  • 是否有关于方法应该有多长时间的最佳实践?你经常保留多久?
  • 单片类坏吗?

3 个答案:

答案 0 :(得分:6)

  

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

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

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

话虽如此,在需要许多参数的情况下,最好将参数封装到单个类(即:SpecificAlgorithmOptions)中,并传递该类的一个实例。这样,您可以提供干净的默认值,并且非常明显哪些方法是必需的而不是可选的(基于构造选项类所需的内容)。

  

是否有关于方法应该有多长时间的最佳实践?你经常保留多久?

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

  

单片类坏吗?

答案 1 :(得分:1)

如果代码工作且无需触摸它,我就不会重构。如果我不得不触摸它们(无论是为了扩展功能还是修复bug),我只会重构非常有问题的案例。我倾向于务实的方式:只有(95%)触摸,你改变了什么。

关于您的具体问题的一些初步想法(虽然在不知道代码的情况下很难实现):

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

关于你的其他具体问题。

  

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

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

  

是否有关于方法应该有多长时间的最佳实践?你经常保留多久?

这取决于...偏好。我在thread上陈述了一些内容(虽然问题是PHP)。我仍然会将这些数字/指标应用于任何语言。

  

单片类坏吗?

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

还可以看一下真正的宝石(对每个开发者来说都是必须的):working effectively with legacy code

答案 2 :(得分:0)

假设代码正常运行,我建议您先考虑这些问题:

  • 是否有充分记录的代码?
  • 你明白这段代码吗?
  • 添加新功能的频率是多少?
  • 报告和修复错误的频率是多少?
  • 修改和修复代码有多难?
  • 代码的预期寿命是多少?
  • 你背后有多少版本的编译器(如果有的话)?
  • 是它预期在其生命周期内运行的操作系统吗?

如果系统将在五年内更换,记录良好,将进行少量更改,并且容易修复错误 - 无论类的大小和参数的数量如何都不管它。如果您决定以最小的更改顺序重构您的重构提议列表并逐步攻击它。