मैं डेल्फी पास्कल प्रोग्रामर हूं, मैं नवीनतम एम्बरकैडरो डेल्फी एक्सई का उपयोग करता हूं, और मैं मॉडल दृश्य नियंत्रक और मॉडल व्यू व्यू-मॉडल जैसे डिजाइन पैटर्न का लाभ लेना चाहूंगा।
हालाँकि, पास्कल में ऐसा करने के लिए सर्वोत्तम प्रथाओं के बारे में वेब पर बहुत कुछ प्रतीत नहीं होता है। अधिकांश उदाहरण जो मुझे मिल सकते हैं वे 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 का कोई अच्छा विकल्प नहीं होने के कारण ये उपयोग करने के लिए सबसे अच्छे हैं।
मैं अभी भी इवेंट हैंडलर और किसी भी मुद्दे के बारे में सोच रहा हूं जो वहां उत्पन्न हो सकते हैं। शायद कुछ और मुद्दे हैं जिनके बारे में मैंने अभी तक नहीं सोचा है।
किसी भी सलाह के लिए धन्यवाद।