我是一个Delphi Pascal程序员,我使用最新的Embarcadero delphi XE,并且想利用诸如模型视图控制器和模型视图视图模型之类的设计模式。
但是,关于在Pascal上执行此操作的最佳做法,在网络上似乎没有很多。我可以找到的大多数示例都在C#中,并且某些语言功能在pascal中不存在,这意味着我可能必须找到实现这些功能的方法。
我正在尝试从此处修改本文的代码
我将列出我面临的问题
- 可空类型
Pascal不像C#那样具有可为空的类型,因此我创建了自己的类型。
TNullable<T> = record
strict private
fHasValue : boolean;
fValue : T;
function GetValue:T;
procedure SetValue(newValue : T);
public
property HasValue : boolean read fHasValue;
property Value : T read GetValue write SetValue;
procedure SetToNull;
end;
在实施部分
function TNullable<T>.GetValue:T;
begin
if fHasValue then
begin
Result := fValue;
end
else raise Exception.Create('Value Not Set');
end;
procedure TNullable<T>.SetValue(newValue : T);
begin
fValue := newValue;
fHasValue := true;
end;
procedure TNullable<T>.SetToNull;
begin
fHasValue := false;
end;
- 获取/设置属性
现在我有了可为空的类型,我可以创建可为空的属性,但是它带有一些代码气味
例如,如果我创建
TFoo = class
private
function GetBar:TNullable<Integer>;
procedure SetBar(x:TNullable<Integer>);
public
property Bar : TNullable<Integer> read GetBar write SetBar;
在实施部分
function TFoo.GetBar:TNullable<Integer>;
begin
if **valueExists** then
begin
Result.Value := **the value**
end else
begin
Result.SetToNull;
end;
end;
procedure TFoo.SetBar(x:TNullable<Integer>);
begin
if X.hasValue then
begin
//Store/show value here
end else
begin
//handle null assignment here
end;
end;
很好,但是在使用这些属性时,我不能只使用
myFoo.Bar.Value:= 1;
我必须用
var
myBar : TNullable<Integer>;
begin
myBar.Value := 1;
myFoo.Bar := myBar;
end;
这有点麻烦。我想可能对此无能为力。
- 循环参考
我喜欢将类分为不同的单元。
即:
保持用户界面与控制逻辑以及模型和数据逻辑层分离。
我可能遇到2个类可以互相引用的情况。尽管在大多数情况下我想避免这种情况,但有时还是需要这样做。
例如
unit u_A;
interface
uses
u_B
;
type
TA = class
public
Foo : TB;
end;
implementation
end;
和另一个单位
unit u_B;
interface
uses
u_A
;
type
TB = class
public
Foo : TA;
end;
implementation
end;
这段代码已损坏,因为两个类相互包含,并且无法在pascal中完成。在C#中,这不是问题。我能想到的解决方案:1.将两个类都包含在同一个单元中,尽管如果我认为这不适合设计,这是一个问题。2.为B创建另一个父接口并从中继承B,然后绕过它。尽管对于这样一个简单的任务来说这很麻烦。
- 静态类
Delphi中没有任何静态类,这些对于控制类很有用。
- 在Delphi中使用的最佳容器类
我目前在Generics.Collections中使用TList和TObjectList,它们是在Delphi XE中引入的,我希望它们是最好的用法,因为delphi 7似乎没有任何好的选择。
我仍在考虑事件处理程序以及那里可能出现的任何问题。也许还有其他一些我尚未想到的问题。
感谢您的任何建议。