什么时候不应该重构?

时间:2009-08-08 03:01:16

标签: refactoring

我们都知道重构很好,我和下一个人一样喜欢它,但你有没有更好的重构的真实案例?

时间关键的东西或同步?技术或人为原因同样受到欢迎。真实案例场景和经验加分。

编辑:从目前为止的答案来看,看起来不重构的唯一理由就是金钱。我的问题主要与这样的事情有关:假设你想要执行“提取方法”,但是如果你添加额外的函数调用,你将使代码稍微快一点,并阻碍非常严格的同步。只是为了让你了解我的意思。

我有时听到的另一个原因是“用于当前代码布局的其他人会因你的更改而烦恼”。当然,我怀疑这是一个很好的理由。

16 个答案:

答案 0 :(得分:15)

我非常喜欢重构以保持代码清洁和可维护。但是,您通常希望避免重构生产模块,这些模块可以正常工作并且不需要更改。但是,当您确实需要处理模块来修复错误或引入新功能时,一些重构通常是值得的,并且不会花费太多,因为您已经承诺执行一整套测试并完成发布处理。 (单元测试非常有用,但只是完整测试套件的一部分,正如其他海报所述。)

更重要的重构可能会让其他人更难以找到新的代码,然后他们可能会对重构做出不利的反应。为了最大限度地减少这种情况,请使用像对编程这样的方法让其他团队成员参与该过程。

更新(8/10):不重构的另一个原因是当您没有以适当的谦逊和尊重接近现有代码库时。有了这些品质,你会倾向于保守,只做重构才真正有所作为。如果你过于傲慢地接近代码,你最终可能只是做出改变而不是重构。这个新方法名称是否更清晰,或旧的方法名称在您的应用程序域中具有非常特定的含义?当现有风格符合项目指南时,您是否真的需要将源文件机械地重新格式化为您的个人风格?再次结对编程可以提供帮助。

答案 1 :(得分:12)

强化另一个答案(并触及你提到的问题):在所有相关类型的测试完全覆盖之前,不要重构代码的一部分。这并不意味着“不重构它” - 重点是“添加必要的测试”(正确地进行单元测试可能需要一些重构,特别是引入工厂DP和/或依赖注入DP)现在已经完全固定到具体依赖项的代码了。)

请注意,这确实涵盖了第二段的问题:如果代码的某一部分是时间关键的,那么“负载测试”应该很好地覆盖它(这类似于更常见的类型,正确性测试,应该涵盖两个特定的单位[虽然性能方面 - 正确性检查是其他测试的业务! - )]和端到端操作 - 相当于单元测试和集成测试,如果一个人在讨论正确性而不是性能)。

具有微妙同步问题的多任务代码可能是一场噩梦,因为没有任何测试可以让您对此完全有信心 - 没有其他重构(可能会以任何方式影响任何看似正在运行的脆弱同步)被认为是一个旨在使同步更多,更强大和更健全的消息(通过保证线程安全队列的消息传递是我最喜欢的设计模式在这方面; - )。

答案 2 :(得分:10)

嗯 - 我不同意上述(第一反应)。如果没有测试的代码,您可以重构它以使其更易于测试。

当您无法及时测试生成的代码以便对代码进行交付时,您不会重构代码。

当您的重构不会提高代码质量时,您不会重构代码。质量不是主观的,尽管有时可能是设计。

如果没有商业理由进行更改,您不会重构代码。

可能还有更多,但希望你能得到这个想法......

答案 3 :(得分:8)

正如Martin Fowler所写,如果截止日期临近,你不应该重构。项目中的那个时间更适合于清除错误而不是改进设计(重构)。在截止日期结束后,这次重构是否被省略。

答案 4 :(得分:4)

重构本身并不好。相反,它的目的是提高代码质量,以便可以更便宜地维护它,并且增加缺陷的风险更小。对于积极开发的代码,重构的好处是值得的。对于无意进行任何进一步处理的冻结代码,重构不会产生任何好处。

即使对于实时代码,重构也有其自身的风险,单元测试可以最小化。它在开发周期中也有自己的位置,它在前端,它不那么具有破坏性。重构的最佳时间和地点就在您开始对其他一些脆弱的代码进行重大更改之前。

