假设您有一个目前正常运行的程序。该应用程序背后的代码非常糟糕,占用大量内存,不可扩展,如果要实现任何功能更改需要进行重大重写。
那么,在什么时候重构变得不如完全重建合理?
假设您有一个目前正常运行的程序。该应用程序背后的代码非常糟糕,占用大量内存,不可扩展,如果要实现任何功能更改需要进行重大重写。
那么,在什么时候重构变得不如完全重建合理?
Joel写了一篇关于这个话题的好文章:
我从中得到的关键教训是,虽然旧代码很糟糕,让人眼花缭乱,无法美化,但其中有很大的可能性修补了未记录的错误和问题。也就是说,它嵌入了许多领域知识,你很难或者根本无法复制它。你会不断地遇到遗漏错误。
我发现一本非常有用的书是《与遗留代码有效地工作》(Working Effectively With Legacy Code),作者是Michael C. Feathers。这本书提供了处理即使是真正丑陋的遗留代码的策略和方法。
简单来说,如果重构需要的时间比重新构建还要长,那么你应该选择重新构建。
如果这是个个人项目,那么你可能会选择重新构建,因为从头开始构建比重构更能让你学到东西,而这也是个人项目的一个重要目标。
然而,在一个专业的时间有限的环境中,你应该始终选择在长期内对公司成本最少的方案(对于相同的回报),这意味着选择需要更少时间的方案。
当然,情况可能比这更加复杂。如果其他人可以在重构进行时工作于其他功能上,那么这可能是一个比等待完全新版本构建更好的选择。在这种情况下,重新构建可能比仅仅进行重构所需的时间更短,但你需要考虑整个项目和所有贡献者。
当你花费的时间在重构代码上比实际编写代码的时间还要多时。
当软件不能完成其预期功能时,重构(在不改变功能的情况下更改代码)仅在功能“按预期”时才有意义。
如果应用程序非常小,那么您可以从头开始重写它。如果应用程序很大,则永远不要这样做。逐步重写它,一步一步验证您没有破坏任何内容。
应用程序是规范。如果您从头开始重写它,您很可能会遇到许多隐蔽的错误,因为“没有人知道在那种非常特殊的情况下,对该函数的调用应该返回3”(未记录的行为...)。
从头开始重写总是更有趣的,因此您的大脑可能会欺骗您认为这是正确的选择。小心,它很可能不是。
一种选择是编写单元测试以覆盖现有应用程序,然后逐步重构它,使用单元测试确保一切正常。
在理想的情况下,您已经为程序编写了单元测试,但考虑到您对应用程序质量的评论,我猜您没有...