如何重构具有10000行而没有文档的Delphi单元?

时间:2010-10-13 13:33:38

标签: delphi refactoring

我被分配了重构Delphi单元的任务。哇。 10000行代码,无文档,大量复制和粘贴代码。

这里有很多复制和粘贴的方法都可以重构,无论如何我在所有这些行中丢失了,我有接口部分,我可以“找到我的方式”,但一般来说,yuo建议如何解决这个问题那种任务?

感谢。

8 个答案:

答案 0 :(得分:25)

  1. 获取Micheal Feathers的有效使用遗产代码的副本。它具有各种技术,可以安全地重构代码,使其在测试框架下运行。示例主要是Java和C ++,但应该很容易理解。
  2. 安装第三方重构工具(或多个),例如CodeRush for Delphi(遗憾的是不再开发),Castalia或ModelMaker Code Explorer。 Delphi内置了一些重构支持,但根据我的经验,它太有限了,并且往往会扼杀非常大的代码库。
  3. 购买一份Simian。它没有对Object Pascal的直接支持,但它的纯文本解析器运行良好。如果有足够的人请求支持Object Pascal,我确定他们会添加它。我还没有发现任何其他代码重复检测工具像Simian一样强大。
  4. 我还建议为http://www.refactoring.com/catalog/http://www.industriallogic.com/xp/refactoring/catalog.html添加书签。

    获得罗伯特“叔叔鲍勃”马丁等人的清洁代码:敏捷软件工艺手册的副本也没有什么坏处。识别坏代码很容易。当你编写好的代码时,要知道的更难了。

    提醒:专注于重构您需要处理的代码。很容易开始挖掘兔子洞并花费数月时间重构与手头任务无关的代码。

    为自己省点麻烦。不要试图“修复”代码并同时重构它。重构第一个,然后修复错误或添加新功能。请记住,重构正在修改而不会改变外部行为

    拒绝尝试完全重写的冲动。我很难理解,满足用户要求的糟糕代码比干净代码要好。蹩脚的代码总是可以逐步改进,直到引起骄傲为止。

答案 1 :(得分:16)

我认为您可以做的最好的事情是为界面编写DUnit Tests。它会强制您理解现有代码,在调试过程中提供帮助,并确保在重构​​后界面的行为相同。

Top 12 Reasons to Write Unit Tests适用于您的情况:

  • 测试减少新功能中的错误。
  • 测试减少现有功能中的错误。
  • 测试是好文档。
  • 测试降低变更成本。
  • 测试改进设计。
  • 测试允许重构
  • 测试约束功能
  • 测试防御其他程序员
  • 测试很有趣
  • 测试强迫你减速和思考
  • 测试使开发更快
  • 测试减少恐惧(害怕变化,害怕破碎,害怕更新)

答案 2 :(得分:5)

我遇到过类似的情况。我向你表示哀悼!

在我看来,最重要的是你实际上理解了今天的所有代码。比我更好的思维可以简单地阅读代码并理解它。但是,我不能。

在阅读了一般概述的代码之后,我通常会在调试器中反复单步执行它,直到我开始看到一些操作模式并识别我之前读过的代码。也许这很明显,但我想我会提到它。

您也可以考虑创建一个在当前代码上运行的优秀测试套件。

答案 3 :(得分:3)

接口部分是否包含一堆类定义?如果是这样,为每个类创建一个新单元并将每个类移动到它自己的单元。
如果你使用Delphi 2007或更好,你可以使用“refactor / Move”选项将这些类移动到新的(名称空间) )单位。
下一步是将大班分成小班。这只是很多手动工作。
一旦你的代码被划分为多个单元,你可以检查每个单元,检测相同的代码并生成基类,这些基类将用作共享相似功能的两个类的父类。 / p>

答案 4 :(得分:2)

除了理解代码等之外,这些工具还可以帮助重构和重新组织项目:

Model Maker是功能强大的设计,反向工程和重构工具:http://www.modelmakertools.com/modelmaker/index.html

Model Maker Code Explorer是Delphi IDE的强大插件,可帮助重构,代码导航等:http://www.modelmakertools.com/code-explorer/index.html

答案 5 :(得分:1)

我会使用某种UML工具来生成som类图和其他图表以获得系统的概述,并开始像@Workshop Alex那样分裂和评论。

答案 6 :(得分:0)

使用像Doxygen这样的工具来帮助您映射代码。

帮助就是here

答案 7 :(得分:-1)

从小处开始,最后进行部分或全部重写。开始创建基类以完成拼图的各个部分,而无需更改输出。冲洗重复,直到你有一个新的,可支持的代码库。 一旦你点击了那些copy-n-paste例程,你就会有基类来完成这项工作,这真的有助于加快这项任务。