क्लास डिजाइन करते समय व्यवहार में स्थिरता को सामान्य प्रोग्रामिंग अभ्यास के अनुकूल होना चाहिए? एक विशिष्ट उदाहरण देने के लिए:
एक सामान्य सम्मेलन यह है: यदि कोई वर्ग किसी वस्तु का मालिक है (जैसे उसने इसे बनाया है) तो यह एक बार पूरा होने के बाद इसे साफ करने के लिए जिम्मेदार है। एक विशिष्ट उदाहरण .NET में होगा कि यदि आपका वर्ग किसी IDisposable
वस्तु का मालिक है तो उसे अपने जीवन के अंत में इसका निपटान करना चाहिए। और अगर आप इसके मालिक नहीं हैं तो इसे मत छुइए।
अब अगर हम StreamWriter
.NET में क्लास को देखते हैं तो हम डॉक्यूमेंट में पा सकते हैं कि यह अंतर्निहित स्ट्रीम को बंद कर देता है जब इसे बंद / डिस्पोज किया जा रहा है। यह उन मामलों में आवश्यक है जहां StreamWriter
फ़ाइल नाम में पास करके त्वरित किया जाता है क्योंकि लेखक अंतर्निहित फ़ाइल स्ट्रीम बनाता है और इसलिए इसे बंद करने की आवश्यकता है। हालाँकि एक बाहरी धारा में भी गुजर सकता है जिसे लेखक भी बंद कर देता है।
इसने मुझे कई बार परेशान किया है (हाँ मुझे पता है कि आप एक नॉन-क्लोजिंग रैपर बना सकते हैं, लेकिन यह बात नहीं है) लेकिन जाहिर है कि माइक्रोसॉफ्ट ने यह निर्णय लिया है कि यह हमेशा स्ट्रीम को बंद करने के लिए अधिक सुसंगत है, जहां से यह आया है।
जब मैं अपनी एक कक्षा में इस तरह के पैटर्न पर आ ownsFooBar
जाता हूं, तो मैं आमतौर पर एक ध्वज बनाता हूं जो उन मामलों में झूठे हो जाता है जहां FooBar
निर्माणकर्ता के माध्यम से इंजेक्शन लगाया जाता है और अन्यथा सच है। इस तरह इसे साफ करने की जिम्मेदारी कॉल करने वाले को दी जाती है, जब वह स्पष्ट रूप से उदाहरण को पास करता है।
अब मैं सोच रहा हूँ कि क्या हो सकता है कि संगति सर्वोत्तम अभ्यास के पक्ष में हो (या शायद मेरा सबसे अच्छा अभ्यास उतना अच्छा नहीं है)? इसके लिए कोई तर्क / विरोध?
स्पष्टीकरण के लिए संपादित करें
"सुसंगतता" से मेरा मतलब है: वर्ग का सुसंगत व्यवहार हमेशा स्वामित्व लेना (और धारा को बंद करना) बनाम "सर्वोत्तम अभ्यास" केवल किसी वस्तु का स्वामित्व लेने के लिए यदि आपने इसे बनाया है या स्वामित्व को स्पष्ट रूप से स्थानांतरित किया है।
एक उदाहरण के लिए जहां यह लागू हो रहा है:
मान लें कि आपके पास दो दी गई कक्षाएं हैं (कुछ 3 पार्टी लाइब्रेरी से) जो इसके साथ कुछ करने के लिए एक स्ट्रीम स्वीकार करते हैं, जैसे कुछ डेटा बनाना और संसाधित करना:
public class DataProcessor
{
public Result ProcessData(Stream input)
{
using (var reader = new StreamReader(input))
{
...
}
}
}
public class DataSource
{
public void GetData(Stream output)
{
using (var writer = new StreamWriter(output))
{
....
}
}
}
अब मैं इसे इस तरह उपयोग करना चाहता हूं:
Result ProcessSomething(DataSource source)
{
var processor = new DataProcessor();
...
var ms = new MemoryStream();
source.GetData(ms);
return processor.ProcessData(ms);
}
यह Cannot access a closed stream
डेटा प्रोसेसर में एक अपवाद के साथ विफल हो जाएगा । यह थोड़ा सा निर्मित है लेकिन इस बिंदु को स्पष्ट करना चाहिए। इसे ठीक करने के विभिन्न तरीके हैं लेकिन फिर भी मुझे लगता है कि मुझे कुछ ऐसा काम करना चाहिए जो मुझे नहीं करना चाहिए।