你如何重构旧的PHP代码?

时间:2008-09-19 10:07:46

标签: php refactoring

我最近参与了一个基于网络的游戏使用PHP编写的引擎的项目。游戏运行良好,但可能更强大,并具有更多功能 - 而且代码既旧又丑陋。

这段代码的问题(以及我怀疑的一般PHP代码)是它已经发展到它的位置并且结构不是很好,有很多几乎相同的剪切/粘贴代码片段,以及即使涉及函数,也会大量使用全局变量。当然,在任何地方都没有单个单元测试,并且代码被硬编码为使用特定数据库并依赖于调用代码的网页中的$ _REQUEST字符串。

正确的做法是将代码片段作为子函数提取出来,整理它们并添加一些单元测试以确保它继续工作,并在此过程中添加一些模拟对象。但是,完全手动执行此操作既繁琐且容易出错,我想知道您是如何做到这一点的 - 例如,是否有可以提供帮助的IDE或工具?我想有一个工具,可以帮助从定义的代码片段生成一个函数,建议哪些变量应该是参数,按值或参考,自动添加$ this->参考等。

问题太多了,还是有一个好的解决方案?

谢谢!

7 个答案:

答案 0 :(得分:11)

Allan,我从来没有见过一个功能强大的重构工具。甚至Eclipse的Java重构也不完整。但是,有一些关于重构的常见提示。我通常分两步重构应用程序。

<强> 1。将事物分开。我提取数据库和模型相关的东西,并将它们从主代码中提取出来。一些对象表示会有所帮助。检查Active RecordDAO模式是否有ORM项工作。 HTML代码可以从主代码中删除并移动到模板文件中。查看好的模板引擎,强大支持视图逻辑处理 - Smarty

<强> 2。把事情放到MVC框架中。 MVC是一个非常适合Web应用程序的强大架构。使用PHP框架之一将松散的PHP文件绑定到控制器方法中。框架可以轻松管理URL,HTTP请求,传递参数,管理登录信息,并且通常提供一些访问控制机制。

但最重要的是:不要破坏无法修复的东西。它是重构,而不是重新开发; - )

答案 1 :(得分:9)

本文真正强调了重构/重新开发旧丑代码的危险:

http://www.1729.com/blog/EconomicsOfTestingUglyCode.html

我的方法通常是一次解决一个小问题,首先将大部分旧代码隐藏在接口后面,可以“稍后”处理,而不会影响任何新代码。这样我写的任何东西都可以精心设计并具有坚固的结构,但我不必浪费太多时间来重构,然后测试数周/月/年的坏代码。

答案 2 :(得分:1)

没有任何工具可以使用狡猾的代码,并以某种方式让它再次变得漂亮。 “回归公式”这个短语对于一个成熟的项目来说是一个非常可怕的前景,但对我来说却是...... ...

我建议您将它移植到一个体面的MVC框架。在这样做的过程中,进行结构重写可能并不是一个糟糕的时间,因此所有类都经过优化(这些都是很少发生代码的事情)。这将花费很长时间,当事情无法按预期发挥作用时会有痛苦。

这是一个很大的进步,但这就是当代码被腐烂时会发生的事情。

您的其他选择:

  1. 进行部分重组,所有新代码都遵循既定制度,旧代码会慢慢重新开发。
  2. 只需修复您的错误,不要重组。

答案 3 :(得分:0)

我感觉到你的痛苦。但是,我从未听说过这样的工具,至少不适用于PHP。

答案 4 :(得分:0)

我认为语言的结构不足以允许任何类型的半自动重构。无论如何,我不知道任何可以做到这一点的应用程序,但是在光明的一面 - 手工完成这一切会让你非常熟悉源代码,它可能会帮助你以后知道你的方式比你好多了会使用自动化工具。

答案 5 :(得分:0)

我正在谷歌搜索这个东西,并找到了Accurev客户的一个有趣的博客。

http://blog.accurev.com/2008/09/17/dr-strangecode-or-how-i-learned-to-stop-worrying-and-love-old-code/

在工具箱中使用正确的版本控制工具不会有任何损害。

答案 6 :(得分:-1)

根据我的经验,在这种情况下完全重写会更加经济。