मैं हाल ही में डिज़ाइन पैटर्न से बहुत गहन हूं, और विशेष रूप से एक या कई इंटरफेस को लागू करने वाले मेरे वर्गों में सही डिज़ाइन पैटर्न का पालन करता हूं।इंटरफेस को लागू करने के लिए विशिष्ट पैटर्न का उपयोग
चलो एक उदाहरण लें। जब एक वर्ग IDisposable
लागू करता है तो आपको यह सुनिश्चित करने के लिए एक विशिष्ट पैटर्न का पालन करना चाहिए कि एक निजी निपटान (बूल डिस्पोजेन) विधि बनाकर, जो आपके द्वारा अंतिम रूप से कहा जाता है, या यदि इसे सार्वजनिक निपटान से कहा जाता है, तो अलग-अलग तरीके से साफ किया जाता है। तरीका। इसके अलावा, इस मामले में एक फाइनलाइज़र लागू किया जाना चाहिए, और आपको एक निजी बूल वैरिएबल की भी आवश्यकता हो सकती है जिसे डिस्प्ले विधि द्वारा सेट किया गया है, ताकि ऑब्जेक्ट के बाद बुलाए गए किसी भी विधि को अपवादित किया जा सके, यह स्पष्ट कर देगा कि यह ऑब्जेक्ट विधि को क्रैश करने के अंदर कोड के बजाय पहले ही डिस्पोजेड किया गया है क्योंकि कुछ आवश्यक resouces का निपटारा किया जाता है, और इस प्रकार अब उपलब्ध नहीं है।
मैं कई अन्य इंटरफेस भी नियमित रूप से कार्यान्वित करता हूं, लेकिन यह उन सभी में से नहीं है, मुझे यकीन है कि अगर मैं उन्हें लागू करने का तरीका यह करने का पसंदीदा तरीका है, और मुझे बाद में पता चल जाएगा कि यह एक कारण बनता है सूक्ष्म बग जो खोजना मुश्किल है, शायद अगर मैं पहले स्थान पर उचित पैटर्न का पालन करता तो संभवतः अस्तित्वहीन नहीं होता।
इंटरफेस के कुछ उदाहरण मैं जानना चाहता हूं कि कार्यान्वयन का सबसे अच्छा तरीका ISerializable, IComparable, IComparable <>, ICloneable, IEnumerable <>, और इसी तरह से है। फ्रेमवर्क से सभी इंटरफेस यहां दिलचस्प हैं, इसलिए यह उन लोगों तक सीमित नहीं होना चाहिए जिन्हें मैंने ऊपर सूचीबद्ध किया है।
मैं क्या कर रहा हूं अलग-अलग इंटरफेस, पसंदीदा तरीका और आशा है कि इंटरनेट पर संसाधन का एक लिंक भी बताता है कि कैसे और क्यों एक विशिष्ट पैटर्न का पालन किया जाना चाहिए।
मैं, इन पैटर्न का एक अच्छा संग्रह प्राप्त करने के लिए आशा है कि के रूप में मुझे पता है कि वे बहुत मेरी कोड में सुधार लाने और इसे और अधिक सही कर सकते हैं और पालन सर्वोत्तम प्रथाओं
यह बहुत अच्छा है, तो वहाँ कई पैटर्न के लिए कर रहे हैं हो सकता है एक ही इंटरफ़ेस ताकि हम चर्चा कर सकें कि कौन सा पसंदीदा है। इससे आप में से कुछ शायद नए पैटर्न पर जा सकते हैं, या अपने कोड को और भी बेहतर बनाने के लिए अपने मौजूदा पैटर्न में संशोधन कर सकते हैं, और यह बहुत अच्छा होगा!
संपादित
Grzenios टिप्पणी पढ़ने के बाद, मैं भी हर किसी से आग्रह करता हूं संदर्भ पैटर्न के लिए लागू किया जाना चाहिए देने के लिए होगा। उदाहरण के लिए IDIsposable पैटर्न का पालन किया जाना चाहिए यदि आपके पास अपनी कक्षा के अंदर कुछ अप्रबंधित संसाधन हैं जिन्हें आपको निपटान करने की आवश्यकता है, और यदि नहीं, तो उन सभी ऑब्जेक्ट्स जिन्हें आप लागू करने के लिए आवश्यक हैं IDISposable स्वयं।
संपादित 2
मैं शायद यह अपने आप शुरू कर देना चाहिए, के बाद से मैं सवाल यहाँ से बाहर डाल दिया। तो मैं एक पैटर्न का वर्णन करूंगा जो मुझे अच्छी तरह से पता है, और यह IDISposable पैटर्न है।
यह पैटर्न केवल तभी उपयोग किया जाना चाहिए जब आपकी कक्षा में आपकी कक्षा के अंदर एक या अधिक अप्रबंधित संसाधन हों, और आप यह सुनिश्चित कर लें कि वे विवादित हो जाएं। इस मामले में निपटान विधि के अतिरिक्त हमें आपकी कक्षा के उपयोगकर्ता को निपटाने के लिए भूलने के मामले में अंतिम रूप देने की आवश्यकता होगी।
तो पहले सबसे पहले। आपकी कक्षा को IDISposable इंटरफ़ेस को कार्यान्वित करना चाहिए, और आपको इंटरफ़ेस द्वारा सार्वजनिक निपटान विधि को परिभाषित करना होगा।यह विधि इस तरह दिखनी चाहिए:
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
यह संरक्षित निपटान (बूल) विधि को कॉल करेगा जो वास्तविक सफाई का ख्याल रखता है।
private bool alreadyDisposed = false;
GC.SuppressFinalize कचरा कलेक्टर बताता है कि यह आइटम भले ही यह एक है अंतिम रूप दिया जा की जरूरत नहीं है:
इसके अलावा, अगर वर्ग या निपटान किया जाता है नहीं अपनी कक्षा में एक vaiable इंगित करने के लिए शामिल finalizer।
फिर आपको संरक्षित निपटान विधि की आवश्यकता है। यह मामले में बजाय निजी की रक्षा की किसी भी व्युत्पन्न वर्ग इसे ओवरराइड करने की जरूरत है:
~SomeClass(){
Dispose(false);
}
कुछ विधि हैं:
protected virtual void Dispose(bool isDisposing)
{
if (alreadyDisposed)
{
return;
}
if (isDisposing)
{
// free all managed resources here
}
// free all unmanaged resources here.
alreadyDisposed = true;
}
finalizer भी निपटान (bool) बुलाना चाहिए उपयोगकर्ता को साफ करने के भूल जाता है फ़ंक्शन करने के लिए एक डिस्पोजेड संसाधन की आवश्यकता होती है, इस तरह की फ़ंक्शन बनाएं:
public void SomeMethod()
{
if (alreadyDisposed)
throw new ObjectDisposedException("SomeClass",
"Called SomeMethod on Disposed object");
// Method body goes here
}
यही है। यह सुनिश्चित करेगा कि संसाधन साफ हो जाएंगे। अपने वर्ग कॉलिंग के उपयोगकर्ता द्वारा पसंदीदा, निपटान करें, लेकिन फ़ॉलबैक विधि के रूप में फ़ाइनलज़र जोड़कर।
आईडीस्पोजेबल कार्यान्वयन पैटर्न केवल तभी मान्य होता है जब आपको * अंतिम * की आवश्यकता होती है। मामलों में आप वास्तविक जीवन में वास्तव में हानिकारक देखेंगे (क्योंकि जब आपको इसकी आवश्यकता नहीं होती है तो आपको अंतिम रूप देने वाला होता है, जिससे जीसी अधिक महंगा हो जाता है) – Grzenio
@Grzenio - मुझे लगता है कि आप का मतलब है कि आपको केवल पैटर्न का पालन करना होगा जब आपके पास अपनी कक्षा के भीतर भी अप्रबंधित संसाधन हैं, और न केवल प्रबंधित संसाधनों को प्रबंधित किया जाता है। महान टिप्पणी। मैं किसी और उत्तर के लिए इसे स्पष्ट करने के लिए अपनी पोस्ट में एक संपादन कर दूंगा। –