如何重构现有的Web应用程序?


11

最近我一直在阅读和思考很多,得出的结论是,也许我应该重新考虑我的Web开发策略。我正在做大量的即时编程,在过去两年中,我一直在研究PHP Web应用程序,当一个小工具变成一个相当大的项目时,它可能已经开始了。但是我和我的前任有很多遗留代码,这些代码片段在当时可能很有意义,但是现在我在质疑所说代码的实际形式。而且,直到最近,诸如单元测试和测试驱动开发之类的东西才在我的范围之内。

那么您将如何重构Web应用程序?我应该寻找什么东西,以什么顺序排列?浏览器游戏与功能性网络应用程序又如何?那么方法上会有区别吗?


4
如果没有损坏,请不要修复。花更多的时间编写测试,而花更少的时间进行不必要的更改。
Macneil 2010年

只是出于兴趣。您使用什么语言/技术编写应用程序?这是什么样的网站?参见welie.com/patterns- >设计上下文->网站类型
JW01 2010年

@ JW01我将PHP用于内部逻辑,将AJAX用于视图管理和表单验证。这将是基于Web的应用程序模式的变体,但仅在给定的环境中可用,因为它是内部工具。
Eldros 2010年

当我回答问题时,我脑海中对您的应用程序有了完全不同的印象。与在公共领域中相比,您拥有更大的自由来更改API。
2010年

@ JW01我不想太具体,因为我希望这个问题对其他人也有用。
Eldros

Answers:


6

处理任何类型的遗留代码几乎相同。您发现一块可测试的东西,为它编写测试,然后重构。

如果找不到易于测试的代码,则需要在没有测试套件安全性的情况下使其可测试,在这种情况下,您非常仔细地更改一些几乎可以测试的代码,以便对其进行测试。

不会将内容呈现给浏览器的代码-“基础结构”代码,模型,涉及数据库的内容-可能是一个很好的起点。

编辑:UI测试:在警告我在这里经验不足的情况下,我的一个朋友这样做了:他运行了一些HTML生成代码。然后,他修改了自己的代码,并将新生成的代码与旧版本进行了比较(使用diff;他并没有完全自动化)。HTML中的更改意味着您的重构中断了。


您将如何建议测试遗留应用程序的“视图”部分-IE,HTML / JavaScript / CSS / etc部分?我同意单元测试是必经之路,但是应用程序代码的测试似乎很难自动化。
贾斯汀·埃斯蒂尔2010年

在为Web UI创建测试时-将旧HTML与新HTML进行比较是一种比较脆弱的工作方式。我倾向于识别网页的语义并进行测试。即问“网络烙印(页面标题,标题,关键字,出站链接,表格)是否已更改?” 而不是“ HTML是否已更改?”。
JW01 2010年

您可以使用“无头浏览器”测试网络应用程序-基本上是一个库,用于单元测试什么是质量检查人员使用的浏览器。在Java世界中,有HTMLUnit(纯Java,自包含)和WebDriver(远程控制像FireFox这样的真实浏览器)。我的项目中有成百上千个这样编写的测试套件。
汤姆·安德森

@ JW01你说的很对-非常脆弱。这对于一次完成一次重构的测试非常有用:您可以检查重构是否不会改变输出,但是每次更改生成的HTML时,都必须保存“新的预期” HTML。
Frank Shearar 2010年

10

迈克尔·费瑟斯(Michael Feathers)有一本很棒的书叫做“有效地使用旧版代码”。面对现实,我们都有遗留代码。

最主要的是测试驱动您正在创建的新代码。当您需要处理其他代码时,也会发现机会对其进行测试。这是一个漫长而缓慢的过程,但是如果您系统地进行此工作,则可以随着时间的推移真正改善整体产品。


3
“面对现实,我们要做的就是今天编写明天的旧版软件。”
-Martin

3
  • 是的-Web应用程序与网站不同

我会分开对待他们。如果您的网站只有一部分是文档集合(匿名用户和登录用户看起来都一样),那么构造网站的最佳方法与提供动态不同页面的Web应用程序大不相同。给每个用户。将网站的这两部分分成两个应用程序/组件,并分别处理每个部分。

  • 开始使用版本控制

一旦您的代码受版本控制,您就可以仔细检查并删除以前保留的所有不必要的代码,以防万一,以防万一。我不知道如果没有版本控制,我该如何生存。

  • 减少无穷

如果四个不同的URL都指向同一个资源,那么问题就更大了。您最终要处理无限数量的网址。请尽快确保已制定URL规范化策略。完成此操作后,您可以开始将语义含义附加到URL上,并能够从资源到URL进行反向查找。这使您可以将“网络烙印”与站点的“资源”分开。

