Delphi Pascal'da MVVM ve MVC uygulamak için en iyi uygulamalar


10

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: yapı

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.


Başlangıçta kod inceleme bu soruyu sordum ama ben burada yayınlanmıştır önerildi.
sav

Yanıtlar:


9

Zaten null edilebilir türler içerdiğinden (biraz fazla operatör aşırı yüklenmesi ile sizinkiyle benzer bir uygulama) ve RTLdekilerden çok daha güçlü toplama türlerini içerdiğinden Spring4D'ye bakmalısınız. Ayrıca, özellikle onları geçerken ömür boyu yönetimi hakkında endişelenmenize gerek olmadığından çok kullanışlı olan arayüze dayalıdır.

Çapraz referans problemleri için arayüzlere karşı kodlama öneriyorum ve bunları birbirini tanıyan 2 uygulama yerine başka bir uygulamada referans olarak kullanıyorum.

MVVM bölümüne gelince, Delphi için bir Caliburn Micro portunun ilk versiyonuna sahip olan DSharp'a bakabilirsiniz. Çok erken bir aşamadır ve pek belgelenmemiştir, ancak gevşek bağlanmış GUI ve veri bağlamaları ile bağlantılı iş mantığı kullanarak Delphi'de MVVM'ye nasıl ulaşılacağı konusunda bazı fikirler edinebilirsiniz. Daha fazla ilgilendiğiniz takdirde Blaise Pascal dergisinin iki makalesi vardı.

PS Sanırım XE6 kullandığınız anlamına geliyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.