कोई सर्वोत्तम अभ्यास नहीं है। हालांकि, आपको प्राथमिक कार्य करना चाहिए, यह सुनिश्चित करना है कि यह हमेशा स्पष्ट होता है कि किसी भी समय ऑब्जेक्ट को नष्ट करने के लिए जिम्मेदार कौन है, भले ही अपवाद होता है।
एक नया उदाहरण बनाने और इसे वापस करने के लिए कुछ भी गलत नहीं है। ऐसा फ़ंक्शन factory है। आप इसे कक्षा के कन्स्ट्रक्टर की तरह ही इलाज कर सकते हैं, इसलिए आपको यह सुनिश्चित करना चाहिए कि यह एक कन्स्ट्रक्टर की तरह व्यवहार करता है: या तो एक वैध ऑब्जेक्ट लौटाएं या अपवाद फेंक दें। यह कभी भी एक शून्य संदर्भ देता है।
function Func: TMyObj;
begin
Result := TMyObj.Create;
try
Result.X := Y;
except
Result.Free;
raise;
end;
end;
यह एक अपवाद-हैंडलिंग पैटर्न है जिसे आप अक्सर नहीं देखते हैं, लेकिन यह कार्य की इस शैली के लिए महत्वपूर्ण है। ऑब्जेक्ट को वापस लौटना फ़ंक्शन से कॉलर तक स्वामित्व स्थानांतरित करता है, लेकिन केवल तभी जब यह पूरी तरह निष्पादित करने का प्रबंधन करता है। अगर इसे अपवाद के कारण जल्दी छोड़ना है, तो यह ऑब्जेक्ट को मुक्त करता है क्योंकि कॉलर के पास इसे स्वयं मुक्त करने का कोई तरीका नहीं है। (कार्य है कि एक अपवाद के कारण समाप्त वापसी मान नहीं है।) फोन करने वाले इस तरह इसका इस्तेमाल होगा:
O := Func;
try
writeln(O.X);
finally
O.Free;
end;
अगर वहाँ तो O
सौंप दिया जाता है कभी नहीं Func
में एक अपवाद नहीं है, इसलिए करने के लिए फोन करने वाले के लिए उपलब्ध कुछ भी नहीं है मुक्त।
जब फोन करने वाले वस्तु बनाता है और आप इसे किसी अन्य कार्य करने के लिए पारित यह प्रारंभ करने, पैरामीटर "var" पैरामीटर नहीं बनाते हैं। यह कॉलर पर कुछ प्रतिबंध रखता है, जो फ़ंक्शन द्वारा अनुरोध किए गए बिल्कुल प्रकार के चर का उपयोग करना चाहिए, भले ही कुछ वंशज टाइप किए गए हों।
इस तरह के एक समारोह को ऑब्जेक्ट को मुक्त करना चाहिए। कॉलर उन कार्यों के स्वामित्व की ज़िम्मेदारी नहीं देता है, जो विशेष रूप से जब फ़ंक्शन रिटर्न के बाद ऑब्जेक्ट का उपयोग करने की योजना बनाते हैं।
स्रोत
2009-11-08 20:14:21
मुझे सीधे प्राप्त करने के लिए धन्यवाद :) महान जवाब –