答案 5 :(得分:3)

何时不符合成本效益。在我工作的地方有一个人喜欢重构。使代码完美让他非常开心。他可以检查一个当前的项目树,然后去城镇,移动功能和类,并加强处理,使它们看起来很棒,有更好的流量,并且在将来更具可扩展性。

不幸的是,这不值钱。如果他花了一个星期的时间将一些课程重构为更多功能单元,以后可能更容易合作,那就是公司一周的工资损失,并没有明显的底线改进。

代码永远不会绝对完美。你学会了忍受它,并把你的手放在可以做得更好的事情上,但也许不值得花时间。

答案 6 :(得分:3)

如果代码看起来很难在没有破坏的情况下进行重构,那么重构的代码就是最重要的代码!

如果没有任何测试,请在重构时写一些。

老实说,在一个案例中,您被禁止通过管理/客户/ SomeoneImportant触摸某些代码,当发生这种情况时,我认为该项目已被破坏。

答案 7 :(得分:3)

以下是我的经历:

不要重构:

  • 如果您没有附带要重构的代码的测试套件。您可能希望首先开发测试套装。
  • 当您的经理并不真正关心当前代码库的可维护性和可扩展性时,他们更关心的是他们是否能够如期交付产品,尤其是对于时间紧迫。

答案 8 :(得分:3)

如果您遵循以下原则:您所做的一切都应该为客户/业务增加价值,那么您不应该重构的时间如下:

  • 有效的代码,没有计划新的开发。
  • 足够好的代码/工作和重构只代表镀金。
  • 重构的成本高于使用现有代码的成本。
  • 重构成本高于从头开始重写代码

其他一些回答者说你不应该重构没有单元测试的代码。如果代码需要重构,你应该重构它,你必须先编写测试。如果代码以难以测试的方式编写,则应重写(在完美的世界中)。

答案 9 :(得分:2)

当你有其他东西需要建造时。当我应该做其他事情时,我总是感觉就像重构现有系统一样。

答案 10 :(得分:2)

在修复或添加代码与重构之间总是存在平衡。然而,到目前为止,这种平衡有利于重构,我认为我从未参与过重构太多的团队。如果你认为你在重构过多的方面犯了错误,那么你很可能会有钱。

当然,最大的决定因素是截止日期的接近程度。如果截止日期迫在眉睫,那么要求就会出现。

答案 11 :(得分:2)

如果您没有时间在发布之前测试重构代码,请不要重构。重构可能会引入错误。如果您有经过充分测试且相对无错误的代码,为什么要承担风险呢?等到下一个开发周期。

答案 12 :(得分:1)

如果你坚持维护一个旧的flakey代码库,除了保持运行之前没有未来,直到管理层可以咬紧牙关并重写,然后重构是一个双输的局面。首先,开发人员输了,因为重构糟糕的flakey代码是一场噩梦,其次是业务损失,因为开发人员试图以意想不到的,不可预知的方式重构软件。

答案 13 :(得分:1)

当你真的不知道代码在做什么的时候。是的,我看到人们忽视了这条规则。

答案 14 :(得分:1)

是否需要重构代码主要是基于人们切割和粘贴代码的倾向而不是考虑解决方案,并提前进行保理?换句话说,每当你觉得有必要削减&粘贴一些代码,只需将该代码块作为一个函数,并将其记录下来。

我不得不维护太多的代码,人们发现它更容易剪切和粘贴整个函数,只做一两个微不足道的改变,这很容易被参数化。但是和许多其他人一样,尝试重构一些代码会花费很多时间并且风险很大。

我有4个项目,其中10K系列功能仅根据需要进行复制和修改。这是一个可怕的维护噩梦。特别是当代码有很多问题时,例如硬连线的字节序假设,大量的全局变量等。我只是想着它,我感到胆怯。

答案 15 :(得分:1)

这只是一次成本效益权衡。估算重构的成本,估计收益,确定您是否真的有时间重构其他任务,确定重构是否是最佳的时间 - 收益权衡。可能还有其他任务值得做。