2016-08-16 9 views
7

मैं इस तरह एक साधारण वर्ग लिखा है:ऑब्जेक्ट को मुक्त करने के बाद उपयोग करने के लिए ऑब्जेक्ट की एक प्रक्रिया सुरक्षित है?

TMyClass = class 
    procedure MyProcedure(Sender : TObject); 
end; 

मैं "MyProcedure", जिसमें मैंने कभी नहीं "स्व" का उल्लेख क्रियान्वित कर रहा हूँ, के बाद वस्तु मुक्त कर दिया गया है:

var 
    MyObj : TMyClass; 
    ProcOfObj : TNotifyEvent; 
begin 
    MyObj := TMyClass.Create; 
    try 
    ProcOfObj := MyObj.MyProcedure; 
    finally 
    MyObj.Free; 
    end; 

    ProcOfObj(Self); 
end; 

यह काम करता है लेकिन मुझे आश्चर्य है कि यह एक सुरक्षित अभ्यास है या यदि यह कुछ समस्या पैदा कर सकता है।

+2

यदि विधि कभी भी स्वयं या किसी भी फ़ील्ड का उपयोग नहीं करती है, तो इसे कक्षा विधि के रूप में भी घोषित किया जा सकता है, और फिर यह सुरक्षित है * और * भविष्य में संशोधनों के खिलाफ सुरक्षित है जो इसे असुरक्षित बना देगा – mjn42

+0

@ डेविड हेफरनन मैंने कक्षा के साथ स्थैतिक स्थानांतरित किया – mjn42

उत्तर

10

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

आपको लगता है कि जोखिम के लिए नहीं करना चाहती। इसलिए, चूंकि आपकी विधि किसी उदाहरण का संदर्भ नहीं देती है, इसलिए इसे एक उदाहरण विधि न बनाएं।

type 
    TMyClass = class 
    class procedure MyProcedure(Sender : TObject); 
    end; 

इसके बजाय इसे कक्षा विधि बनाएं। इस तरह आप जोखिम से बचते हैं, और संकलक आपको बचाएगा यदि भविष्य में किसी बिंदु पर आप उदाहरण का उल्लेख करने का प्रयास करते हैं।

3

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

2

यह सुरक्षित नहीं है और यह कोड कैप्सूलीकरण टूट जाता है।

कल्पना कीजिए अंततः TMyClass.MyProcedure परिवर्तन के अपने कार्यान्वयन और संदर्भ के लिए self तो क्या होगा? आपको एक सेगमेंटेशन गलती मिलेगी।

इसके अलावा, आप, OOP के खिलाफ जा रहे हैं जब से तुम विधि आप इसे का उपयोग करने के बुला रहे हैं के कार्यान्वयन के विवरण की जानकारी होनी चाहिए।

आप लागू करने के लिए है कि अपने विधि एक Self सूचक को संदर्भित नहीं करती चाहते हैं, एक स्थिर सदस्य के रूप में प्रणाली की घोषणा।

संबंधित मुद्दे

 संबंधित मुद्दे