resource-cleanup IDispose इंटरफेस का उपयोग यह बताने के लिए करता है कि जब किसी ऑब्जेक्ट की ज़रूरत नहीं रहती, तब उस ऑब्जेक्ट के संसाधन या प्रोग्राम की दूसरी स्थिति को छोड़ना या रीसेट करना ज़रूरी हो जाता है (और सिर्फ गार्बेज कलेक्टर पर भरोसा करने से यह काम नहीं होगा, और न ही ज़रूरी स्तर का नियंत्रण मिलेगा), और ऐसे सफाई के कामों की स्वाभाविक जगह IDisposable.Dispose() मेथड ही है।
एक और तरीका भी है, using ब्लॉक, जिसकी मदद से कॉल करने वाले की नज़र में संसाधन के जीवनकाल का पूरा प्रबंधन एक ही स्टेटमेंट में समेटा जा सकता है।
using (var file = new File("my_secrets"))
{
file.WriteSecret("xxxxxxx");
}
ऊपर के उदाहरण में file से जुड़े फाइल सिस्टम के संसाधन using ब्लॉक से बाहर निकलते ही ऑपरेटिंग सिस्टम को वापस लौटा दिए जाते हैं।
यह पैटर्न काम करे, इसके लिए using स्टेटमेंट वाला वेरिएबल ऐसा रेफरेंस टाइप होना चाहिए जो IDisposable इंटरफेस को लागू करता हो, और अपने Dispose() मेथड में संसाधन छोड़ता हो या प्रोग्राम की स्थिति रीसेट करता हो।
C# 8 इस पैटर्न में एक सुधार लेकर आया है। using स्टेटमेंट को किसी ब्लॉक के शुरू में भी लिखा जा सकता है।
using var drawingResource = some_provided_or_new_object;
try
{
drawingResource.DrawSomething();
}
catch (Exception)
{
throw;
}
Java के डेवलपर इसे Java 7 में पेश किए गए स्वचालित संसाधन प्रबंधन तंत्र जैसा ही मान सकते हैं।
आप फिर से उस ORM (Object Relationship Mapping) सिस्टम पर काम कर रहे हैं, जिससे object-relational-mapping में परिचय कराया गया था।
हमारे ORM के उपयोग के विश्लेषण से पता चलता है कि 95% ट्रांज़ैक्शन किसी एक ही मेथड से चलाए जाते हैं। इसलिए यह तय किया गया कि ट्रांज़ैक्शन खोलने, लिखने और कमिट करने वाला एक ही ORM मेथड होना ज़्यादा उपयुक्त रहेगा।
डेटाबेस में ये इंस्टेंस मेथड हैं:
Database.BeginTransaction() डेटाबेस पर एक ट्रांज़ैक्शन शुरू करता है।Database.Write(string data) ट्रांज़ैक्शन के अंदर डेटाबेस में डेटा लिखता है। अगर इसे खराब डेटा मिलता है, तो एक एक्सेप्शन फेंका जाएगा। अगर BeginTransaction() कॉल किए बिना इस मेथड को कॉल करने की कोशिश की जाए, तो भी एक एक्सेप्शन फेंका जाएगा। सफल होने पर डेटाबेस की आंतरिक स्थिति DataWritten हो जाएगी।Database.EndTransaction() ट्रांज़ैक्शन को डेटाबेस में कमिट करता है। अगर यह ट्रांज़ैक्शन बंद नहीं कर पाता, या Database.BeginTransaction() कॉल नहीं किया गया था, तो यह एक एक्सेप्शन फेंक सकता है।Database.Dispose() को कॉल करने से डेटाबेस साफ हो जाता है। इससे डेटाबेस की स्थिति Closed हो जाती है।Orm.Write() मेथड बनाइए, जो डेटाबेस ट्रांज़ैक्शन शुरू करे, उसमें पास किया गया डेटा लिखे और ट्रांज़ैक्शन कमिट करे। InvalidOperationException सहित सभी एक्सेप्शन को बिना लॉग किए और बिना किसी और हस्तक्षेप के कॉलर तक जाने देना चाहिए।
Database db = new Database();
Orm orm = new Orm(db);
orm.Write("good write");
// => database has an internal state of State.Closed
orm.Write("bad write");
// => an exception is thrown but database is left with an internal state of State.Closed
orm.Write("bad commit");
// => an exception is thrown but database is left with an internal state of State.Closed
Orm.Write() आए कुछ महीने हो गए हैं और टीम में मतभेद है। कई डेवलपर चाहते हैं कि एक्सेप्शन फेंके जाने पर ORM खुद एरर संभाले और कॉलर को बस सफलता का संकेत लौटा दे।
कृपया Orm.WriteSafely() मेथड बनाइए, जो डेटाबेस ट्रांज़ैक्शन शुरू करे, पास किया गया डेटा लिखे और ट्रांज़ैक्शन कमिट करे (जैसा ऊपर बताया गया है)। अगर लिखना सफल रहा हो, तो इसे true लौटाना चाहिए, वरना false। एक्सेप्शन को लॉग करने की कोशिश न कीजिए।
Database db = new Database();
Orm orm = new Orm(db);
orm.WriteSafely("good write");
// => true
orm.WriteSafely("bad write");
// => false
orm.WriteSafely("bad commit");
// => false
Exercism पर साइन अप कीजिए और C# को 62 कॉन्सेप्ट178 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।