ฉันเป็นโปรแกรมเมอร์ Pascal ของ Delphi ฉันใช้ Embarcadero delphi XE ล่าสุดและฉันต้องการใช้ประโยชน์จากรูปแบบการออกแบบเช่นตัวควบคุมมุมมอง Model และ Model view view model
อย่างไรก็ตามดูเหมือนว่าจะไม่มีอะไรมากบนเว็บเกี่ยวกับแนวทางปฏิบัติที่ดีที่สุดสำหรับการทำสิ่งนี้ในภาษาปาสกาล ตัวอย่างส่วนใหญ่ที่ฉันพบมีในภาษา C # และคุณสมบัติภาษาบางอย่างไม่มีอยู่ในภาษาปาสกาลซึ่งหมายความว่าฉันอาจต้องหาวิธีในการใช้คุณสมบัติเหล่านั้น
ฉันกำลังพยายามปรับรหัสจากบทความนี้ที่นี่
ฉันจะระบุปัญหาที่ฉันเผชิญ
- ประเภทที่ทำให้เป็นโมฆะ
ปาสคาลไม่มีประเภท nullable เช่น 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;
- รับ / ตั้งค่าสำหรับคุณสมบัติ
ตอนนี้ฉันมีประเภท nullable ฉันสามารถสร้างคุณสมบัติ nullable แต่มันมาพร้อมกับกลิ่นรหัส
เช่นถ้าฉันสร้าง
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;
รหัสนี้ใช้งานไม่ได้เนื่องจากทั้งสองคลาสรวมกันและไม่สามารถทำได้ในภาษาปาสกาล นี่ไม่ใช่ปัญหาดังกล่าวใน C # วิธีแก้ปัญหาที่ฉันคิดได้: 1. รวมทั้งชั้นเรียนไว้ในหน่วยเดียวกันแม้ว่าจะเป็นปัญหาหากฉันไม่คิดว่าสิ่งนี้เหมาะสมกับการออกแบบ 2. สร้างอินเทอร์เฟซหลักสำหรับ B และรับ B จากนั้นจากนั้นจะได้รับรอบ แม้ว่านี่จะเป็นเรื่องยุ่งสำหรับงานง่ายๆ
- คลาสแบบคงที่
ไม่มีคลาสสแตติกใน Delphi เหล่านี้มีประโยชน์สำหรับคลาสควบคุม
- คลาสคอนเทนเนอร์ที่ดีที่สุดที่จะใช้ใน Delphi
ฉันกำลังใช้ TList และ TObjectList ใน Generics.Collections พวกเขาได้รับการแนะนำใน Delphi XE ฉันหวังว่าสิ่งเหล่านี้ดีที่สุดในการใช้งานเนื่องจาก Delphi 7 ดูเหมือนจะไม่มีตัวเลือกที่ดี
ฉันยังคงคิดถึงตัวจัดการเหตุการณ์และปัญหาใด ๆ ที่อาจเกิดขึ้นที่นั่น อาจมีปัญหาอื่น ๆ ที่ฉันยังไม่ได้คิด
ขอบคุณสำหรับคำแนะนำใด ๆ