2009-03-05 60 views
10

假设你有一个程序,它目前的功能应该是这样。应用程序背后的代码非常差,消耗了大量内存,不可扩展,并且需要进行重大改写才能实现功能上的任何更改。重构在什么时候变得不值得?

在什么时候重构变得不那么合乎逻辑,那么整个重建?

回答

10

乔尔写了一篇很好的文章关于这个题目:

Things You Should Never Do, Part 1

的关键教训我从这次得到的是,虽然旧的代码是可怕的,会伤害你的眼睛,你的审美意识,有一个非常很大程度上,很多代码修补了无证错误和问题。也就是说,它嵌入了大量的领域知识,您很难或不可能复制它。你会不断地碰到漏洞漏洞。

一本书,我发现非常有用是Working Effectively With Legacy Code由迈克尔羽毛。它提供了接近甚至是真正难看的遗留代码的策略和方法。

+0

弗雷德布鲁克斯说“建立一个扔掉” - 但他没有使用敏捷技术,并且添加的任何功能都被记录和理解,因此可以在不损失的情况下进行重写。 – 13ren 2009-03-05 17:31:21

0

当您花费更多时间重构实际编写代码时。

0

一种选择是编写单元测试来覆盖现有的应用程序,然后开始逐点重构它,使用单元测试确保一切都像以前一样工作。

在一个理想的世界里,你会已经为节目单元测试,但考虑您的意见对应用程序的质量我猜你不...

1

点在哪里软件没有做它应该做的事情。重构(更改代码而不更改功能)当且仅当功能“按预期”时才有意义。

3

那么,最简​​单的答案是,如果重构需要更长时间才能重建,那么您应该重建。

如果它是一个个人项目,那么你可能想反正要重建它,你可能会了解更多从从头开始构建比你从重构会,这是个人项目的一个大目标。

但是,在专业的时间有限的环境中,您应该始终以最低的金钱成本(相同的收益)从长远来看,这意味着选择哪一个花费更少的时间。

当然,它可能比这更复杂一点。如果在重构过程中其他人可以在功能上工作,那么这可能是一个更好的选择,因为每个人都需要等待一个完全新的版本的构建。在这种情况下,重建可能需要的时间比只是重构将采取,但你需要把整个项目中考虑项目的所有贡献者。

1

我已经在过去这样的应用工作。我发现的最好的方法是逐步的:当你在处理代码时,找出多次完成的事情,并将它们组合在一起。保持一个笔记本(你知道,一个真正的,用纸,铅笔或笔),以便你可以标记你的进步。与您的VCS结合使用,而不是它。笔记本可以用来概述您作为重构的一部分创建的新功能,而VCS当然会填补详细信息的空白。

随着时间的推移,你会巩固了大量的代码到更合适的地方。在这段时间重复代码将是几乎不可能的,所以只是做了作为最好的,你可以直到你达到一个地步,你可以真正开始重构过程中,审核整个代码库和工作它作为一个整体。

如果你没有足够的时间进行这个过程(这需要很长的时间),然后使用测试优先的方法从头开始重写可能是更好的。

1

如果你有足够的时间来完全重建应用程序,也不需要逐步完善功能,并且不希望保留任何现有代码的重写,然后当然是一个可行的选择。另一方面,您可以使用重构来通过用功能更好,效率更高的等效函数慢慢替换现有函数来进行增量重写。重构了重建

6

一个好处是,如果你能一步做一步的重构,即在递增,您可以在整个系统的环境测试的增量,使得开发和调试速度更快。

老和部署的代码,即使丑陋和缓慢的,它已经被彻底测试的好处,如果你从头开始这样做的好处是丢失。

增量重构方法也有帮助,以确保有始终可用一种产品,它可以被运送(和它的不断完善)。

在网上有一篇关于how Netscape 6 was written from scratch and it was business-wise a bad idea的文章。

1

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

该应用程序是规范。如果你从零开始重写它,你很可能会遇到大量的隐患,因为“没有人知道这个函数的调用应该在特定情况下返回3”(无证行为...)。

重写从头开始总是更有趣,所以你的大脑可能会诱使你认为这是正确的选择。要小心,这很可能不是。

0

没有文档,没有原作者,没有测试用例,还有一堆剩余的错误。

1

Uncle Bob weighs in下列要求:

当一个重新设计正确的策略?

我很高兴你问了这个问题。这是答案。 从不。

看,你做了这个烂摊子,现在把它清理干净。

0

当我继承的代码非常糟糕时,我还没有多少运气与小的增量更改。从理论上讲,小增量方法听起来不错,但实际上它最终是一个更好,但仍然设计不佳的应用程序,大家都认为这是现在你的设计。当事情破裂时,人们不再认为这是因为之前的代码,它现在成了你的错。所以,我不会使用重新设计,重构或任何其他暗示经理类型的东西,你会改变事情的方式,除非我真的要按照自己的方式去做。否则,即使您可能已经解决了数十个问题,但仍然存在(但未发现)的任何问题现在都将归因于您的返工。并且请放心,如果代码不好,那么您的修复将会发现更多的错误,而这些错误以前根本没有被忽略,因为代码非常糟糕。

如果你真的知道如何开发软件系统,那么我会重新设计整个系统。如果你没有真正知道如何设计好的软件,那么我会说坚持小的增量变化,否则你可能会得到一个与原来一样糟糕的代码库。

重新设计时经常出现的一个错误是人们忽略了原始代码库。然而,重新设计并不意味着完全忽视旧代码。旧代码仍然需要做你的新代码必须做的事情,所以在许多情况下,你需要的步骤已经在旧代码中。然后复制并粘贴,然后在重新设计系统时调整奇迹。我发现,在许多情况下,重新设计和重写应用程序以及从原始代码中窃取代码片段比小型增量更改要快得多并且更可靠。

相关问题