Thực tiễn tốt nhất để triển khai MVVM và MVC trong delphi Pascal


10

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: kết cấu

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.


Ban đầu tôi đã hỏi câu hỏi này về đánh giá mã nhưng nó được gợi ý rằng tôi đăng ở đây.
sav

Câu trả lời:


9

Bạn nên xem xét Spring4D vì nó đã chứa các loại nullable (triển khai tương tự như của bạn với một chút quá tải toán tử) và cách các loại bộ sưu tập mạnh hơn so với các loại trong RTL. Chúng cũng được giao tiếp dựa trên đó rất tiện dụng vì bạn không phải lo lắng về việc quản lý trọn đời đặc biệt là khi đưa chúng đi khắp nơi.

Đối với các vấn đề tham chiếu chéo, tôi đề nghị mã hóa đối với các giao diện và sử dụng chúng làm tham chiếu trong một triển khai khác thay vì 2 triển khai biết nhau.

Về phần MVVM, bạn có thể xem xét DSharp, phiên bản đầu tiên của cổng Caliburn Micro cho Delphi. Đây là giai đoạn rất sớm và hầu như không được ghi lại nhưng bạn có thể có một số ý tưởng về cách đạt được MVVM trong Delphi bằng cách sử dụng GUI kết hợp lỏng lẻo và logic nghiệp vụ được kết nối với các ràng buộc dữ liệu. Tạp chí Blaise Pascal đã có hai bài viết về nó nếu bạn quan tâm hơn.

PS Tôi đoán bạn có nghĩa là bạn đang sử dụng XE6 vì đó là phiên bản mới nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.