Ben bir Delphi pascal programcısıyım, en yeni Embarcadero delphi XE kullanıyorum ve Model görünümü denetleyicisi ve model görünümü görünümü-modeli gibi tasarım desenlerinden yararlanmak istiyorum.
Bununla birlikte, web'de bunu pascal olarak yapmak için en iyi uygulamalar hakkında fazla bir şey yok gibi görünüyor. Bulabildiğim örneklerin çoğu C #'da ve dil özelliklerinden bazıları pascalda mevcut değil, yani bu özellikleri uygulamak için yollar bulmam gerekebilir.
Burada bu makaleden kodu adapte etmeye çalışıyorum
Karşılaştığım sorunları listeleyeceğim
- Null olabilecek türler
Pascal C # gibi nullable türleri yok bu yüzden kendi oluşturduk.
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;
uygulama bölümünde
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;
- Mülkler için Al / Ayarla
Şimdi nullable türü var Ben nullable özellikleri oluşturabilirsiniz Ancak bazı kod kokuları ile geliyor
örneğin ben yaratırsam
TFoo = class
private
function GetBar:TNullable<Integer>;
procedure SetBar(x:TNullable<Integer>);
public
property Bar : TNullable<Integer> read GetBar write SetBar;
uygulama bölümünde
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;
Bu iyi ama bu özellikleri kullanmak söz konusu olduğunda
myFoo.Bar.Value: = 1;
kullanmak zorundayım
var
myBar : TNullable<Integer>;
begin
myBar.Value := 1;
myFoo.Bar := myBar;
end;
Bu biraz daha karışık. Sanırım bu konuda yapabileceğim bir şey yok.
- Genel Kaynaklar
Sınıfları farklı birimlere ayırmayı seviyorum.
yani:
kullanıcı arayüzünü kontrol mantığından, model ve veri mantığı katmanından ayrı tutmak.
2 sınıfın birbirine referans gösterebileceği bir durum olabilir. Bu çoğunlukla kaçınmak istediğim bir durum olsa da, bunun gerekli olduğu durumlar vardır.
Örneğin
unit u_A;
interface
uses
u_B
;
type
TA = class
public
Foo : TB;
end;
implementation
end;
ve başka bir birim
unit u_B;
interface
uses
u_A
;
type
TB = class
public
Foo : TA;
end;
implementation
end;
Bu kod bozuldu çünkü iki sınıf birbirini içeriyor ve bu pascal ile yapılamıyor. Bu C # böyle bir sorun değil. Düşünebileceğim çözümler: 1. tasarıma uygun olduğunu düşünmüyorum, bu bir sorun olsa da, her iki sınıfı aynı üniteye dahil edin. 2. B için başka bir üst arabirim oluşturun ve B'yi bundan devralın, sonra bu onun etrafında döner. Her ne kadar bu kadar basit bir görev için dağınık olsa da.
- Statik sınıflar
Delphi'de statik sınıflar yoktur, bunlar kontrol sınıfları için kullanışlıdır.
- Delphi'de kullanılacak en iyi Container sınıfları
Şu anda Jenerikler TList ve TObjectList kullanıyorum. Koleksiyonlar Delphi XE'de tanıtıldı Umarım delphi 7 herhangi bir iyi seçeneğe sahip görünmüyordu çünkü kullanmak için en iyisidir.
Hala olay işleyicileri ve burada ortaya çıkabilecek herhangi bir sorunu düşünüyorum. Belki de henüz düşünmediğim başka konular da var.
Herhangi bir tavsiye için teşekkürler.