แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้ MVVM และ MVC ใน delphi Pascal


10

ฉันเป็นโปรแกรมเมอร์ 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 ดูเหมือนจะไม่มีตัวเลือกที่ดี

ฉันยังคงคิดถึงตัวจัดการเหตุการณ์และปัญหาใด ๆ ที่อาจเกิดขึ้นที่นั่น อาจมีปัญหาอื่น ๆ ที่ฉันยังไม่ได้คิด

ขอบคุณสำหรับคำแนะนำใด ๆ


ตอนแรกฉันถามคำถามนี้เกี่ยวกับการตรวจสอบโค้ด แต่แนะนำว่าฉันโพสต์ที่นี่
sav

คำตอบ:


9

คุณควรตรวจสอบ Spring4D เนื่องจากมีประเภทที่ไม่สามารถใช้งานได้ (คล้ายกับของคุณที่มีตัวดำเนินการมากไปหน่อย) และวิธีการรวบรวมประเภทที่ทรงพลังกว่าใน RTL พวกมันยังเชื่อมต่อกันด้วยซึ่งมีประโยชน์มากเพราะคุณไม่ต้องกังวลกับการจัดการตลอดชีวิตโดยเฉพาะเมื่อผ่านพวกมันไป

สำหรับปัญหาการอ้างอิงข้ามฉันแนะนำให้เขียนโค้ดกับส่วนต่อประสานและใช้สิ่งเหล่านี้เป็นข้อมูลอ้างอิงในการใช้งานอื่นมากกว่าการใช้งาน 2 การรู้จักซึ่งกันและกัน

สำหรับส่วน MVVM คุณอาจมองไปที่ DSharp ซึ่งมี Caliburn Micro port รุ่นแรกสำหรับ Delphi มันเป็นช่วงเริ่มต้นและมีการจัดทำเอกสารแทบจะไม่มากนัก แต่คุณอาจได้รับแนวคิดบางอย่างเกี่ยวกับการบรรลุ MVVM ใน Delphi โดยใช้ GUI คู่และตรรกะทางธุรกิจที่เกี่ยวข้องกับการผูกข้อมูล นิตยสาร Blaise Pascal มีบทความสองบทความเกี่ยวกับเรื่องนี้หากคุณสนใจมากขึ้น

PS ฉันคิดว่าคุณหมายถึงคุณกำลังใช้ XE6 เหมือนเวอร์ชันล่าสุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.