डिस्पोज़ पैटर्न: Difference between revisions

From Vigyanwiki
m (Sugatha moved page निपटान पैटर्न to डिस्पोज़ पैटर्न without leaving a redirect)
No edit summary
Line 2: Line 2:
{{redirect|Dispose|the album by The Plot In You|Dispose (album)|other uses|Disposal (disambiguation)}}
{{redirect|Dispose|the album by The Plot In You|Dispose (album)|other uses|Disposal (disambiguation)}}
{{Refimprove|date=February 2013}}
{{Refimprove|date=February 2013}}
[[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में, निपटान पैटर्न [[संसाधन प्रबंधन (कंप्यूटिंग)]] के लिए एक डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) है। इस पैटर्न में, एक [[सिस्टम संसाधन]] एक [[वस्तु (कंप्यूटिंग)]] द्वारा आयोजित किया जाता है, और एक पारंपरिक [[विधि (कंप्यूटर विज्ञान)]] को कॉल करके जारी किया जाता है - जिसे आमतौर पर कहा जाता है <code>close</code>, <code>dispose</code>, <code>free</code>, <code>release</code> भाषा पर निर्भर करता है - जो किसी भी संसाधन को जारी करता है जिसे वस्तु धारण कर रही है। कई [[प्रोग्रामिंग भाषा]]एं सामान्य परिस्थितियों में निपटान विधि को स्पष्ट रूप से कॉल करने से बचने के लिए [[भाषा निर्माण]] की पेशकश करती हैं।
[[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में, निपटान पैटर्न [[संसाधन प्रबंधन (कंप्यूटिंग)|संसाधन प्रबंधन]] के लिए एक डिज़ाइन पैटर्न है। इस पैटर्न में, एक [[सिस्टम संसाधन]] एक [[वस्तु (कंप्यूटिंग)|वस्तु]] द्वारा आयोजित किया जाता है, और एक पारंपरिक [[विधि (कंप्यूटर विज्ञान)|विधि]] को कॉल करके जारी किया जाता है - जिसे आमतौर पर भाषा के आधार पर <code>close</code>, <code>dispose</code>, <code>free</code>, <code>release</code> कहा जाता है - जो किसी भी संसाधन को जारी करता है, जिस पर ऑब्जेक्ट होल्ड होता है। कई [[प्रोग्रामिंग भाषा|प्रोग्रामिंग भाषाएं]] सामान्य परिस्थितियों में निपटान विधि को स्पष्ट रूप से कॉल करने से बचने के लिए [[भाषा निर्माण]] की पेशकश करती हैं।


निपटान पैटर्न मुख्य रूप से उन भाषाओं में उपयोग किया जाता है जिनके रनटाइम पर्यावरण में स्वत: कचरा संग्रह होता है (नीचे प्रेरणा देखें)।
निपटान पैटर्न मुख्य रूप से उन भाषाओं में उपयोग किया जाता है जिनके रनटाइम पर्यावरण में स्वत: कचरा संग्रह होता है।


== प्रेरणा ==
== प्रेरणा ==


=== संसाधनों को वस्तुओं में लपेटना ===
=== संसाधनों को वस्तुओं में लपेटना ===
ऑब्जेक्ट्स में रैपिंग रिसोर्सेज [[Encapsulation (कंप्यूटर प्रोग्रामिंग)]] का ऑब्जेक्ट-ओरिएंटेड रूप है, और डिस्पोजल पैटर्न को रेखांकित करता है।
ऑब्जेक्ट्स में रैपिंग रिसोर्सेज [[Encapsulation (कंप्यूटर प्रोग्रामिंग)|एनकैप्सुलेशन]] का ऑब्जेक्ट-ओरिएंटेड फॉर्म है, और डिस्पोजल पैटर्न को रेखांकित करता है।


संसाधनों को आमतौर पर [[हैंडल (कंप्यूटिंग)]] (अमूर्त संदर्भ) द्वारा दर्शाया जाता है, ठोस रूप से आमतौर पर पूर्णांक, जिनका उपयोग संसाधन प्रदान करने वाली बाहरी प्रणाली के साथ संवाद करने के लिए किया जाता है। उदाहरण के लिए, फ़ाइलें [[ऑपरेटिंग सिस्टम]] (विशेष रूप से [[फाइल सिस्टम]]) द्वारा प्रदान की जाती हैं, जो कई प्रणालियों में [[फाइल डिस्क्रिप्टर]] (फ़ाइल का प्रतिनिधित्व करने वाला एक पूर्णांक) के साथ खुली फ़ाइलों का प्रतिनिधित्व करती है।
संसाधन आमतौर पर [[हैंडल (कंप्यूटिंग)|हैंडल]] (अमूर्त संदर्भ) द्वारा दर्शाए जाते हैं, ठोस रूप से आमतौर पर पूर्णांक होते हैं, जिनका उपयोग बाहरी सिस्टम के साथ संवाद करने के लिए किया जाता है जो संसाधन प्रदान करता है। उदाहरण के लिए, फ़ाइलें [[ऑपरेटिंग सिस्टम]] (विशेष रूप से [[फाइल सिस्टम]]) द्वारा प्रदान की जाती हैं, जो कई प्रणालियों में [[फाइल डिस्क्रिप्टर]] (फ़ाइल का प्रतिनिधित्व करने वाला एक पूर्णांक) के साथ खुली फ़ाइलों का प्रतिनिधित्व करती है।


इन हैंडल का सीधे उपयोग किया जा सकता है, एक चर में मान को संग्रहीत करके और संसाधन का उपयोग करने वाले कार्यों के तर्क के रूप में पारित करके। हालांकि, यह अक्सर हैंडल से अमूर्त करने के लिए उपयोगी होता है (उदाहरण के लिए, यदि विभिन्न ऑपरेटिंग सिस्टम अलग-अलग फाइलों का प्रतिनिधित्व करते हैं), और हैंडल के साथ अतिरिक्त सहायक डेटा स्टोर करने के लिए, इसलिए हैंडल को [[रिकॉर्ड (कंप्यूटर विज्ञान)]] में फ़ील्ड के रूप में संग्रहीत किया जा सकता है। , अन्य डेटा के साथ; यदि यह एक [[अपारदर्शी डेटा प्रकार]] में है, तो यह सूचना छिपाने की सुविधा प्रदान करता है और उपयोगकर्ता को वास्तविक प्रतिनिधित्व से अलग कर दिया जाता है।
इन हैंडल का सीधे उपयोग किया जा सकता है, एक चर में मान को संग्रहीत करके और संसाधन का उपयोग करने वाले कार्यों के तर्क के रूप में पारित करके। हालांकि, यह अक्सर हैंडल से अमूर्त करने के लिए उपयोगी होता है (उदाहरण के लिए, यदि विभिन्न ऑपरेटिंग सिस्टम अलग-अलग फाइलों का प्रतिनिधित्व करते हैं), और अतिरिक्त सहायक डेटा को हैंडल के साथ स्टोर करने के लिए, इसलिए हैंडल को [[रिकॉर्ड (कंप्यूटर विज्ञान)|रिकॉर्ड]] में फ़ील्ड के रूप में संग्रहीत किया जा सकता है, अन्य के साथ आंकड़े; यदि यह एक [[अपारदर्शी डेटा प्रकार]] में है, तो यह सूचना छिपाने की सुविधा प्रदान करता है और उपयोगकर्ता को वास्तविक प्रतिनिधित्व से अलग कर दिया जाता है।


उदाहरण के लिए, सी फ़ाइल इनपुट/आउटपुट में, फ़ाइलों को ऑब्जेक्ट द्वारा दर्शाया जाता है <code>FILE</code> प्रकार (भ्रामक रूप से [[फ़ाइल संभाल]] कहा जाता है: ये एक भाषा-स्तर अमूर्त हैं), जो फ़ाइल (जैसे फ़ाइल डिस्क्रिप्टर) में एक (ऑपरेटिंग सिस्टम) हैंडल को स्टोर करता है, साथ में I/O मोड (पढ़ना, लिखना) जैसी सहायक जानकारी के साथ और धारा में स्थिति। ये ऑब्जेक्ट कॉल करके बनाए जाते हैं <code>[[C file input/output#fopen|fopen]]</code> (ऑब्जेक्ट-ओरिएंटेड शर्तों में, एक कन्स्ट्रक्टर_ (ऑब्जेक्ट-ओरिएंटेड_प्रोग्रामिंग)), जो संसाधन प्राप्त करता है और इसके लिए एक सूचक देता है; संसाधन कॉल करके जारी किया जाता है <code>[[C file input/output#fclose|fclose]]</code> एक संकेतक पर <code>FILE</code> वस्तु।<ref>{{man|bd|stdio.h|SUS}}</ref> कोड में:
उदाहरण के लिए, सी फ़ाइल इनपुट/आउटपुट में, फ़ाइलों को <code>FILE</code> प्रकार की वस्तुओं द्वारा दर्शाया जाता है (भ्रामक रूप से [[फ़ाइल संभाल|फ़ाइल हैंडल]] कहा जाता है: ये एक भाषा-स्तरीय अमूर्तता हैं), जो फ़ाइल (जैसे कि ऑपरेटिंग सिस्टम) को संभालती है एक फाइल डिस्क्रिप्टर), साथ में सहायक जानकारी जैसे I/O मोड (पढ़ना, लिखना) और धारा में स्थिति। इन वस्तुओं को कॉल करके बनाया जाता है <code>[[C file input/output#fopen|fopen]]</code> (ऑब्जेक्ट-ओरिएंटेड शब्दों में, एक कंस्ट्रक्टर), जो संसाधन प्राप्त करता है और इसके लिए एक सूचक देता है, <code>FILE</code> ऑब्जेक्ट के पॉइंटर पर <code>[[C file input/output#fclose|fclose]]</code> को कॉल करके संसाधन जारी किया जाता है।<ref>{{man|bd|stdio.h|SUS}}</ref> कोड में:


<वाक्यविन्यास प्रकाश लैंग = सी>
फ़ाइल * f = fopen (फ़ाइल नाम, मोड);
// f के साथ कुछ करें।
एफक्लोज (एफ);
</वाक्यविन्यास हाइलाइट>


ध्यान दें कि <code>fclose</code> एक के साथ एक समारोह है <code>FILE *</code> पैरामीटर। ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, यह फ़ाइल ऑब्जेक्ट पर एक इंस्टेंस विधि है, जैसा कि पायथन में है:
FILE *f = fopen(filename, mode);


<वाक्यविन्यास लैंग = अजगर>
// Do something with f.
च = खुला (फ़ाइल नाम)
# f के साथ कुछ करें।
च बंद ()
</वाक्यविन्यास हाइलाइट>


यह बिल्कुल डिस्पोजल पैटर्न है, और केवल सिंटैक्स और कोड संरचना में भिन्न है{{efn|In [[class-based programming]], methods are defined in a class, using an implicit <code>this</code> or <code>self</code> parameter, rather than as functions taking an explicit parameter.}} पारंपरिक फ़ाइल खोलने और बंद करने से। अन्य संसाधनों को ठीक उसी तरह से प्रबंधित किया जा सकता है: एक कंस्ट्रक्टर या कारखाने में अधिग्रहित किया जा रहा है, और एक स्पष्ट द्वारा जारी किया जा रहा है <code>close</code> या <code>dispose</code> तरीका।
fclose(f);
 
 
ध्यान दें कि <code>fclose</code> एक <code>FILE *</code> पैरामीटर वाला फ़ंक्शन है। ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, यह फ़ाइल ऑब्जेक्ट पर एक इंस्टेंस विधि है, जैसा कि पायथन में है:
 
 
f = open(filename)
 
<nowiki>#</nowiki> Do something with f.
 
f.close()
 
 
यह बिल्कुल निपटान पैटर्न है, और पारंपरिक फ़ाइल खोलने और बंद करने से सिंटैक्स और कोड संरचना{{efn|In [[class-based programming]], methods are defined in a class, using an implicit <code>this</code> or <code>self</code> parameter, rather than as functions taking an explicit parameter.}} में अलग है। अन्य संसाधनों को ठीक उसी तरह प्रबंधित किया जा सकता है: एक निर्माता या कारखाने में अधिग्रहित किया जा रहा है, और एक स्पष्ट <code>close</code> या <code>dispose</code> विधि द्वारा जारी किया जा रहा है।


=== शीघ्र रिलीज ===
=== शीघ्र रिलीज ===
Line 38: Line 42:
यदि कोई संसाधन असीमित या प्रभावी रूप से असीमित है, और कोई स्पष्ट अंतिमीकरण आवश्यक नहीं है, तो इसे जारी करना महत्वपूर्ण नहीं है, और वास्तव में अल्पकालिक कार्यक्रम अक्सर संसाधनों को स्पष्ट रूप से जारी नहीं करते हैं: अल्पावधि के कारण, वे संसाधनों को समाप्त करने की संभावना नहीं रखते हैं , और वे किसी भी अंतिम रूप देने के लिए [[रनटाइम सिस्टम]] या ऑपरेटिंग सिस्टम पर भरोसा करते हैं।
यदि कोई संसाधन असीमित या प्रभावी रूप से असीमित है, और कोई स्पष्ट अंतिमीकरण आवश्यक नहीं है, तो इसे जारी करना महत्वपूर्ण नहीं है, और वास्तव में अल्पकालिक कार्यक्रम अक्सर संसाधनों को स्पष्ट रूप से जारी नहीं करते हैं: अल्पावधि के कारण, वे संसाधनों को समाप्त करने की संभावना नहीं रखते हैं , और वे किसी भी अंतिम रूप देने के लिए [[रनटाइम सिस्टम]] या ऑपरेटिंग सिस्टम पर भरोसा करते हैं।


हालांकि, सामान्य संसाधनों में प्रबंधित किया जाना चाहिए (विशेष रूप से लंबे समय तक रहने वाले कार्यक्रमों के लिए, कार्यक्रम जो कई संसाधनों का उपयोग करते हैं, या सुरक्षा के लिए, यह सुनिश्चित करने के लिए कि डेटा लिखा गया है)। स्पष्ट निपटान का मतलब है कि संसाधन को अंतिम रूप देना और जारी करना नियतात्मक और शीघ्र है: <code>dispose</code> विधि तब तक पूर्ण नहीं होती जब तक कि ये पूरी नहीं हो जातीं।
हालांकि, सामान्य संसाधनों में प्रबंधित किया जाना चाहिए (विशेष रूप से लंबे समय तक रहने वाले कार्यक्रमों के लिए, कार्यक्रम जो कई संसाधनों का उपयोग करते हैं, या सुरक्षा के लिए, यह सुनिश्चित करने के लिए कि डेटा लिखा गया है)। स्पष्ट निपटान का मतलब है कि संसाधन को अंतिम रूप देना और जारी करना नियतात्मक और शीघ्र है: <code>dispose</code> विधि तब तक पूरी नहीं होती जब तक कि ये पूरा नहीं हो जाता।


स्पष्ट निपटान की आवश्यकता का एक विकल्प संसाधन प्रबंधन को जीवन भर के लिए बाँधना है: संसाधन [[वस्तु निर्माण]] के दौरान प्राप्त किए जाते हैं, और [[वस्तु विनाश]] के दौरान जारी किए जाते हैं। इस दृष्टिकोण को [[संसाधन अधिग्रहण प्रारंभ है]] (RAII) मुहावरा के रूप में जाना जाता है, और इसका उपयोग नियतात्मक स्मृति प्रबंधन (जैसे C ++) वाली भाषाओं में किया जाता है। इस स्थिति में, ऊपर दिए गए उदाहरण में, संसाधन तब प्राप्त होता है जब फ़ाइल ऑब्जेक्ट बनाया जाता है, और जब वेरिएबल का दायरा होता है <code>f</code> बाहर निकल गया है, फ़ाइल ऑब्जेक्ट कि <code>f</code> संदर्भित करता है नष्ट हो जाता है, और इसके हिस्से के रूप में, संसाधन जारी किया जाता है।
स्पष्ट निपटान की आवश्यकता का एक विकल्प संसाधन प्रबंधन को जीवन भर के लिए बाँधना है: संसाधन [[वस्तु निर्माण]] के दौरान प्राप्त किए जाते हैं, और [[वस्तु विनाश]] के दौरान जारी किए जाते हैं। इस दृष्टिकोण को [[संसाधन अधिग्रहण प्रारंभ है]] (RAII) मुहावरा के रूप में जाना जाता है, और इसका उपयोग नियतात्मक स्मृति प्रबंधन (जैसे C ++) वाली भाषाओं में किया जाता है। इस स्थिति में, ऊपर दिए गए उदाहरण में, संसाधन तब प्राप्त होता है जब फ़ाइल ऑब्जेक्ट बनाया जाता है, और जब वेरिएबल का दायरा होता है <code>f</code> बाहर निकल गया है, फ़ाइल ऑब्जेक्ट कि <code>f</code> संदर्भित करता है नष्ट हो जाता है, और इसके हिस्से के रूप में, संसाधन जारी किया जाता है।
Line 47: Line 51:


== प्रारंभिक निकास ==
== प्रारंभिक निकास ==
डिस्पोजल पैटर्न के साथ एक प्रमुख समस्या यह है कि यदि <code>dispose</code> विधि नहीं कहा जाता है, संसाधन लीक हो गया है। इसका एक सामान्य कारण जल्दी वापसी या अपवाद के कारण किसी समारोह से जल्दी बाहर निकलना है।
डिस्पोजल पैटर्न के साथ एक प्रमुख समस्या यह है कि यदि <code>dispose</code> विधि नहीं कहा जाता है, तो संसाधन लीक हो जाता है। इसका एक सामान्य कारण जल्दी वापसी या अपवाद के कारण किसी समारोह से जल्दी बाहर निकलना है।


उदाहरण के लिए:
उदाहरण के लिए:
<वाक्यविन्यास लैंग = अजगर>
def func(filename):
def func (फ़ाइल नाम):
    f = open(filename)
    च = खुला (फ़ाइल नाम)
    if a:
    यदि एक:
        return x
        वापसी एक्स
    f.close()
    च बंद ()
    return y
    वापसी वाई
</वाक्यविन्यास हाइलाइट>
यदि फ़ंक्शन पहली वापसी पर लौटता है, तो फ़ाइल कभी बंद नहीं होती है और संसाधन लीक हो जाता है।
यदि फ़ंक्शन पहली वापसी पर लौटता है, तो फ़ाइल कभी बंद नहीं होती है और संसाधन लीक हो जाता है।
 
def func(filename):
<वाक्यविन्यास लैंग = अजगर>
    f = open(filename)
def func (फ़ाइल नाम):
    g(f) # Do something with f that may raise an exception.
    च = खुला (फ़ाइल नाम)
    f.close()
    g(f) # f के साथ कुछ ऐसा करें जिससे कोई अपवाद उत्पन्न हो।
    च बंद ()
</वाक्यविन्यास हाइलाइट>
यदि हस्तक्षेप करने वाला कोड अपवाद उठाता है, तो फ़ंक्शन जल्दी निकल जाता है और फ़ाइल कभी बंद नहीं होती है, इसलिए संसाधन लीक हो जाता है।
यदि हस्तक्षेप करने वाला कोड अपवाद उठाता है, तो फ़ंक्शन जल्दी निकल जाता है और फ़ाइल कभी बंद नहीं होती है, इसलिए संसाधन लीक हो जाता है।


इन दोनों को एक द्वारा नियंत्रित किया जा सकता है <code>try...finally</code> निर्माण, जो यह सुनिश्चित करता है कि अंत में खंड हमेशा बाहर निकलने पर निष्पादित होता है:
इन दोनों को <code>try...finally</code> निर्माण द्वारा नियंत्रित किया जा सकता है, जो यह सुनिश्चित करता है कि अंत में खंड हमेशा बाहर निकलने पर निष्पादित किया जाता है:
<वाक्यविन्यास लैंग = अजगर>
def func(filename):
def func (फ़ाइल नाम):
    try:
    कोशिश करना:
        f = open(filename)
        च = खुला (फ़ाइल नाम)
        # Do something.
        # कुछ करो।
    finally:
    आखिरकार:
        f.close()
        च बंद ()
</वाक्यविन्यास हाइलाइट>
 
अधिक सामान्य रूप से:
अधिक सामान्य रूप से:
<वाक्यविन्यास प्रकाश लैंग = csharp>
Resource resource = getResource();
संसाधन संसाधन = getResource ();
try {
कोशिश {
    // Resource has been acquired; perform actions with the resource.
    // संसाधन प्राप्त कर लिया गया है; संसाधन के साथ कार्रवाई करें।
    ...
    ...
} finally {
} आखिरकार {
    // Release resource, even if an exception was thrown.
    // रिलीज संसाधन, भले ही एक अपवाद फेंक दिया गया हो।
    resource.dispose();
    संसाधन.निपटान ();
}
}
<code>try...finally</code> निर्माण उचित [[अपवाद सुरक्षा]] के लिए आवश्यक है, क्योंकि <code>finally</code> में ब्लॉक क्लीनअप लॉजिक के निष्पादन को सक्षम करता है चाहे कोई अपवाद फेंका गया हो या नहीं <code>try</code> अवरोध पैदा करना।
</वाक्यविन्यास हाइलाइट> <code>try...finally</code> e> उचित [[अपवाद सुरक्षा]] के लिए निर्माण आवश्यक है, क्योंकि <code>finally</code> ब्लॉक क्लीनअप लॉजिक के निष्पादन को सक्षम करता है, भले ही कोई अपवाद फेंका गया हो या नहीं <code>try</code> अवरोध पैदा करना।


इस दृष्टिकोण का एक नुकसान यह है कि इसमें प्रोग्रामर को सफाई कोड को स्पष्ट रूप से जोड़ने की आवश्यकता होती है <code>finally</code> अवरोध पैदा करना। इससे कोड आकार ब्लोट हो जाता है, और ऐसा करने में विफलता कार्यक्रम में संसाधन रिसाव का कारण बनेगी।
इस दृष्टिकोण का एक नुकसान यह है कि प्रोग्रामर को अंत में ब्लॉक में स्पष्ट रूप से क्लीनअप कोड जोड़ने की आवश्यकता होती है <code>finally</code> अवरोध पैदा करना। इससे कोड आकार ब्लोट हो जाता है, और ऐसा करने में विफलता कार्यक्रम में संसाधन रिसाव का कारण बनेगी।


== भाषा निर्माण ==
== भाषा निर्माण ==
डिस्पोज़ पैटर्न के सुरक्षित उपयोग को कम वर्बोज़ बनाने के लिए, कई भाषाओं में एक ही [[ब्लॉक (प्रोग्रामिंग)]] में रखे और जारी किए गए संसाधनों के लिए किसी प्रकार का अंतर्निहित समर्थन होता है।
निपटान पैटर्न के सुरक्षित उपयोग को कम वर्बोज़ बनाने के लिए, कोड के एक ही [[ब्लॉक (प्रोग्रामिंग)|ब्लॉक]] में रखे और जारी किए गए संसाधनों के लिए कई भाषाओं में किसी प्रकार का अंतर्निहित समर्थन होता है।
 
सी शार्प (प्रोग्रामिंग लैंग्वेज)|सी# लैंग्वेज की विशेषता है <code>using</code> कथन<ref>Microsoft MSDN: [http://msdn.microsoft.com/en-us/library/yh598w02.aspx using Statement (C# Reference)]</ref> जो स्वचालित रूप से कॉल करता है <code>Dispose</code> किसी वस्तु पर विधि जो लागू करती है <code>IDisposable</code> [[इंटरफ़ेस (कंप्यूटर विज्ञान)]]:


<वाक्यविन्यास प्रकाश लैंग = csharp>
सी शार्प भाषा में <code>using</code> कथन<ref>Microsoft MSDN: [http://msdn.microsoft.com/en-us/library/yh598w02.aspx using Statement (C# Reference)]</ref> है जो स्वचालित रूप से किसी ऑब्जेक्ट पर <code>Dispose</code> विधि को कॉल करता है जो <code>IDisposable</code> [[इंटरफ़ेस (कंप्यूटर विज्ञान)|इंटरफ़ेस]] लागू करता है:
(संसाधन संसाधन = GetResource ()) का उपयोग करना
using (Resource resource = GetResource())
{
{
    // संसाधन के साथ कार्य करें।
    // Perform actions with the resource.
    ...
    ...
}
}
</वाक्यविन्यास हाइलाइट>
जो इसके बराबर है:
जो इसके बराबर है:
<वाक्यविन्यास प्रकाश लैंग = csharp>
Resource resource = GetResource()
संसाधन संसाधन = GetResource ()
try
कोशिश
{
{
    // Perform actions with the resource.
    // संसाधन के साथ कार्य करें।
    ...
    ...
}
}
finally
आखिरकार
{
{
    // Resource might not been acquired, or already freed
    // संसाधन का अधिग्रहण नहीं किया जा सकता है, या पहले ही मुक्त कर दिया गया है
    if (resource != null)  
    अगर (संसाधन! = अशक्त)
        ((IDisposable)resource).Dispose();  
        ((आईडीस्पोजेबल) संसाधन)। निपटान ();
}
}
इसी तरह, [[पायथन (प्रोग्रामिंग भाषा)|पायथन]] भाषा में एक <code>with</code> कथन है जिसका उपयोग संदर्भ प्रबंधक वस्तु के साथ समान प्रभाव के लिए किया जा सकता है। कॉन्टेक्स्ट मैनेजर प्रोटोकॉल को <code>__enter__</code> और <code>__exit__</code> विधियों को लागू करने की आवश्यकता होती है, जो कोड के दोहराव को रोकने के लिए स्वचालित रूप से स्टेटमेंट निर्माण द्वारा बुलाए जाते हैं, जो अन्यथा <code>try</code>/<code>finally</code> पैटर्न के साथ होते हैं।<ref>{{cite web |author=[[Guido van Rossum]], Nick Coghlan |date=13 June 2011 |title=PEP 343: The "with" Statement |publisher=Python Software Foundation |url=http://legacy.python.org/dev/peps/pep-0343/ }}</ref>
</वाक्यविन्यास हाइलाइट>
with resource_context_manager() as resource:
 
    # Perform actions with the resource.
इसी प्रकार, [[पायथन (प्रोग्रामिंग भाषा)]] भाषा में एक है <code>with</code> बयान जो एक संदर्भ प्रबंधक वस्तु के समान प्रभाव के लिए इस्तेमाल किया जा सकता है। संदर्भ प्रबंधक प्रोटोकॉल को लागू करने की आवश्यकता है <code>__enter__</code> और <code>__exit__</code> विधियां जो स्वचालित रूप से कॉल की जाती हैं <code>with</code> कथन निर्माण, कोड के दोहराव को रोकने के लिए जो अन्यथा घटित होगा <code>try</code>/<code>finally</code> नमूना।<ref>{{cite web |author=[[Guido van Rossum]], Nick Coghlan |date=13 June 2011 |title=PEP 343: The "with" Statement |publisher=Python Software Foundation |url=http://legacy.python.org/dev/peps/pep-0343/ }}</ref>
    ...
<वाक्यविन्यास लैंग = अजगर>
# Perform other actions where the resource is guaranteed to be deallocated.
संसाधन_संदर्भ_प्रबंधक () के साथ संसाधन के रूप में:
...
    # संसाधन के साथ कार्रवाई करें।
[[जावा (प्रोग्रामिंग भाषा)|जावा]] भाषा ने जावा संस्करण 7 में एक नया सिंटैक्स पेश किया जिसे <code>try</code>-साथ-संसाधन कहा जाता है।<ref>Oracle Java tutorial: [http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref> इसका उपयोग उन वस्तुओं पर किया जा सकता है जो ऑटोक्लोसेजबल इंटरफ़ेस को लागू करते हैं (जो कि विधि को परिभाषित करता है ()):
    ...
try (OutputStream x = new OutputStream(...)) {
# अन्य क्रियाएं करें जहां संसाधन को आवंटित करने की गारंटी है।
    // Do something with x
...
} catch (IOException ex) {
</वाक्यविन्यास हाइलाइट>
    // Handle exception
 
[[जावा (प्रोग्रामिंग भाषा)]] लैंग्वेज ने एक नया सिंटैक्स पेश किया जिसे कहा जाता है <code>try</code>-साथ-संसाधन जावा संस्करण 7 में।<ref>Oracle Java tutorial: [http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref> इसका उपयोग उन वस्तुओं पर किया जा सकता है जो AutoCloseable इंटरफ़ेस को लागू करते हैं (जो कि विधि को परिभाषित करता है ()):
  // The resource x is automatically closed
<वाक्यविन्यास प्रकाश लैंग = जावा>
} // try
प्रयास करें (आउटपुटस्ट्रीम x = नया आउटपुटस्ट्रीम (...)) {
    // एक्स के साथ कुछ करो
} पकड़ (IOException पूर्व) {
    // हैंडल अपवाद
 
  // संसाधन x स्वतः बंद हो जाता है
} // कोशिश
</वाक्यविन्यास हाइलाइट>
 
== समस्याएं ==
== समस्याएं ==
रिटर्न और अपवादों की उपस्थिति में सही संसाधन प्रबंधन की प्रमुख समस्या से परे, और हीप-आधारित संसाधन प्रबंधन (वस्तुओं को जहां वे बनाए गए हैं, वहां से एक अलग दायरे में निपटाना), निपटान पैटर्न से जुड़ी कई और जटिलताएं हैं। इन समस्याओं को [[RAII]] द्वारा काफी हद तक टाला जाता है। हालाँकि, सामान्य सरल उपयोग में ये जटिलताएँ उत्पन्न नहीं होती हैं: एक संसाधन प्राप्त करें, इसके साथ कुछ करें, इसे स्वचालित रूप से जारी करें।
रिटर्न और अपवादों की उपस्थिति में सही संसाधन प्रबंधन की प्रमुख समस्या से परे, और हीप-आधारित संसाधन प्रबंधन (वस्तुओं को जहां वे बनाए गए हैं, वहां से एक अलग दायरे में निपटाना), निपटान पैटर्न से जुड़ी कई और जटिलताएं हैं। इन समस्याओं को [[RAII]] द्वारा काफी हद तक टाला जाता है। हालाँकि, सामान्य सरल उपयोग में ये जटिलताएँ उत्पन्न नहीं होती हैं: एक संसाधन प्राप्त करें, इसके साथ कुछ करें, इसे स्वचालित रूप से जारी करें।


एक मौलिक समस्या यह है कि एक संसाधन का होना अब एक [[वर्ग अपरिवर्तनीय]] नहीं है (संसाधन वस्तु निर्माण से तब तक रखा जाता है जब तक इसका निपटान नहीं किया जाता है, लेकिन वस्तु अभी भी इस बिंदु पर जीवित है), इसलिए संसाधन उपलब्ध नहीं हो सकता है जब वस्तु कोशिश करती है इसका इस्तेमाल करें, उदाहरण के लिए बंद फ़ाइल से पढ़ने की कोशिश कर रहा है। इसका मतलब यह है कि संसाधन का उपयोग करने वाली वस्तु पर सभी विधियां संभावित रूप से असफल हो जाती हैं, आम तौर पर एक त्रुटि वापस करके या अपवाद उठाकर। व्यवहार में यह मामूली है, क्योंकि संसाधनों का उपयोग आमतौर पर अन्य कारणों से भी विफल हो सकता है (उदाहरण के लिए, किसी फ़ाइल के अंत को पढ़ने की कोशिश करना), इसलिए ये विधियाँ पहले से ही विफल हो सकती हैं, और संसाधन न होने से बस एक और संभावित विफलता जुड़ जाती है . इसे लागू करने का एक मानक तरीका ऑब्जेक्ट में एक बूलियन फ़ील्ड जोड़ना है, जिसे कहा जाता है <code>disposed</code>, जो द्वारा सत्य पर सेट किया गया है <code>dispose</code>, और एक [[गार्ड क्लॉज]] द्वारा सभी विधियों (जो संसाधन का उपयोग करते हैं) के लिए जाँच की जाती है, एक अपवाद (जैसे <code>ObjectDisposedException</code> in .NET) यदि वस्तु का निपटान किया गया है।<ref name="msdn_dispose">{{cite web |url=https://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx |title=निपटान पैटर्न}}</रेफरी>
एक मौलिक समस्या यह है कि एक संसाधन का होना अब एक [[वर्ग अपरिवर्तनीय]] नहीं है (संसाधन वस्तु निर्माण से तब तक रखा जाता है जब तक इसका निपटान नहीं किया जाता है, लेकिन वस्तु अभी भी इस बिंदु पर जीवित है), इसलिए संसाधन उपलब्ध नहीं हो सकता है जब वस्तु कोशिश करती है इसका इस्तेमाल करें, उदाहरण के लिए बंद फ़ाइल से पढ़ने की कोशिश कर रहा है। इसका मतलब यह है कि संसाधन का उपयोग करने वाली वस्तु पर सभी विधियां संभावित रूप से असफल हो जाती हैं, आम तौर पर एक त्रुटि वापस करके या अपवाद उठाकर। व्यवहार में यह मामूली है, क्योंकि संसाधनों का उपयोग आमतौर पर अन्य कारणों से भी विफल हो सकता है (उदाहरण के लिए, किसी फ़ाइल के अंत को पढ़ने की कोशिश करना), इसलिए ये विधियाँ पहले से ही विफल हो सकती हैं, और संसाधन न होने से बस एक और संभावित विफलता जुड़ जाती है। इसे लागू करने का एक मानक तरीका ऑब्जेक्ट में एक बूलियन फ़ील्ड जोड़ना है, जिसे <code>disposed</code> कहा जाता है, जिसे <code>dispose</code> करके सही पर सेट किया जाता है, और एक [[गार्ड क्लॉज]] द्वारा सभी तरीकों (जो संसाधन का उपयोग करते हैं) के लिए चेक किया जाता है, एक अपवाद उठाते हुए (जैसे कि <code>ObjectDisposedException</code> .NET में) यदि वस्तु का निपटान किया गया है।<ref name="msdn_dispose">{{cite web |url=https://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx |title=निपटान पैटर्न}}</रेफरी>


इसके अलावा, कॉल करना संभव है <code>dispose</code> किसी वस्तु पर एक से अधिक बार हालांकि यह एक प्रोग्रामिंग त्रुटि का संकेत दे सकता है (संसाधन धारण करने वाली प्रत्येक वस्तु को एक बार ठीक से निपटाया जाना चाहिए), यह सरल, अधिक मजबूत है, और इस प्रकार आमतौर पर इसके लिए बेहतर है <code>dispose</code> बेवकूफ होना (मतलब कई बार कॉल करना एक बार कॉल करने के समान है)।<ref name="msdn_dispose"/>यह उसी बूलियन का उपयोग करके आसानी से कार्यान्वित किया जाता है <code>disposed</code> फ़ील्ड और शुरुआत में गार्ड क्लॉज में इसकी जाँच करना <code>dispose</code>, उस मामले में अपवाद उठाने के बजाय तत्काल लौट रहा है।<ref name="msdn_dispose"/>जावा डिस्पोजेबल प्रकारों को अलग करता है (वे जो [https://docs.oracle.com/javase/8/docs/api/java/lang/AutoCloseable.html AutoCloseable] लागू करते हैं) डिस्पोजेबल प्रकारों से अलग होते हैं जहां निपटान बेवकूफ है (उप प्रकार [https: //docs.oracle.com/javase/8/docs/api/java/io/Closeable.html Closeable])।
इसके अलावा, कॉल करना संभव है <code>dispose</code> किसी वस्तु पर एक से अधिक बार हालांकि यह एक प्रोग्रामिंग त्रुटि का संकेत दे सकता है (संसाधन धारण करने वाली प्रत्येक वस्तु को एक बार ठीक से निपटाया जाना चाहिए), यह सरल, अधिक मजबूत है, और इस प्रकार आमतौर पर इसके लिए बेहतर है <code>dispose</code> बेवकूफ होना (मतलब कई बार कॉल करना एक बार कॉल करने के समान है)।यह उसी बूलियन का उपयोग करके आसानी से कार्यान्वित किया जाता है <code>disposed</code> फ़ील्ड और शुरुआत में गार्ड क्लॉज में इसकी जाँच करना <code>dispose</code>, उस मामले में अपवाद उठाने के बजाय तत्काल लौट रहा है।जावा डिस्पोजेबल प्रकारों को अलग करता है (वे जो [https://docs.oracle.com/javase/8/docs/api/java/lang/AutoCloseable.html AutoCloseable] लागू करते हैं) डिस्पोजेबल प्रकारों से अलग होते हैं जहां निपटान बेवकूफ है (उप प्रकार [https: //docs.oracle.com/javase/8/docs/api/java/io/Closeable.html Closeable])।


संसाधनों को धारण करने वाली वस्तुओं की विरासत और संरचना की उपस्थिति में विनाश/अंतिमकरण (विनाशकों या अंतिमकर्ताओं के माध्यम से) के समान समस्याएं हैं। इसके अलावा, चूंकि डिस्पोजल पैटर्न में आमतौर पर इसके लिए भाषा समर्थन नहीं होता है, [[बॉयलरप्लेट कोड]] आवश्यक है। सबसे पहले, यदि कोई व्युत्पन्न वर्ग a को ओवरराइड करता है <code>dispose</code> बेस क्लास में विधि, व्युत्पन्न वर्ग में ओवरराइडिंग विधि को आम तौर पर कॉल करने की आवश्यकता होती है <code>dispose</code> आधार वर्ग में विधि, आधार में रखे संसाधनों को ठीक से जारी करने के लिए। दूसरे, यदि किसी वस्तु का किसी अन्य वस्तु के साथ संबंध है जो एक संसाधन रखती है (अर्थात, यदि कोई वस्तु अप्रत्यक्ष रूप से किसी अन्य वस्तु के माध्यम से संसाधन का उपयोग करती है जो सीधे संसाधन का उपयोग करती है), तो क्या अप्रत्यक्ष रूप से उपयोग करने वाली वस्तु डिस्पोजेबल होनी चाहिए? यह इस बात से मेल खाता है कि क्या संबंध मालिक है (ऑब्जेक्ट रचना) या देख रहा है ([[वस्तु एकत्रीकरण]]), या यहां तक ​​​​कि सिर्फ संचार ([[एसोसिएशन (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)]]), और दोनों कन्वेंशन पाए जाते हैं (अप्रत्यक्ष उपयोगकर्ता संसाधन के लिए जिम्मेदार है या जिम्मेदार नहीं है) ). यदि अप्रत्यक्ष उपयोग संसाधन के लिए ज़िम्मेदार है, तो इसे डिस्पोजेबल होना चाहिए, और स्वामित्व वाली वस्तुओं को निपटाने पर निपटाना चाहिए (स्वामित्व वाली वस्तुओं को नष्ट करने या अंतिम रूप देने के समान)।
संसाधनों को धारण करने वाली वस्तुओं की विरासत और संरचना की उपस्थिति में विनाश/अंतिमकरण (विनाशकों या अंतिमकर्ताओं के माध्यम से) के समान समस्याएं हैं। इसके अलावा, चूंकि डिस्पोजल पैटर्न में आमतौर पर इसके लिए भाषा समर्थन नहीं होता है, [[बॉयलरप्लेट कोड]] आवश्यक है। सबसे पहले, यदि कोई व्युत्पन्न वर्ग a को ओवरराइड करता है <code>dispose</code> बेस क्लास में विधि, व्युत्पन्न वर्ग में ओवरराइडिंग विधि को आम तौर पर कॉल करने की आवश्यकता होती है <code>dispose</code> आधार वर्ग में विधि, आधार में रखे संसाधनों को ठीक से जारी करने के लिए। दूसरे, यदि किसी वस्तु का किसी अन्य वस्तु के साथ संबंध है जो एक संसाधन रखती है (अर्थात, यदि कोई वस्तु अप्रत्यक्ष रूप से किसी अन्य वस्तु के माध्यम से संसाधन का उपयोग करती है जो सीधे संसाधन का उपयोग करती है), तो क्या अप्रत्यक्ष रूप से उपयोग करने वाली वस्तु डिस्पोजेबल होनी चाहिए? यह इस बात से मेल खाता है कि क्या संबंध मालिक है (ऑब्जेक्ट रचना) या देख रहा है ([[वस्तु एकत्रीकरण]]), या यहां तक ​​​​कि सिर्फ संचार ([[एसोसिएशन (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)]]), और दोनों कन्वेंशन पाए जाते हैं (अप्रत्यक्ष उपयोगकर्ता संसाधन के लिए जिम्मेदार है या जिम्मेदार नहीं है) ). यदि अप्रत्यक्ष उपयोग संसाधन के लिए ज़िम्मेदार है, तो इसे डिस्पोजेबल होना चाहिए, और स्वामित्व वाली वस्तुओं को निपटाने पर निपटाना चाहिए (स्वामित्व वाली वस्तुओं को नष्ट करने या अंतिम रूप देने के समान)।


रचना (स्वामित्व) एनकैप्सुलेशन (कंप्यूटर प्रोग्रामिंग) प्रदान करता है (केवल उपयोग की जाने वाली वस्तु को ट्रैक करने की आवश्यकता होती है), लेकिन काफी जटिलता की कीमत पर जब वस्तुओं के बीच आगे संबंध होते हैं, जबकि एकत्रीकरण (देखना) लागत पर काफी सरल होता है एनकैप्सुलेशन की कमी। .NET Framework|.NET में, सम्मेलन केवल संसाधनों के प्रत्यक्ष उपयोगकर्ता के लिए ज़िम्मेदार है: आपको IDisposable केवल तभी लागू करना चाहिए जब आपका प्रकार सीधे अप्रबंधित संसाधनों का उपयोग करता हो।<ref name="idisposable">{{cite web |url=https://msdn.microsoft.com/en-us/library/system.idisposable(v=vs.110).aspx |title=IDisposable Interface |accessdate=2016-04-03}}</ref> विवरण और अन्य उदाहरणों के लिए संसाधन प्रबंधन (कंप्यूटिंग) देखें।
रचना (स्वामित्व) एनकैप्सुलेशन (कंप्यूटर प्रोग्रामिंग) प्रदान करता है (केवल उपयोग की जाने वाली वस्तु को ट्रैक करने की आवश्यकता होती है), लेकिन काफी जटिलता की कीमत पर जब वस्तुओं के बीच आगे संबंध होते हैं, जबकि एकत्रीकरण (देखना) लागत पर काफी सरल होता है एनकैप्सुलेशन की कमी। .NET Framework|.NET में, सम्मेलन केवल संसाधनों के प्रत्यक्ष उपयोगकर्ता के लिए ज़िम्मेदार है: आपको IDisposable केवल तभी लागू करना चाहिए जब आपका प्रकार सीधे अप्रबंधित संसाधनों का उपयोग करता हो।<nowiki><ref name="idisposable"></nowiki>{{cite web |url=https://msdn.microsoft.com/en-us/library/system.idisposable(v=vs.110).aspx |title=IDisposable Interface |accessdate=2016-04-03}}</ref>


== यह भी देखें ==
== यह भी देखें ==

Revision as of 18:02, 11 March 2023

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में, निपटान पैटर्न संसाधन प्रबंधन के लिए एक डिज़ाइन पैटर्न है। इस पैटर्न में, एक सिस्टम संसाधन एक वस्तु द्वारा आयोजित किया जाता है, और एक पारंपरिक विधि को कॉल करके जारी किया जाता है - जिसे आमतौर पर भाषा के आधार पर close, dispose, free, release कहा जाता है - जो किसी भी संसाधन को जारी करता है, जिस पर ऑब्जेक्ट होल्ड होता है। कई प्रोग्रामिंग भाषाएं सामान्य परिस्थितियों में निपटान विधि को स्पष्ट रूप से कॉल करने से बचने के लिए भाषा निर्माण की पेशकश करती हैं।

निपटान पैटर्न मुख्य रूप से उन भाषाओं में उपयोग किया जाता है जिनके रनटाइम पर्यावरण में स्वत: कचरा संग्रह होता है।

प्रेरणा

संसाधनों को वस्तुओं में लपेटना

ऑब्जेक्ट्स में रैपिंग रिसोर्सेज एनकैप्सुलेशन का ऑब्जेक्ट-ओरिएंटेड फॉर्म है, और डिस्पोजल पैटर्न को रेखांकित करता है।

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

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

उदाहरण के लिए, सी फ़ाइल इनपुट/आउटपुट में, फ़ाइलों को FILE प्रकार की वस्तुओं द्वारा दर्शाया जाता है (भ्रामक रूप से फ़ाइल हैंडल कहा जाता है: ये एक भाषा-स्तरीय अमूर्तता हैं), जो फ़ाइल (जैसे कि ऑपरेटिंग सिस्टम) को संभालती है एक फाइल डिस्क्रिप्टर), साथ में सहायक जानकारी जैसे I/O मोड (पढ़ना, लिखना) और धारा में स्थिति। इन वस्तुओं को कॉल करके बनाया जाता है fopen (ऑब्जेक्ट-ओरिएंटेड शब्दों में, एक कंस्ट्रक्टर), जो संसाधन प्राप्त करता है और इसके लिए एक सूचक देता है, FILE ऑब्जेक्ट के पॉइंटर पर fclose को कॉल करके संसाधन जारी किया जाता है।[1] कोड में:


FILE *f = fopen(filename, mode);

// Do something with f.

fclose(f);


ध्यान दें कि fclose एक FILE * पैरामीटर वाला फ़ंक्शन है। ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, यह फ़ाइल ऑब्जेक्ट पर एक इंस्टेंस विधि है, जैसा कि पायथन में है:


f = open(filename)

# Do something with f.

f.close()


यह बिल्कुल निपटान पैटर्न है, और पारंपरिक फ़ाइल खोलने और बंद करने से सिंटैक्स और कोड संरचना[lower-alpha 1] में अलग है। अन्य संसाधनों को ठीक उसी तरह प्रबंधित किया जा सकता है: एक निर्माता या कारखाने में अधिग्रहित किया जा रहा है, और एक स्पष्ट close या dispose विधि द्वारा जारी किया जा रहा है।

शीघ्र रिलीज

मौलिक समस्या जिसका समाधान संसाधनों को मुक्त करना है, वह यह है कि संसाधन महंगे हैं (उदाहरण के लिए, खुली फ़ाइलों की संख्या पर एक सीमा हो सकती है), और इस प्रकार उन्हें तुरंत जारी किया जाना चाहिए। इसके अलावा, कभी-कभी कुछ अंतिमीकरण कार्य की आवश्यकता होती है, विशेष रूप से I/O के लिए, जैसे कि फ्लशिंग बफ़र्स यह सुनिश्चित करने के लिए कि सभी डेटा वास्तव में लिखे गए हैं।

यदि कोई संसाधन असीमित या प्रभावी रूप से असीमित है, और कोई स्पष्ट अंतिमीकरण आवश्यक नहीं है, तो इसे जारी करना महत्वपूर्ण नहीं है, और वास्तव में अल्पकालिक कार्यक्रम अक्सर संसाधनों को स्पष्ट रूप से जारी नहीं करते हैं: अल्पावधि के कारण, वे संसाधनों को समाप्त करने की संभावना नहीं रखते हैं , और वे किसी भी अंतिम रूप देने के लिए रनटाइम सिस्टम या ऑपरेटिंग सिस्टम पर भरोसा करते हैं।

हालांकि, सामान्य संसाधनों में प्रबंधित किया जाना चाहिए (विशेष रूप से लंबे समय तक रहने वाले कार्यक्रमों के लिए, कार्यक्रम जो कई संसाधनों का उपयोग करते हैं, या सुरक्षा के लिए, यह सुनिश्चित करने के लिए कि डेटा लिखा गया है)। स्पष्ट निपटान का मतलब है कि संसाधन को अंतिम रूप देना और जारी करना नियतात्मक और शीघ्र है: dispose विधि तब तक पूरी नहीं होती जब तक कि ये पूरा नहीं हो जाता।

स्पष्ट निपटान की आवश्यकता का एक विकल्प संसाधन प्रबंधन को जीवन भर के लिए बाँधना है: संसाधन वस्तु निर्माण के दौरान प्राप्त किए जाते हैं, और वस्तु विनाश के दौरान जारी किए जाते हैं। इस दृष्टिकोण को संसाधन अधिग्रहण प्रारंभ है (RAII) मुहावरा के रूप में जाना जाता है, और इसका उपयोग नियतात्मक स्मृति प्रबंधन (जैसे C ++) वाली भाषाओं में किया जाता है। इस स्थिति में, ऊपर दिए गए उदाहरण में, संसाधन तब प्राप्त होता है जब फ़ाइल ऑब्जेक्ट बनाया जाता है, और जब वेरिएबल का दायरा होता है f बाहर निकल गया है, फ़ाइल ऑब्जेक्ट कि f संदर्भित करता है नष्ट हो जाता है, और इसके हिस्से के रूप में, संसाधन जारी किया जाता है।

RAII निर्धारक होने के कारण वस्तु जीवनकाल पर निर्भर करता है; हालाँकि, स्वचालित मेमोरी प्रबंधन के साथ, ऑब्जेक्ट लाइफटाइम प्रोग्रामर की चिंता का विषय नहीं है: वस्तुओं को किसी बिंदु पर नष्ट कर दिया जाता है, जब उनका उपयोग नहीं किया जाता है, लेकिन जब अमूर्त होता है। दरअसल, जीवनकाल अक्सर निर्धारक नहीं होता है, हालांकि यह हो सकता है, विशेष रूप से यदि संदर्भ गणना का उपयोग किया जाता है। दरअसल, कुछ मामलों में इस बात की कोई गारंटी नहीं है कि वस्तुओं को कभी भी अंतिम रूप दिया जाएगा: जब कार्यक्रम समाप्त हो जाता है, तो यह वस्तुओं को अंतिम रूप नहीं दे सकता है, और इसके बजाय केवल ऑपरेटिंग सिस्टम को स्मृति को पुनः प्राप्त करने दें; यदि अंतिम रूप देने की आवश्यकता है (उदाहरण के लिए, बफर फ्लश करने के लिए), डेटा हानि हो सकती है।

इस प्रकार संसाधन प्रबंधन को जीवन भर वस्तु के साथ जोड़कर, निपटान पैटर्न संसाधनों को तुरंत जारी करने की अनुमति देता है, जबकि स्मृति प्रबंधन के लिए कार्यान्वयन लचीलापन प्रदान करता है। इसकी लागत यह है कि संसाधनों को मैन्युअल रूप से प्रबंधित किया जाना चाहिए, जो थकाऊ और त्रुटि-प्रवण हो सकता है।

प्रारंभिक निकास

डिस्पोजल पैटर्न के साथ एक प्रमुख समस्या यह है कि यदि dispose विधि नहीं कहा जाता है, तो संसाधन लीक हो जाता है। इसका एक सामान्य कारण जल्दी वापसी या अपवाद के कारण किसी समारोह से जल्दी बाहर निकलना है।

उदाहरण के लिए:

def func(filename):
    f = open(filename)
    if a:
        return x
    f.close()
    return y

यदि फ़ंक्शन पहली वापसी पर लौटता है, तो फ़ाइल कभी बंद नहीं होती है और संसाधन लीक हो जाता है।

def func(filename):
    f = open(filename)
    g(f)  # Do something with f that may raise an exception.
    f.close()

यदि हस्तक्षेप करने वाला कोड अपवाद उठाता है, तो फ़ंक्शन जल्दी निकल जाता है और फ़ाइल कभी बंद नहीं होती है, इसलिए संसाधन लीक हो जाता है।

इन दोनों को try...finally निर्माण द्वारा नियंत्रित किया जा सकता है, जो यह सुनिश्चित करता है कि अंत में खंड हमेशा बाहर निकलने पर निष्पादित किया जाता है:

def func(filename):
    try:
        f = open(filename)
        # Do something.
    finally:
        f.close()

अधिक सामान्य रूप से:

Resource resource = getResource();
try {
    // Resource has been acquired; perform actions with the resource.
    ...
} finally {
    // Release resource, even if an exception was thrown.
    resource.dispose();
}

try...finally निर्माण उचित अपवाद सुरक्षा के लिए आवश्यक है, क्योंकि finally में ब्लॉक क्लीनअप लॉजिक के निष्पादन को सक्षम करता है चाहे कोई अपवाद फेंका गया हो या नहीं try अवरोध पैदा करना।

इस दृष्टिकोण का एक नुकसान यह है कि प्रोग्रामर को अंत में ब्लॉक में स्पष्ट रूप से क्लीनअप कोड जोड़ने की आवश्यकता होती है finally अवरोध पैदा करना। इससे कोड आकार ब्लोट हो जाता है, और ऐसा करने में विफलता कार्यक्रम में संसाधन रिसाव का कारण बनेगी।

भाषा निर्माण

निपटान पैटर्न के सुरक्षित उपयोग को कम वर्बोज़ बनाने के लिए, कोड के एक ही ब्लॉक में रखे और जारी किए गए संसाधनों के लिए कई भाषाओं में किसी प्रकार का अंतर्निहित समर्थन होता है।

सी शार्प भाषा में using कथन[2] है जो स्वचालित रूप से किसी ऑब्जेक्ट पर Dispose विधि को कॉल करता है जो IDisposable इंटरफ़ेस लागू करता है:

using (Resource resource = GetResource())
{
    // Perform actions with the resource.
    ...
}

जो इसके बराबर है:

Resource resource = GetResource()
try 
{
    // Perform actions with the resource.
    ...
}
finally 
{
    // Resource might not been acquired, or already freed
    if (resource != null) 
        ((IDisposable)resource).Dispose(); 
}

इसी तरह, पायथन भाषा में एक with कथन है जिसका उपयोग संदर्भ प्रबंधक वस्तु के साथ समान प्रभाव के लिए किया जा सकता है। कॉन्टेक्स्ट मैनेजर प्रोटोकॉल को __enter__ और __exit__ विधियों को लागू करने की आवश्यकता होती है, जो कोड के दोहराव को रोकने के लिए स्वचालित रूप से स्टेटमेंट निर्माण द्वारा बुलाए जाते हैं, जो अन्यथा try/finally पैटर्न के साथ होते हैं।[3]

with resource_context_manager() as resource:
    # Perform actions with the resource.
    ...
# Perform other actions where the resource is guaranteed to be deallocated.
...

जावा भाषा ने जावा संस्करण 7 में एक नया सिंटैक्स पेश किया जिसे try-साथ-संसाधन कहा जाता है।[4] इसका उपयोग उन वस्तुओं पर किया जा सकता है जो ऑटोक्लोसेजबल इंटरफ़ेस को लागू करते हैं (जो कि विधि को परिभाषित करता है ()):

try (OutputStream x = new OutputStream(...)) {
    // Do something with x
} catch (IOException ex) {
    // Handle exception

  // The resource x is automatically closed
} // try

समस्याएं

रिटर्न और अपवादों की उपस्थिति में सही संसाधन प्रबंधन की प्रमुख समस्या से परे, और हीप-आधारित संसाधन प्रबंधन (वस्तुओं को जहां वे बनाए गए हैं, वहां से एक अलग दायरे में निपटाना), निपटान पैटर्न से जुड़ी कई और जटिलताएं हैं। इन समस्याओं को RAII द्वारा काफी हद तक टाला जाता है। हालाँकि, सामान्य सरल उपयोग में ये जटिलताएँ उत्पन्न नहीं होती हैं: एक संसाधन प्राप्त करें, इसके साथ कुछ करें, इसे स्वचालित रूप से जारी करें।

एक मौलिक समस्या यह है कि एक संसाधन का होना अब एक वर्ग अपरिवर्तनीय नहीं है (संसाधन वस्तु निर्माण से तब तक रखा जाता है जब तक इसका निपटान नहीं किया जाता है, लेकिन वस्तु अभी भी इस बिंदु पर जीवित है), इसलिए संसाधन उपलब्ध नहीं हो सकता है जब वस्तु कोशिश करती है इसका इस्तेमाल करें, उदाहरण के लिए बंद फ़ाइल से पढ़ने की कोशिश कर रहा है। इसका मतलब यह है कि संसाधन का उपयोग करने वाली वस्तु पर सभी विधियां संभावित रूप से असफल हो जाती हैं, आम तौर पर एक त्रुटि वापस करके या अपवाद उठाकर। व्यवहार में यह मामूली है, क्योंकि संसाधनों का उपयोग आमतौर पर अन्य कारणों से भी विफल हो सकता है (उदाहरण के लिए, किसी फ़ाइल के अंत को पढ़ने की कोशिश करना), इसलिए ये विधियाँ पहले से ही विफल हो सकती हैं, और संसाधन न होने से बस एक और संभावित विफलता जुड़ जाती है। इसे लागू करने का एक मानक तरीका ऑब्जेक्ट में एक बूलियन फ़ील्ड जोड़ना है, जिसे disposed कहा जाता है, जिसे dispose करके सही पर सेट किया जाता है, और एक गार्ड क्लॉज द्वारा सभी तरीकों (जो संसाधन का उपयोग करते हैं) के लिए चेक किया जाता है, एक अपवाद उठाते हुए (जैसे कि ObjectDisposedException .NET में) यदि वस्तु का निपटान किया गया है।[5]

यह भी देखें

  • ऑब्जेक्ट लाइफटाइम
  • संसाधन अधिग्रहण प्रारंभ है (RAII)

टिप्पणियाँ

  1. In class-based programming, methods are defined in a class, using an implicit this or self parameter, rather than as functions taking an explicit parameter.


संदर्भ

  1. stdio.h – Base Definitions Reference, The Single UNIX Specification, Version 4 from The Open Group
  2. Microsoft MSDN: using Statement (C# Reference)
  3. Guido van Rossum, Nick Coghlan (13 June 2011). "PEP 343: The "with" Statement". Python Software Foundation.
  4. Oracle Java tutorial: The try-with-resources Statement
  5. "निपटान पैटर्न".</रेफरी> इसके अलावा, कॉल करना संभव है dispose किसी वस्तु पर एक से अधिक बार हालांकि यह एक प्रोग्रामिंग त्रुटि का संकेत दे सकता है (संसाधन धारण करने वाली प्रत्येक वस्तु को एक बार ठीक से निपटाया जाना चाहिए), यह सरल, अधिक मजबूत है, और इस प्रकार आमतौर पर इसके लिए बेहतर है dispose बेवकूफ होना (मतलब कई बार कॉल करना एक बार कॉल करने के समान है)।यह उसी बूलियन का उपयोग करके आसानी से कार्यान्वित किया जाता है disposed फ़ील्ड और शुरुआत में गार्ड क्लॉज में इसकी जाँच करना dispose, उस मामले में अपवाद उठाने के बजाय तत्काल लौट रहा है।जावा डिस्पोजेबल प्रकारों को अलग करता है (वे जो AutoCloseable लागू करते हैं) डिस्पोजेबल प्रकारों से अलग होते हैं जहां निपटान बेवकूफ है (उप प्रकार [https: //docs.oracle.com/javase/8/docs/api/java/io/Closeable.html Closeable])। संसाधनों को धारण करने वाली वस्तुओं की विरासत और संरचना की उपस्थिति में विनाश/अंतिमकरण (विनाशकों या अंतिमकर्ताओं के माध्यम से) के समान समस्याएं हैं। इसके अलावा, चूंकि डिस्पोजल पैटर्न में आमतौर पर इसके लिए भाषा समर्थन नहीं होता है, बॉयलरप्लेट कोड आवश्यक है। सबसे पहले, यदि कोई व्युत्पन्न वर्ग a को ओवरराइड करता है dispose बेस क्लास में विधि, व्युत्पन्न वर्ग में ओवरराइडिंग विधि को आम तौर पर कॉल करने की आवश्यकता होती है dispose आधार वर्ग में विधि, आधार में रखे संसाधनों को ठीक से जारी करने के लिए। दूसरे, यदि किसी वस्तु का किसी अन्य वस्तु के साथ संबंध है जो एक संसाधन रखती है (अर्थात, यदि कोई वस्तु अप्रत्यक्ष रूप से किसी अन्य वस्तु के माध्यम से संसाधन का उपयोग करती है जो सीधे संसाधन का उपयोग करती है), तो क्या अप्रत्यक्ष रूप से उपयोग करने वाली वस्तु डिस्पोजेबल होनी चाहिए? यह इस बात से मेल खाता है कि क्या संबंध मालिक है (ऑब्जेक्ट रचना) या देख रहा है (वस्तु एकत्रीकरण), या यहां तक ​​​​कि सिर्फ संचार (एसोसिएशन (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)), और दोनों कन्वेंशन पाए जाते हैं (अप्रत्यक्ष उपयोगकर्ता संसाधन के लिए जिम्मेदार है या जिम्मेदार नहीं है) ). यदि अप्रत्यक्ष उपयोग संसाधन के लिए ज़िम्मेदार है, तो इसे डिस्पोजेबल होना चाहिए, और स्वामित्व वाली वस्तुओं को निपटाने पर निपटाना चाहिए (स्वामित्व वाली वस्तुओं को नष्ट करने या अंतिम रूप देने के समान)। रचना (स्वामित्व) एनकैप्सुलेशन (कंप्यूटर प्रोग्रामिंग) प्रदान करता है (केवल उपयोग की जाने वाली वस्तु को ट्रैक करने की आवश्यकता होती है), लेकिन काफी जटिलता की कीमत पर जब वस्तुओं के बीच आगे संबंध होते हैं, जबकि एकत्रीकरण (देखना) लागत पर काफी सरल होता है एनकैप्सुलेशन की कमी। .NET Framework|.NET में, सम्मेलन केवल संसाधनों के प्रत्यक्ष उपयोगकर्ता के लिए ज़िम्मेदार है: आपको IDisposable केवल तभी लागू करना चाहिए जब आपका प्रकार सीधे अप्रबंधित संसाधनों का उपयोग करता हो।<ref name="idisposable">"IDisposable Interface". Retrieved 2016-04-03.


अग्रिम पठन