10.6 关于混合RAD和OOP的15个技巧
在本章中,我介绍了与快速应用程序开发(RAD)或可视化开发或事件驱动编程(这个三个术语都指的是同一个概念模型)相关的核心语言特性,包括属性、事件和published关键字。虽然这是一个非常强大的模型,但它有坚实的面向对象编程(OOP)架构作为后盾。有时,RAD方法可能会使开发人员忘记良好的OOP惯例。与此同时,回到纯粹的代码编写而忽略RAD方法通常又适得其反。在本章的最后一节中,我列举了一些混合这两种方法的技巧和建议。换句话说,这是“超越RAD的面向对象编程”的一个章节。
注意:本章最后一节的内容最初发表在《The Delphi Magazine》第17期(1999年7月),标题为“Delphi中的面向对象编程的20条规则”。现在我删减一些规则,对其他规则也进行了修订,但精髓任然保留。
技巧1:窗体是一个类
程序员经常将窗体视为对象,而实际上它们是类。区别在于,您可以基于相同的窗体类创建多个窗体对象。令人困惑的是,IDE创建一个默认的全局变量,并且(根据您的设置)还可以在启动时为您在项目中定义的每个窗体类创建一个窗体对象。这对新手来说当然很方便,但对于任何规模大一点的应用程序来说通常是一个不好的习惯。
当然,为每个窗体(及其类)和每个单元命名是非常重要的。不幸的是,这两个名称必须不同,但您可以使用一种约定以一致的方式映射这两个名称(例如,AboutForm和About.pas)。
在下面的步骤中,您将看到“窗体是一个类”这个概念的实际效果。
提示2:为组件命名
对于组件,使用描述性的名称很重要,不要使用窗体设计器分配的默认名称。最常见的符号是使用类类型的前几个字母,后跟组件的角色,例如BtnAddCustomer或EditName。实际上,有许多类似的符号遵循这种风格,并且真的没有理由说其中任何一个是最好的,这取决于您的个人喜好。
提示3:为事件命名
为事件处理器命名同样重要。如果您为组件命名,例如,OnClick处理程序的默认名称变为BtnAddCustomerClick。尽管我们可以从按钮名称猜测方法的作用,但我认为最好使用描述方法效果命名,而不是方法触发的时机。例如,按照方法名字就是方法的作用的方式,BtnAddCustomer按钮的OnClick事件可以命名为AddCustomerToList。这使得代码更具可读性,尤其是当你从类的另一个方法中调用事件处理程序时,并有助于开发人员将相同的方法附加到多个事件或不同的组件上;但我不得不说,在任何非小程序中,将单个事件附加到多个用户界面元素时,使用 Actions 是首选。
注意 Actions 和 ActionList 组件是 VCL 和 FireMonkey UI 库的一个非常好的架构特性,它们提供了用户操作(及其状态)与它们关联的用户界面控件之间的概念分离。激活控件即可执行操作。事实上,如果从逻辑上禁用操作,与该操作相关的用户界面元素也会被禁用。这个话题超出了本书的范围,但如果你使用 VCL 或 FMX 库,还是值得研究一下的。
技巧 4:使用窗体方法
如果窗体是类,那么它们的代码就集中在方法中。除了事件处理程序,它们起着特殊作用但仍然可以像其他方法一样调用之外,向窗体类添加自定义方法通常是有用的。您可以添加执行与窗体相关的一般操作和操作的方法,并访问窗体组件的状态。向窗体添加公共方法和属性要比直接从系统的其他部分直接访问窗体组件好得多。
技巧 5:添加窗体构造函数
在运行时创建的辅助窗体可以提供除了默认构造函数(继承自TComponent类)之外的其他特定构造函数。当您需要进行特定的初始化时,我的建议是重载Create方法,添加所需的初始化参数,如下面的代码片段所示:
publicconstructor Create(const AText: string); reintroduce; overload;constructor TFormDialog.Create(const AText: string);
begininherited Create(Application);Edit1.Text := AText;
end;