我们如何重构旧的PHP代码?
我最近参与了一个基于Web的游戏使用PHP编写的引擎的项目。该游戏运行良好,但可能会更健壮并具有更多功能,并且代码既旧又丑陋。
这段代码的问题(以及我一般怀疑的许多PHP代码)是,它已经发展到了很好的结构,没有很多很好的剪切/粘贴代码,并且大量使用甚至涉及功能的全局变量。当然,在任何地方都不能进行单个单元测试,并且代码很难进行编码以使用特定的DB,并且依赖于调用该代码的网页中的$ _REQUEST字符串。
正确的做法是将部分代码作为子函数,整理它们并添加一些单元测试以确保其继续工作,并在此过程中添加一些模拟对象。但是,完全手动完成此操作很繁琐且容易出错,例如,我想知道如何做到这一点?我想要一个工具,可以从定义的代码段中生成函数,建议哪些变量应为参数,按值或者引用,自动添加$ this->引用等。
这是太多问题了吗,还是有一个好的解决方案?
谢谢!
解决方案
我感到你很痛苦。但是,我从未听说过这样的工具,至少对于PHP来说不是。
我认为该语言的结构甚至不足以允许任何类型的半自动重构。无论如何,我不知道有哪个应用程序可以做到这一点,但是从好的方面来说,手工完成这一切会使我们与源代码更加熟悉,这可能会以后比以往更好地了解自己的方法。使用自动化工具。
艾伦,我从未见过如此强大的重构工具。甚至Java的Eclipse重构都不是完整的功能。但是,有一些关于重构的常见提示。我通常分两步重构应用程序。
1.把事情分开。我提取数据库并建模相关的东西,并将其从主要代码中提取出来。一些对象表示会有所帮助。检查Active Record或者DAO模式是否有任何ORM工作。 HTML代码可以从主要代码中删除,然后移到模板文件中。检出漂亮的模板引擎,并强烈支持视图逻辑处理Smarty。
2.将内容放入MVC框架。 MVC是一个健壮的体系结构,非常适合Web应用程序。使用一种PHP框架将松散的PHP文件绑定到控制器方法中。框架使管理URL,HTTP请求,传递参数,管理登录信息变得容易,并且通常提供一些访问控制机制。
但是最重要的是:不要打破无法修复的东西。它是重构,而不是重新开发;-)
本文确实强调了重构/重新开发旧的难看代码的危险:
http://www.1729.com/blog/EconomicsOfTestingUglyCode.html
我的方法通常是一次解决一个小问题,首先是将许多旧代码隐藏在接口后面,在此之后可以"稍后"处理它而不影响任何新代码。这样,我编写的任何东西都可以设计得很好并且结构牢固,但是我不必浪费太多时间来尝试重构然后测试价值数周/月/年的不良代码。
没有工具会采用笨拙的代码,并且以某种方式使其变得更好。对于一个成熟的项目,"回到公式"这个短语是一个令人恐惧的前景,但是对我来说却是光秃秃的。
我建议我们将其移植到一个不错的MVC框架。这样,进行结构性重写可能不是一个坏时机,因此可以优化所有类(随着代码的不断发展,这种情况很少会自然发生)。这将花费很长时间,并且当事情无法按预期进行时会很痛苦。
这是迈出的一大步,但这就是让代码腐烂时发生的事情。
其他选择:
- 进行部分重组,其中所有新代码都遵循设定的规则,而旧代码则缓慢地重新开发。
- 只需修复错误,而不进行重组。
我正在仔细研究这个东西,并发现Accurev的一个客户写了一个有趣的博客。
http://blog.accurev.com/2008/09/17/dr-strangecode-or-how-i-learned-to-stop-worrying-and-love-old-code/
在工具箱中拥有正确的版本控制工具不会有任何问题。
以我的经验,在这种情况下完全重写将更经济。