您必须问自己:“给定的URL的标准化形式是什么?”。一旦将其固定下来。然后,您网站上的50,000个以上的网址可以减少为2,000个。在您的脑海中更容易理解和管理。

参见:http : //www.sugarrae.com/be-a-normalizer-a-c14n-exterminator/

  • 首先建模“是什么”,而不是“您想要什么”

如果您要整理一个遗留站点,那么从一开始就没有考虑最佳实践,那么很容易从“混乱”过渡到“理想设计”。我认为您至少需要执行两个步骤:“混乱”->“建模良好的遗留代码”->“具有附加功能的理想新代码”。停止添加功能。专注于修复混乱或将其封装在反腐败层后面。只有这样,您才能开始将设计更改为更好的东西。

请参阅:http//www.joelonsoftware.com/articles/fog0000000069.html

请参阅:http//www.laputan.org/mud/

  • 对其进行测试是一个好主意。

创建一个测试套件/框架并开始添加测试。但是,测试一些遗留代码非常棘手。因此,不要太挂了。只要有框架,就可以一点一点地添加测试。

请参阅:http : //www.simpletest.org/en/web_tester_documentation.html

  • 坚定信念

有关软件开发最佳实践的大多数文献都是以桌面为中心/以企业应用程序为中心的。当您的网站混乱不堪时,您可以阅读这些书,并且可以敬畏从书中散发出的智慧。但是,不要忘记,大多数最佳实践是在Web / SEO变得重要之前就已经积累的。您对现代网络了解很多,比诸如POEA,Gof等经典书中所提到的要多。有很多可以借鉴的东西,但请不要完全舍弃自己的经验和知识。


我可以继续。但是,当我将一个旧的遗留站点重构为一个闪亮的新站点时,我已经选择了一些东西。


很好的参考链接!
Nilesh

2

在执行任何操作之前,最好将项目置于源代码控制中。这样,您可以回滚更改,或在单独的分支上进行主要更改,以及标记里程碑。

接下来,为计划更改的任何代码编写测试。您无需一次全力以赴,为所有内容编写测试。您打算立即进行的工作。从理论上讲,如果有足够的时间,大多数代码库都将被测试覆盖。请注意,某些重构无需测试即可“安全”- 前面提到的“ 旧版法规”书中对此进行了记录,而其他地方无疑也是如此。

在对一部分代码进行测试之后,更改代码。只要测试仍然通过,您就可以做任何您需要做的事情。

即使使用旧版代码,如果进行添加或更改,也可以执行TDD。只需首先为预期的更改编写测试,看看它们失败,然后进行更改。

这里有些工具可能有用。NDepend可以指出高度耦合的代码和其他气味。NCover跟踪您的代码覆盖率级别。FxCop本质上是一个代码正确性检查器,它超出了编译器的工作范围。这些都是有用的工具,可用于任何实际规模的项目,尤其是旧式项目。

最终,这是一个多步骤的过程。不要尝试一次全部完成,只需一次尝试一下。


-2

如果丑陋到足以让我生气,那么丑陋到足以让我删除整个内容并写下替换内容。

您会发现,这样做通常需要花费相同的时间,就像坐在那里,脚尖指着一个无组织,无证件的混乱并轻轻地抚摸它一样。


2
我不同意(尽管我没有给您-1)。 joelonsoftware.com/articles/fog0000000069.html
JW01 2010年

1
准确地为自己辩护实在是一个情境决定。当我使用庞大的Objective-C库时,我可能不会这样做,但是,对于编写全新的javascript库,我没有任何疑虑。
偷偷摸摸的

好主意!我希望我读了Joel Spolsky的文章,该文章与2年前链接到@ JW01之前,我决定使用Angular&Bootstrap重写现有的PHP应用程序。Angular&Bootstrap是很棒的技术,但两年后我仍在尝试转换此旧应用程序。我应该已经修改了现有的应用程序,而不是删除/替换了它。
Zack Macomber

我特别同意您的评论。“方案”是决定决策的关键。您是否应该淘汰可为您的整个业务服务的庞大API?谁知道,还有很多需要考虑的问题。您希望先进行测试,然后再进行测试。链接到的文章太线性了,就像只有一个大小适合所有人一样,但是当有错误或确实是旧代码时,该怎么办?这篇文章是否真的暗示我们不应该使用更易于阅读和维护的较新代码从旧版本继续前进?开发者世界中没有黑白两色,只有场景和决策
James
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.