Delphi 当UI组件具有内置功能时,如何将应用程序逻辑与UI分开?

Delphi 当UI组件具有内置功能时,如何将应用程序逻辑与UI分开?,delphi,oop,separation-of-concerns,Delphi,Oop,Separation Of Concerns,我知道将用户界面代码与域代码分开很重要——应用程序更容易理解、维护、更改和(有时)隔离bug。但这是我的心理障碍 Delphi附带了一些组件,这些组件的方法可以满足我的需要,例如,RichText Memo组件可以让我处理RichText。其他组件,比如TMS的字符串网格,不仅满足了我的需求,而且我还为其功能支付了额外的费用。这些特性使R变为RAD 写我自己的类来做别人已经为我做过的事情似乎不合逻辑。这是在重新发明轮子[有没有试过直接使用富文本?:-)]但是如果我使用内置在这些组件中的功能,那么

我知道将用户界面代码与域代码分开很重要——应用程序更容易理解、维护、更改和(有时)隔离bug。但这是我的心理障碍

Delphi附带了一些组件,这些组件的方法可以满足我的需要,例如,RichText Memo组件可以让我处理RichText。其他组件,比如TMS的字符串网格,不仅满足了我的需求,而且我还为其功能支付了额外的费用。这些特性使R变为RAD

写我自己的类来做别人已经为我做过的事情似乎不合逻辑。这是在重新发明轮子[有没有试过直接使用富文本?:-)]但是如果我使用内置在这些组件中的功能,那么我最终将得到大量混合的UI和域代码——我将有一个表单,其中大部分代码都内置在它的事件处理程序中

你如何处理这个问题。。。或者,如果我想继续使用别人为我编写的代码,你会建议我如何处理这个问题?

首先,记住“处理富文本”不是你的应用程序应该做的。你的应用程序应该允许用户执行某项任务,而处理该任务的代码就是你的域逻辑。如果程序需要完成的部分任务涉及使用富文本,则可以将该部分任务委托给富文本组件。正如您所提到的,复杂性来自这些库和域逻辑之间的接口

Delphi域逻辑和Delphi UI控件之间交互的方式主要是通过事件处理程序。但这并不意味着您需要将域逻辑放入事件处理程序本身。相反,尝试编写包含您需要完成的特定于域的任务的代码的单元,并让事件处理程序调用这些单元


换句话说,不要编写类来重新发明轮子,做别人已经为你做过的事情。你说得对,那是不合逻辑的。但是,将您使用的控件和库没有提供的特定于应用程序的部分编写为它们各自独立的单元中的独立类,并通过事件处理程序和窗体上的公共方法或属性将它们连接起来,最后,您将获得适当的关注点分离。

您可以通过使用带有ClientDataSet的数据模块来包含业务逻辑和数据对象,从而创建一个相当干净的分离。您甚至可以更进一步,将业务逻辑从数据中分离出来。显然,表单包含UI。几乎您使用的每个组件都可以进行数据绑定,这使得将它们绑定到ClientDataSet变得很容易


请记住,Delphi有一种做事情的方法,它并不总是适合Java或.Net的最佳实践。你的目标应该是做一些让人感觉正确并且对Delphi有用的事情。

不要被诱惑到视觉方面形成了R。Rapid源于“支持快速原型化的最小规划”,适用于所有层,甚至适用于web服务的快速原型化(显然根本没有UI)。@Jeroen:当然,但我认为他是在问/如何/不要被引诱进入它,或者如何使用RAD环境编写代码,但不要被这个陷阱抓住。@David:谢谢你的观点。我没想到。但这确实是一个有趣的观点。