【问题标题】:Is there any tool or add-in for Delphi that I can use to help refactor code that is Not Object Oriented?是否有任何用于 Delphi 的工具或插件可用于帮助重构非面向对象的代码?
【发布时间】:2012-06-22 01:23:58
【问题描述】:

我有一个大型代码库,我正在使用其中的单元如下:

unit myformunit;

interface
type
  TMyForm = class(Form)
  end;

  procedure not_a_method1;

  procedure not_a_method2;

  var
     global1,global2,global3:Integer;
  ...

简而言之,代码的作者没有编写方法,而是编写了全局过程。有数以万计的。在这些过程中,它们引用了 MyForm:TMyForm 的单个实例。

我正在考虑编写一个解析器/重写器实用程序,它将把这段代码变成“至少最低限度的面向对象的代码”。策略是将接口和实现部分全局变量移动到表单中,作为开始。我意识到这不是优雅的 OOP。但这比 globals 向前迈进了一步。

如果我一次可以在一个单元上执行此操作,那么我可能能够修复项目其余部分中的破损,如果我一次只在一个表单上执行此操作。但我想减少重写单元所需的时间,而不是手工完成。有些表单有 500 多个过程和 500 多个接口和实现全局变量,这些变量实际上是特定于它们在同一单元中的表单的单个实例的状态。

基本上,如果不存在这样的情况,我会做的是编写一个基于 Castalia Delphi 解析器的解析器。我希望 ModelMakerCodeExplorer、castalia 或其他类似工具至少可以满足我的部分需求,因此我不必自己构建这个实用程序。即使我必须自己构建它,我估计它可能会自动为我完成大约一千到两千小时的繁重工作。我至少可以运行它,然后看看有多少中断,然后在我决定重构这段代码的努力程度后恢复或提交。

实现相同目标的替代策略(从零封装和零 OOP,到更多封装,以及略大于零 OOP,以增量方式,在大型非结构化 delphi 代码库上,仅在不可避免时使用对象,并且从未对真正的 OOP 有任何想法)受到欢迎。

【问题讨论】:

  • 经历过类似的事情,我只能说,祝你好运,你会需要它的。 :(
  • 很好的问题和场景,只是我认为 1-2K 小时(大约 40 天不间断)可能比它可能需要的时间多一点。在使用正确的工具之前,我已经完成了 一些 pascal/dfm 解析,实际上并不难。我正在尝试找到我现在使用的东西,但我相信它类似于“Gold Parser”,它可以为 Pascal 明确添加一个附加组件......goldparser.org/engine/1/delphi/index.htm
  • 实际上,他们的“语法”特别是针对 Delphi 7 的语法
  • 我找不到我的原始项目 :( 但我有它可以加载整个单元并显示所有类型/类、它们的成员、使用子句、常量的层次结构视图,以及你的情况,过程。例如,如果过程名称以 SvrCli 开头,那么你可以识别它们,然后将它们分成名为 TMySvr.DoSomethingTMyCli.DoSomething 的对象。
  • 无论如何,我的观点是,如果我(所有人中)可以进行这样的解析,那么我非常有信心您也可以通过自己的解析来完成这个障碍。

标签: delphi oop refactoring encapsulation


【解决方案1】:

将全局变量更改为表单字段似乎只是剪切和粘贴它们。您可能会考虑将它们移动到一个虚拟过程中,并首先使用 MMX 来规范化声明。

然后使用ModelMaker Code Explorer将程序和函数移动到表单中,在成员视图中只是剪切和粘贴。

没有必要,但下一步从方法体中删除对表单实例的引用。这可以通过查找和替换来实现。

还是我错过了什么?

【讨论】:

  • 我需要帮助的不是剪切和粘贴,而是必须进行的重构。想象一下,有 10,000 个全局变量从 unitnamespace.globalname 移动到 unitnamespace.GlobalInstance.globalname。现在对整个项目进行同步编辑,并更新所有用于编译的引用。如果模型制造商 MMX 将对这些全局参考进行全局修复,那么它就是我的救星。
【解决方案2】:

Delphi Sonar plugin(开源)不修复代码,但可以使用和配置搜索“坏代码”:

Delphi Sonar 插件可以对使用编写的项目进行分析 德尔福或帕斯卡。它使用 Delphi 6、7、 2006 和 XE。这个插件是 Sabre Airline Solutions 的捐赠。它的 测试包括:代码行数、语句、文件数、 类、包、方法、访问器、公共 API(方法、类 和字段),cmets比率,CPD(代码重复,多少行, 块以及在多少个文件中),代码复杂性(每个方法,类, 文件;方法、类和文件的复杂性分布),LCOM4 和 RFC、单元测试报告、规则、代码覆盖率报告、源代码 单元测试突出显示,“死”代码识别,未使用文件 识别。

【讨论】:

  • 在这种情况下,我可以简单地报告文件长度,并说“.pas 文件中有 175,000 行,175,000 行错误代码”。 :-)
猜你喜欢
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 2011-07-29
相关资源
最近更新 更多