Tôi là một lập trình viên Delphi pascal, tôi sử dụng Embarcadero delphi XE mới nhất và tôi muốn tận dụng các mẫu thiết kế như Trình điều khiển chế độ xem mô hình và mô hình chế độ xem mô hình.
Tuy nhiên, dường như không có nhiều trên web về các thực tiễn tốt nhất để làm điều này trong pascal. Hầu hết các ví dụ mà tôi có thể tìm thấy là trong C # và một số tính năng ngôn ngữ không có trong pascal, điều đó có nghĩa là tôi có thể phải tìm cách triển khai các tính năng đó.
Tôi đang cố gắng điều chỉnh mã từ bài viết này tại đây
Tôi sẽ liệt kê các vấn đề mà tôi gặp phải
- Các loại không thể
Pascal không có kiểu nullable như C # nên tôi đã tạo kiểu của riêng mình.
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;
trong phần thực hiện
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;
- Nhận / Đặt cho các thuộc tính
Bây giờ tôi có một loại nullable tôi có thể tạo các thuộc tính nullable Tuy nhiên nó đi kèm với một số mùi mã
ví dụ nếu tôi tạo
TFoo = class
private
function GetBar:TNullable<Integer>;
procedure SetBar(x:TNullable<Integer>);
public
property Bar : TNullable<Integer> read GetBar write SetBar;
trong phần thực hiện
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;
Điều này là tốt nhưng khi sử dụng các thuộc tính này, tôi không thể chỉ sử dụng
myFoo.Bar.Giá trị: = 1;
tôi phải dùng
var
myBar : TNullable<Integer>;
begin
myBar.Value := 1;
myFoo.Bar := myBar;
end;
Mà là một chút lộn xộn. Tôi cho rằng có thể không có gì tôi có thể làm về điều này.
- Tài liệu tham khảo thông tư
Tôi thích tách các lớp thành các đơn vị khác nhau.
I E:
giữ giao diện người dùng tách biệt với logic điều khiển và lớp logic mô hình và dữ liệu.
Tôi có thể có một tình huống trong đó 2 lớp có thể tham chiếu lẫn nhau. Trong khi đây là một tình huống mà phần lớn tôi muốn tránh, có những lúc điều này là cần thiết.
ví dụ
unit u_A;
interface
uses
u_B
;
type
TA = class
public
Foo : TB;
end;
implementation
end;
và một đơn vị khác
unit u_B;
interface
uses
u_A
;
type
TB = class
public
Foo : TA;
end;
implementation
end;
Mã này bị hỏng vì hai lớp bao gồm nhau và điều này không thể được thực hiện trong pascal. Đây không phải là một vấn đề như vậy trong C #. Các giải pháp mà tôi có thể nghĩ ra: 1. bao gồm cả hai lớp trong cùng một đơn vị, mặc dù đây là vấn đề nếu tôi không nghĩ rằng điều này phù hợp với thiết kế. 2. Tạo một giao diện cha khác cho B và kế thừa B từ đó, sau đó giao diện này sẽ xoay quanh nó. Mặc dù điều này là lộn xộn cho một nhiệm vụ đơn giản như vậy.
- Các lớp tĩnh
Không có bất kỳ lớp tĩnh nào trong Delphi, đây là những lớp hữu ích cho các lớp điều khiển.
- Các lớp Container tốt nhất để sử dụng trong Delphi
Tôi hiện đang sử dụng TList và TObjectList trong Generics. Bộ sưu tập Chúng được giới thiệu trong Delphi XE Tôi hy vọng đây là những cách tốt nhất để sử dụng vì delphi 7 dường như không có bất kỳ tùy chọn tốt nào.
Tôi vẫn đang suy nghĩ về xử lý sự kiện và bất kỳ vấn đề nào có thể phát sinh ở đó. Có lẽ có một số vấn đề khác mà tôi chưa nghĩ đến.
Cảm ơn vì lời khuyên nào.