10

我有一个大型代码库,我正在使用它有这样的单元:

unit myformunit;

interface
type
  TMyForm = class(Form)
  end;

  procedure not_a_method1;

  procedure not_a_method2;

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

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

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

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

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

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

4

2 回答 2

1

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

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

不是必需的,但作为下一步从方法主体中删除对表单实例的引用。这可以通过查找和替换来实现。

还是我错过了什么?

于 2012-06-20T08:27:21.740 回答
0

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

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

于 2012-06-20T09:35:26.883 回答