20

经过多年将 Delphi 程序编码为表单和数据模块中不可测试的代码,包括全局变量,唯一的类是表单本身,包含表单 UI 本身所需的所有代码。

我如何将代码转换为一组执行实际工作的类?我是否需要停止使用数据源/数据集并在课堂上做所有事情?我需要 ORM 吗?

表单中的代码重用通常是需求,那么将逻辑转换为类是否有意义?

4

6 回答 6

28

如果我遇到一个责任太多的表单(或其他类),我通常遵循以下模式:

  1. 为逻辑定义一个新类。
  2. 在表单中创建新类的成员变量。
  3. 在 onCreate 中创建类并在表单的 onDestroy 中释放它。
  4. 将单个逻辑(例如变量)移动到新类。
  5. 将所有方法移动或创建到新类。
  6. 编译和测试。
  7. 继续,直到所有逻辑都放入新类中。
  8. 尝试将逻辑类与表单类解耦。(如果您愿意,您甚至可以使用接口)。

存在单个类不够用的情况,因此创建更多类是没有问题的。而且这些类可以有其他类来。

通过这些步骤,您可以解决大部分问题。

于 2009-02-14T19:32:25.977 回答
8

首先,我强烈推荐阅读Martin Fowler 所著的Refactoring一书。

这将使您真正了解如何最好地明智地引入对现有(非 OO)代码的更改以提高可维护性。

在您清楚地了解 ORM 会给您的应用程序带来什么好处(如果有的话)之前,我不会看 ORM。

于 2009-02-14T17:11:57.920 回答
5

我在一个应用程序中遇到了这样的问题,我开始执行以下操作:

  1. 为代码中的大多数通用逻辑定义主类。
  2. 在每个表单中,将处理事件内部业务逻辑的代码作为该表单中的函数/过程移动。
  3. 然后将这些函数/过程作为静态方法移动到这些类中。
  4. 最后,只在表单中编写所需的代码,如验证 UI 和对类的调用。
  5. 对于全局变量,尽量省略,只需将值作为参数传递给方法。

我使用了静态方法,因为您可以更轻松地从事件中删除代码并调用它们,而无需为每个操作创建/释放对象。最初的设计并不是为了将表单与业务逻辑代码分开。

最终的应用程序不是完整的 OO,但它至少更容易测试方法,而无需像以前那样与表单和事件进行交互。

有时您会觉得,如果您从头开始重新设计应用程序,这将比进行更改以使其成为真正的 OO 设计更容易。

于 2009-02-15T07:50:48.843 回答
4

我强烈推荐的另一本书——在我个人看来甚至比 Fowler 的“通用”重构书更适合——是Michael Feathers 的“Working Effectively with Legacy Code”。它真正展示了您在进行此类工作时会遇到的主要障碍。哦,还有:重构遗留代码对你来说可能非常困难。我希望你能处理挫折......我喜欢这句话(不记得我从哪里得到它):“上帝能够在 6 天内创造世界,只是因为没有任何遗留代码”。祝你好运。;)

于 2009-02-14T20:44:47.783 回答
4

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

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

Modelmaker 的基本功能简单易学。Modelmaker 就像任何其他优秀的生产力工具一样 - 你投入的越多,你得到的就越多。Modelmaker 不是免费的,但可以通过提高生产力轻松收回成本。我还没有找到更好的工具来重构遗留的 Delphi 代码。他们提供免费试用和一些不错的教程电影。试试 Modelmaker,祝你好运……

于 2009-02-21T03:06:34.763 回答
1

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

于 2009-02-14T18:31:36.153 回答