您在常见的Delphi编程中实现了哪些设计模式?哪些模式更容易适应Delphi编程? (每种语言在不同领域都很出色,那么使用Delphi时哪些模式可能是非常强大的结构?)
如果你能说出Delphi 2009/2010的设计模式的一些变化(因为那些支持泛型,以及2010年的RTTI),我会很高兴。
野外互联网上有很多文章,但它们没有讨论日常可用性和模式的变化。 (他们中的大多数只讨论语言细节,架构的变化)。
答案 0 :(得分:22)
只有少数Delphi开发人员知道每个Delphi开发人员都使用Factory pattern(delphi.about.com有example in "regular" Delphi),但随后使用虚拟Create构造函数实现。
所以:是时候了解一下: - )
虚拟构造函数对于像虚拟方法这样的类就像对象实例一样。
工厂模式的整个想法是,你将决定从实际创建中创建的东西(在本例中为“对象实例”)的类型(在本例中为“类”)的逻辑去耦。
它使用虚拟的Create构造函数:
TComponent有一个virtual Create constructor,所以可以被任何降序类覆盖:
type
TComponent = class(TPersistent, ...)
constructor Create(AOwner: TComponent); virtual;
...
end;
例如TDirectoryListBox.Create constructor会覆盖它:
type
TDirectoryListBox = class(...)
constructor Create(AOwner: TComponent); override;
...
end;
您可以在“类型类型”类型的变量中存储类引用(类似于对象实例引用的类)。对于组件类,有一个预定义类型TComponentClass in the Classes unit:
type
TComponentClass = class of TComponent;
当你有一个TComponentClass类型的变量(或参数)时,你可以进行多态构造,这与工厂模式非常相似:
var
ClassToCreate: TComponentClass;
...
procedure SomeMethodInSomeUnit;
begin
ClassToCreate := TButton;
end;
...
procedure AnotherMethodInAnotherUnit;
var
CreatedComponent: TComponent;
begin
CreatedComponent := ClassToCreate.Create(Application);
...
end;
Delphi RTL在这里使用它:
Result := TComponentClass(FindClass(ReadStr)).Create(nil);
在这里:
// create another instance of this kind of grid
SubGrid := TCustomDBGrid(TComponentClass(Self.ClassType).Create(Self));
Delphi RTL中的第一个用途是整个创建过程如何处理从DFM文件中读取的表单,数据模块,框架和组件。
表单(datamodule / frame / ...)实际上有一个(已发布的)组件列表(datamodule / frame / ...)。该列表包括每个组件的实例名称和类引用。 当读取DFM文件时,Delphi RTL然后:
普通的Delphi开发人员通常从未发现过这种情况,但如果没有它,整个Delphi RAD体验都不会存在。
Allen Bauer(Embarcadero的首席科学家)也写了一篇简短的blog article about this topic。 关于SO还有where virtual constructors are being used个问题。
如果对虚拟的Create构造函数主题有足够的了解,请告诉我: - )
- 的Jeroen
答案 1 :(得分:6)
你可以找到关于GOF模式和Delphi习语等价的an excellent article by Marco Cantu。我记得参加他关于这个主题的Borcon会议,这很棒 要记住的一个主要想法是需要设计模式来补充语言/框架的缺点。如果你有一个原生的习语,你不需要重新发明轮子并实现整个GOF shebang,只要学会识别并命名它(正如Jeroen对他的superb explanation on the Factory所做的那样)。
答案 2 :(得分:2)
我经常使用以下模式:
答案 3 :(得分:2)
我经常使用以下模式:
答案 4 :(得分:2)
非OOP编程(有人称之为结构化编程)在Delphi程序员中很常见。它非常简单:您创建一个执行某项操作的函数,它与记录/类似对象的数据结构无关。示例:IntToStr()
Delphi做得非常好,因为使用接口/实现部分提供封装,并且因为生成的机器代码非常有效。在编译时,它还支持对其进行优化,例如,如果在接口部分中有一个类型化常量,并且程序已完全编译 - 如果然后更改该常量的值,则不重新编译单元,只有常量变化。这在日常工作中并不是必需的,但它是Delphi如何工作的一个例子。
答案 5 :(得分:2)
一个普通的Unit
表现得像一个单身人士。你不能使用继承和多态性等OOP技术,但这可能是一件好事:)
我一般认为Delphi太容易避免声音oop设计。对于RAD来说这很好,但是如果你想要一个灵活且可维护的代码,你需要知道要避免哪些陷阱。例如,您添加到表单的组件的公共可见性,TForm1类型的全局Form1变量(而不是手动管理的生命周期和基类作为类型)以及GUI和业务逻辑之间缺乏分离。只是提一些问题。