如何/是否重构一个仅使用窗体和数据模块的Delphi程序

20

经过多年的编写Delphi程序,我发现这些代码难以进行测试,其中包含全局变量,且唯一的类就是表单本身,包含了所有UI相关的代码。

如果我想将代码转换为执行实际工作的一组类,该怎么做呢?我需要停止使用数据源/数据集并在类中完成所有操作吗?我需要一个ORM吗?

通常情况下表单上的代码不需要重用,所以将逻辑转换为类是否有意义呢?

6个回答

28
如果我遇到一个表单(或其他类)的职责过多,我通常会遵循以下模式:
  1. 为逻辑定义一个新类。
  2. 在表单中创建一个新类的成员变量。
  3. 在表单的onCreate方法中创建该类,在onDestroy方法中释放该类。
  4. 将单个逻辑部分(例如变量)移动到新类中。
  5. 移动或创建所有方法到新类中。
  6. 编译和测试。
  7. 不断重复以上步骤,直到所有逻辑都放入新类中。
  8. 尝试将逻辑类与表单类解耦。(如果你喜欢,甚至可以使用接口)。
有时候一个单一的类是不够的,所以创建更多的类也不是问题。而且这些类也可以拥有其他类。
通过这些步骤,您可以处理大部分这类问题。

8
不错的步骤,但有一个提示:为了最小化耦合,请不要将任何可视化控件传递给新类。如果这样做,您会限制替换UI控件的能力。如果必须传递可视化控件(特别是网格等),则请将所有内容隔离在另一个没有业务逻辑的类中。 - Jim McKeeth
我同意,可见控件是表单的责任。虽然可以使用框架,但我不太喜欢在生产代码中使用它们。 - Toon Krijthe
1
所有的观点都很好。那么,对于依赖于特定数据库连接和数据表对象(TTable、ADO数据集或datasnap等)的东西,如何进行单元测试呢? - Warren P
1
@Warren P,使用数据库时,您可以模拟整个数据库接口,或者您可以为每个测试设置一个特殊的测试数据库。我更喜欢后者,但它会稍微减慢测试速度。 - Toon Krijthe

8

首先,我强烈推荐阅读Martin Fowler的书籍《重构》

这将使您真正了解如何明智地处理现有(非面向对象)代码并改进可维护性。

在清楚了解ORM对应用程序带来的利益之前,不要考虑使用ORM。


5
我曾经遇到过一个应用程序的问题,我开始采取以下步骤:
  1. 为代码中最通用的逻辑定义主要类。
  2. 在每个表单中,将处理业务逻辑的代码移动到该表单的事件函数/过程中。
  3. 然后将这些函数/过程作为静态方法移动到这些类中。
  4. 最后只需在表单中保留必要的代码,如验证UI和对类的调用。
  5. 对于全局变量,尽可能省略它们,并将值作为参数传递给方法。
我使用静态方法,因为这样可以更轻松地从事件中删除代码,并且无需为每个操作创建/释放对象即可调用它们。原始设计并未将表单与业务逻辑代码分离。
最终应用程序并不完全是面向对象的,但至少测试方法比以前不需要与表单和事件进行交互。
有时候你会觉得如果从头开始重新设计应用程序,比起做出真正的面向对象设计更容易。

4

我可以强烈地推荐另一本书——在我个人看来,比Fowler的“通用”重构书更适合的是Michael Feathers的《遗留代码有效工作》。它真正展示了你在进行这种工作时会遇到的主要障碍。哦,还有:重构遗留代码可能会对你的心理造成很大的压力。希望你能处理好挫折……我喜欢这句话(不记得从哪里得到的):“上帝之所以能在6天内创造世界,就是因为没有任何遗留代码”。祝你好运。;)


4

当我面对现有的Delphi项目时,我的第一步是将其导入 Modelmaker。Modelmaker将帮助您重构代码,因为:

  • 它以图形方式表示所有类、方法、变量等。
  • 它与Delphi IDE紧密集成(主菜单、弹出菜单、独立的Modelmaker资源管理器、工具栏、键盘快捷键)。这种集成使您能够在不离开IDE的情况下快速执行必要的操作。
  • 它有一个专门的“重构”模块,允许您快速创建、移动和重命名类和变量,而不必担心更改底层代码。Modelmaker将自动更改所有单元中的名称和引用。

Modelmaker的基本功能很容易学习。Modelmaker就像其他好的生产力工具一样-你投入的越多,得到的回报就越多。 Modelmaker不是免费的,但可以通过提高生产力轻松赚回成本。 我没有找到比它更好的工具来重构旧版Delphi代码。他们提供免费试用和一些不错的教程视频。 试试Modelmaker,祝你好运...


没有对ModelMaker有任何偏见,但是你提到的所有东西现在都已经内置了。尽管如此,如果你使用旧版的Delphi还是挺有帮助的,给你一个+1。 - Wouter van Nifterick
谢谢 - 我仍在使用Delphi 5。我知道Modelmaker的开发人员与Borland有代码共享协议。许多Modelmaker功能已集成到Delphi IDE中。我猜如果所有Modelmaker功能都集成在IDE中,那么没有人会花199欧元购买许可证了。 - Kris De Decker
1
@Kris, 实际上,重构功能的集成并不是来自ModelMaker,而是来自Borland Together(它要复杂得多)。我既使用过Delphi默认建模,也使用过ModelMaker,对于Delphi开发人员来说,ModelMaker更容易理解。 - Fabricio Araujo
+1; 注意,ModelMaker和ModelMaker Code Explorer是两个不同的产品。ModelMaker是UML工具,ModelMaker Code Explorer是紧密集成在Delphi IDE中的重构工具。它比已经存在于IDE中的重构功能要好得多(首先,它可以在代码没有完全编译时操作,而且还有更多更好的重构功能)。很久以前,ModelMaker曾包含在Delphi中(在Together集成之前)。我希望他们能继续下去。关于内置的重命名符号重构功能的一个好处是:它涵盖了整个项目。 - Jeroen Wiert Pluimers

1

在了解您需要重构代码之后,如果您想要一个OPF/ORM,我建议使用Jazz SDK


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接