重用、重写还是重构?

Posted

技术标签:

【中文标题】重用、重写还是重构?【英文标题】:Reuse, Rewrite, or Refactor? 【发布时间】:2010-04-14 19:28:06 【问题描述】:

在工作中,我继承了一个基于 php 的网站的开发工作,因为最初制作该网站的顾问退出并无影无踪。从字面上看,有一半的代码是从在线教程中抄袭而来的,而且有成千上万行代码,不完整,做的很少。几乎没有一个真正有效。我一直在尝试提取可用的组件,例如布局(巧妙地与代码混合)、会话管理(巧妙地使用未转义、未验证的 SQL 查询)和其他一些东西,但是很难强制所有这个垃圾到位。此外,我不会说惯用的 PHP,我更像是一个 Perl 用户,而且我应该在这个项目上主要是为了维护,所以重写所有东西似乎只要把现有的怪物摔回原处就行了.

顺便说一句,我真的从未见过像这样写得这么糟糕的东西。欢迎我来到使用其他人的代码的世界,我想,但我希望在现实世界中拥有这样的宝石并不常见:

// WHY IS THIS NOT WORKING // I know this is bad but were going for working stuff right now... // This is a PHP code outputing javascript code outputting html...do not go further // Not userful

我正在寻找可以在这里获得的最佳建议。如果你处于我的位置,你会怎么做?

编辑:感谢大家的快速和有用的建议!

【问题讨论】:

【参考方案1】:

向您的经理解释问题,表明除非您消除代码中的技术债务,否则支持成本将继续增加。建议他尽快去重写,以现有系统为模板,以1-1替换为目标。由于开发时间的很大一部分是弄清楚你需要做什么,所以这不应该像原来的那样花很长时间。有一个称职的开发人员可能意味着它只需要一小部分时间。

让您的经理完成他的工作 - 计算替换项目的投资回报率 - 并做出决定。

【讨论】:

如果他拒绝,那就找一个新的工作...... :)【参考方案2】:

实际上,这取决于您正在查看的内容的大小和范围。

因为它与您的场景特别相关,如果工作很简单但代码被破坏,您可能会节省大量时间,只需重写它。您不会继承任何遗留问题或糟糕的设计选择。对于网站,有大量框架和/或开源解决方案,您只需将现有网站映射到即可。

查看您上面的代码示例,看起来将您的代码 sn-p 提交到 thedailywtf.com 也是值得的。 ;)

【讨论】:

好主意...我看看能不能找到一个多汁的 sn-p 来发帖!【参考方案3】:

每个人都会不时地继承糟糕的代码。

你在这里看到的是我过去看到的一个相当经典的例子(实际上我看到的更糟)。虽然我能理解重写的愿望(事实上,如果所有代码都这么糟糕,你应该认真考虑这个选项)——你的经理可能不会这样做,或者至少不会立即这样做。

无论哪种方式,您都会处理一段时间。我会尽可能多地清理,或者 - 如果这是面向客户的 - 推动安全问题。如果代码像我从您发布的内容中所怀疑的那样糟糕,那么它可能充斥着诸如 SQL 注入之类的东西,以及少量的 CSRF 和 XSS。因此,如果您将它用于任何需要安全的事情,您可以为“改进”它提供一个很好的理由。

【讨论】:

【参考方案4】:

向您的客户解释前任顾问可能已经过时了。代码不可管理,需要重写。如果你想解开这个烂摊子,那么解释一下成本将超过从头开始重写。我以前不得不这样做。大多数时候重写更容易。

【讨论】:

【参考方案5】:

我不喜欢为了重写/重构而进行重构,因为我在一个成熟的遗留环境中工作。在源代码历史中查看“发生了什么变化”比查看漂亮的代码更重要。我们的大多数更改都与错误报告或已批准的具有正式要求的“更改请求”相关联。但是在这里我说的是基本上可以工作的代码,而你的代码却不能。因此,在您的情况下,当处理当前不满足要求的代码(过去或现在的任何要求)时,我会说继续重写。

【讨论】:

【参考方案6】:

维护代码。这很糟糕,但是您从事该行业的时间越长(并且负责维护),您就越会意识到宝石并不是您所见过的最糟糕的东西...

只要学会利用你所拥有的东西,并尽可能多地提供好处。当然,如果您确实深入评估了代码,并且仍然得出从头开始编写代码比修复代码更快的结论,请将(计划好的)时间表提供给您的老板,然后看看它的去向。

【讨论】:

【参考方案7】:

我想正如您所知,这里没有简单的答案,处理遗留代码是我们行业中最令人沮丧的事情之一,但我们大多数人不得不经常处理这些事情。在您继续之前,我建议您确保了解项目的确切范围,将其分解为必备品和理想品。然后,您可以首先更密切地关注最重要的领域。就重用/重构/重写等的选择而言,这实际上将首先取决于代码的糟糕程度以及代码的未来需要是什么。

【讨论】:

以上是关于重用、重写还是重构?的主要内容,如果未能解决你的问题,请参考以下文章

代码重用和接口重用

重用语句和结果集是不是会释放其先前使用的资源?还是我必须在重用之前明确关闭它们?

如何使我的代码成为可重用的组件?

代码组织与重构原则

设计:重用 QProcess 实例,还是再次实例化?

SwiftUI如何将列表项重构为子视图