重构在什么时候变得不值得?

10

假设您有一个目前正常运行的程序。该应用程序背后的代码非常糟糕,占用大量内存,不可扩展,如果要实现任何功能更改需要进行重大重写。

那么,在什么时候重构变得不如完全重建合理?

13个回答

10

Joel写了一篇关于这个话题的好文章:

永远不要做的事情,第1部分

我从中得到的关键教训是,虽然旧代码很糟糕,让人眼花缭乱,无法美化,但其中有很大的可能性修补了未记录的错误和问题。也就是说,它嵌入了许多领域知识,你很难或者根本无法复制它。你会不断地遇到遗漏错误。

我发现一本非常有用的书是《与遗留代码有效地工作》(Working Effectively With Legacy Code),作者是Michael C. Feathers。这本书提供了处理即使是真正丑陋的遗留代码的策略和方法。


弗雷德·布鲁克斯曾说过“先建一个再扔掉”- 但他没有使用敏捷技术,任何添加的功能都被记录和理解,因此可以在不丢失任何东西的情况下进行重写。 - 13ren
更不用说,当你勾勒出大型项目的轮廓时,总会有许多你没有考虑到需要实现的细节。 - Kevin Kostlan

7
重构与重建相比的一个好处是,如果您可以逐步进行重构,即分步骤进行,那么您可以在整个系统的上下文中测试增量,从而加快开发和调试速度。
旧的和部署的代码,即使丑陋和缓慢,也有经过充分测试的好处,如果您从零开始,这种好处就会丧失。
渐进式的重构方法还有助于确保始终有可供交付的产品(并且它不断改进)。
有一篇很好的文章介绍了Netscape 6如何从零开始编写,但商业上是一个糟糕的想法


3

简单来说,如果重构需要的时间比重新构建还要长,那么你应该选择重新构建。

如果这是个个人项目,那么你可能会选择重新构建,因为从头开始构建比重构更能让你学到东西,而这也是个人项目的一个重要目标。

然而,在一个专业的时间有限的环境中,你应该始终选择在长期内对公司成本最少的方案(对于相同的回报),这意味着选择需要更少时间的方案。

当然,情况可能比这更加复杂。如果其他人可以在重构进行时工作于其他功能上,那么这可能是一个比等待完全新版本构建更好的选择。在这种情况下,重新构建可能比仅仅进行重构所需的时间更短,但你需要考虑整个项目和所有贡献者。


1

当你花费的时间在重构代码上比实际编写代码的时间还要多时。


1

当软件不能完成其预期功能时,重构(在不改变功能的情况下更改代码)仅在功能“按预期”时才有意义。


1
我曾经与这样的应用程序一起工作过。 我发现最好的方法是逐步进行:当您在编写代码时,找到多次完成的任务,并将它们分组到函数中。保持笔记本(您知道,一个真正的笔记本,有纸张和铅笔或钢笔),以便您可以标记自己的进度。与您的版本控制系统结合使用,而不是代替它。笔记本可用于提供新功能的概述,这些功能是重构的一部分,当然,VCS填补了细节的空白。
随着时间的推移,您将把大量代码整合到更合适的位置。在此期间进行代码复制几乎是不可能的,因此请尽力做到最好,直到达到可以真正开始重构过程并审核整个代码库的点为止。
如果您没有足够的时间进行该过程(这将需要很长时间),那么使用测试优先方法从头开始重写可能更好。

1
如果你有时间完全重建应用程序,不需要逐步改进功能,并且不希望保留任何现有代码,那么重写肯定是一个可行的选择。另一方面,你可以使用重构来进行渐进式重写,通过逐步替换现有函数为更好编写和更高效的等价函数。

1

如果应用程序非常小,那么您可以从头开始重写它。如果应用程序很大,则永远不要这样做。逐步重写它,一步一步验证您没有破坏任何内容。

应用程序是规范。如果您从头开始重写它,您很可能会遇到许多隐蔽的错误,因为“没有人知道在那种非常特殊的情况下,对该函数的调用应该返回3”(未记录的行为...)。

从头开始重写总是更有趣的,因此您的大脑可能会欺骗您认为这是正确的选择。小心,它很可能不是。


0

一种选择是编写单元测试以覆盖现有应用程序,然后逐步重构它,使用单元测试确保一切正常。

在理想的情况下,您已经为程序编写了单元测试,但考虑到您对应用程序质量的评论,我猜您没有...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接