डेल्फी पास्कल में एमवीवीएम और एमवीसी को लागू करने के लिए सर्वोत्तम अभ्यास


10

मैं डेल्फी पास्कल प्रोग्रामर हूं, मैं नवीनतम एम्बरकैडरो डेल्फी एक्सई का उपयोग करता हूं, और मैं मॉडल दृश्य नियंत्रक और मॉडल व्यू व्यू-मॉडल जैसे डिजाइन पैटर्न का लाभ लेना चाहूंगा।

हालाँकि, पास्कल में ऐसा करने के लिए सर्वोत्तम प्रथाओं के बारे में वेब पर बहुत कुछ प्रतीत नहीं होता है। अधिकांश उदाहरण जो मुझे मिल सकते हैं वे C # में हैं और कुछ भाषा सुविधाएँ पास्कल में मौजूद नहीं हैं, जिसका अर्थ है कि मुझे उन विशेषताओं को लागू करने के तरीके खोजने पड़ सकते हैं।

मैं यहाँ इस लेख से कोड को अनुकूलित करने की कोशिश कर रहा हूँ

मैं उन समस्याओं को सूचीबद्ध करूँगा जो मैं सामना कर रहा हूँ

  • अशक्त प्रकार के

पास्कल में अशक्त प्रकार नहीं हैं क्योंकि 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;
  • गुणों के लिए प्राप्त / सेट करें

अब जब मेरे पास एक अशक्त प्रकार है तो मैं अशक्त गुण पैदा कर सकता हूं, हालांकि यह कुछ कोड गंध के साथ आता है

उदाहरण के लिए अगर मैं बनाता हूं

    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 वारिस करें, फिर यह इसके आस-पास हो जाता है। हालांकि यह इस तरह के एक सरल कार्य के लिए गड़बड़ है।

  • स्थिर वर्ग

डेल्फी में कोई स्थिर कक्षाएं नहीं हैं, ये नियंत्रण कक्षाओं के लिए उपयोगी हैं।

  • डेल्फी में उपयोग करने के लिए सर्वश्रेष्ठ कंटेनर कक्षाएं

मैं वर्तमान में Generics में TList और TobjectList का उपयोग कर रहा हूँ। चुनाव वे डेल्फी XE में पेश किए गए थे, मुझे उम्मीद है कि डेल्फी 7 का कोई अच्छा विकल्प नहीं होने के कारण ये उपयोग करने के लिए सबसे अच्छे हैं।

मैं अभी भी इवेंट हैंडलर और किसी भी मुद्दे के बारे में सोच रहा हूं जो वहां उत्पन्न हो सकते हैं। शायद कुछ और मुद्दे हैं जिनके बारे में मैंने अभी तक नहीं सोचा है।

किसी भी सलाह के लिए धन्यवाद।


मैंने मूल रूप से कोड की समीक्षा पर यह सवाल पूछा था, लेकिन यह सुझाव दिया गया था कि मैं यहां पोस्ट करता हूं।
SAV

जवाबों:


9

आपको स्प्रिंग 4 डी में देखना चाहिए क्योंकि इसमें पहले से ही अशक्त प्रकार (थोड़ा अतिरिक्त ऑपरेटर के साथ आपका समान कार्यान्वयन) और आरटीएल में उन लोगों की तुलना में अधिक शक्तिशाली संग्रह प्रकार शामिल हैं। वे भी हस्तक्षेप कर रहे हैं जो बहुत आसान है क्योंकि आपको जीवन भर प्रबंधन के बारे में चिंता करने की ज़रूरत नहीं है, खासकर जब उन्हें चारों ओर से गुजरते हुए।

क्रॉस रेफरेंसिंग समस्याओं के लिए मैं इंटरफेस के खिलाफ कोडिंग का सुझाव दे रहा हूं और इन्हें एक दूसरे को जानने के बजाय 2 कार्यान्वयन में संदर्भ के रूप में उपयोग करें।

MVVM भाग के रूप में आप DSharp में देख सकते हैं जिसमें डेल्फी के लिए एक कैलिबर्न माइक्रो पोर्ट का पहला संस्करण है। यह बहुत प्रारंभिक चरण है और शायद ही प्रलेखित है, लेकिन आप कुछ विचार प्राप्त कर सकते हैं कि कैसे डेल्वि में एमवीवीएम को प्राप्त करने के लिए शिथिल युग्मित जीयूआई और डेटा लॉजिक के साथ जुड़े व्यापारिक तर्क का उपयोग किया जा सकता है। Blaise पास्कल पत्रिका के बारे में दो लेख थे यदि आप अधिक रुचि रखते हैं।

PS मुझे लगता है कि आप का मतलब है कि आप XE6 का उपयोग कर रहे हैं क्योंकि यह नवीनतम संस्करण है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.