【发布时间】: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 的语法
-
我找不到我的原始项目 :( 但我有它可以加载整个单元并显示所有类型/类、它们的成员、使用子句、常量的层次结构视图,以及你的情况,过程。例如,如果过程名称以
Svr或Cli开头,那么你可以识别它们,然后将它们分成名为TMySvr.DoSomething或TMyCli.DoSomething的对象。 -
无论如何,我的观点是,如果我(所有人中)可以进行这样的解析,那么我非常有信心您也可以通过自己的解析来完成这个障碍。
标签: delphi oop refactoring encapsulation