हाल ही में एकल के खिलाफ किसी प्रकार की क्रांति हुई है, लेकिन अगर वे स्टेटलेस हैं तो क्या उनके साथ कुछ गलत है?
मुझे पता है कि अति प्रयोग और सभी बातें ... यह सब कुछ पर लागू होता है न कि केवल एकल गीतों पर।
हाल ही में एकल के खिलाफ किसी प्रकार की क्रांति हुई है, लेकिन अगर वे स्टेटलेस हैं तो क्या उनके साथ कुछ गलत है?
मुझे पता है कि अति प्रयोग और सभी बातें ... यह सब कुछ पर लागू होता है न कि केवल एकल गीतों पर।
जवाबों:
> Are immutable/stateless singletons bad?
अधिक जानकारी के लिए प्याज-वास्तुकला देखें
मैं अन्य कारणों से नहीं देखता कि सिंग्लेटन्स का उपयोग क्यों नहीं किया जाता है।
यह हमेशा उपयोग पर निर्भर करता है। मुझे लगता है कि क्रांति इस तथ्य से आती है, कि प्रत्येक प्रोग्रामर इस पैटर्न को ऑब्जेक्ट ओरिएंटेड पैटर्न के रूप में सीखता है । अधिकांश यह सोचना भूल जाते हैं कि यह कहां समझ में आता है और कहां नहीं।
यह, निश्चित रूप से, हर पैटर्न के लिए सही है। बस पैटर्न का उपयोग करके आप अच्छा कोड या अच्छा सॉफ्टवेयर नहीं बनाते हैं।
यदि आपके पास एक स्टेटलेस सिंगलटन है, तो केवल स्थिर तरीकों की पेशकश करने वाले वर्ग का उपयोग क्यों न करें (या स्थिर वर्ग का उपयोग करें)?
यहां सामान्य रूप से वैश्विक चर और एकल के बारे में कुछ पोस्ट हैं।
मैं लेखक की तरह सख्त नहीं होता, लेकिन वह दिखाता है कि ज्यादातर मामलों के लिए जहां आपको लगता है कि आपको एक सिंगलटन की जरूरत है, आपको वास्तव में इसकी जरूरत नहीं है।
कुछ भी नहीं है एक अपरिवर्तनीय स्टेटलेस सिंगलटन एक स्थिर वर्ग नहीं कर सकता है।
जटिलता के अतिरिक्त स्तर को जोड़ने का कोई कारण नहीं है कि -> इंस्टेंस () बनाता है, जबकि एक स्थैतिक विधि को सादा कॉल संसाधनों के मामले में अधिक रूढ़िवादी, अधिक रूढ़िवादी और अधिक स्पष्ट होगा।
ऐसा नहीं है कि वे गलत हैं। यह है कि इसे करने का एक बेहतर तरीका है। ऐसे परिदृश्य हैं जहां सामान्य ("स्टेटफुल") सिंगलेट्स जाने का सही तरीका है। सिंगलटन के साथ बुराई यह है कि उन्हें अक्सर दुर्व्यवहार किया जाता है, वैश्विक चर के समान बुरे परिणाम के साथ, लेकिन ऐसे विशिष्ट मामले हैं जहां सिंगलटन का उपयोग करना सही है। स्टेटलेस के लिए ऐसे मामले नहीं हैं।
सिंगलटन के साथ मुख्य समस्या यह है कि यह क्रॉस-कटिंग चिंताओं के परिदृश्य में उपयोग किए जाने पर निर्भरता और युग्मन को छुपाता है। देखें सिंग्लेटन्स पैथोलॉजिकल लियर्स हैं या आगे पढ़ने के लिए सिंगलनेट ईविल क्यों हैं ।
दूसरी तरफ, एक राज्य कम सिंगलटन, अगर दुरुपयोग नहीं किया जाता है, तो सहायक हो सकता है और प्रदर्शन में सुधार कर सकता है। एक उदाहरण पर विचार करें:
interface Interface
{
void Method();
}
class StatelessSingleton : Interface
{
public static readonly StatelessSingleton Instance = new StatelessSingleton();
private StatelessSingleton() { }
public void Method() { }
}
class User
{
public User(Interface i) { /* ... */ }
}
यहाँ, StatlessSingleton इंटरफ़ेस के डिफ़ॉल्ट कार्यान्वयन के रूप में कार्य करता है और इसे उपयोगकर्ता कंस्ट्रक्टर में डाल दिया जाता है। कोई हार्ड-कोडिंग युग्मन और हिडेन निर्भरता नहीं है। हम अंतर्निहित इंटरफ़ेस के कारण एक स्थिर वर्ग का उपयोग करने में असमर्थ हैं, लेकिन डिफ़ॉल्ट के एक से अधिक उदाहरण बनाने का कोई कारण नहीं है। यही कारण है कि एक स्टेटलेस सिंगलटन एक उपयुक्त विकल्प लगता है।
हालाँकि, शायद हमें डिफ़ॉल्ट कार्यान्वयन के लिए किसी अन्य पैटर्न का उपयोग करना चाहिए:
class Implementation : Interface
{
private readonly Action _method;
public Implementation()
{
_method = new Action(() => { /* default */ });
}
public Implementation(Action custom)
{
_method = custom;
}
public void Method()
{
_method();
}
}
यह स्टेटलेसलेसिंगटन के संबंध में प्रदर्शन को हिट करता है, लेकिन इंटरफ़ेस का सामान्य कार्यान्वयन करता है। इसी तरह के समाधान का उपयोग IProgress इंटरफ़ेस द्वारा किया जाता है ।
फिर से, डिफ़ॉल्ट व्यवहार के एक से अधिक कार्यान्वयन बनाने की अनुमति क्यों? फिर भी हम दो को जोड़ सकते हैं:
class Implementation : Interface
{
public readonly Implementation Default = new Implementation();
private readonly Action _method;
private Implementation()
{
_method = new Action(() => { /* default */ });
}
public Implementation(Action custom)
{
_method = custom;
}
public void Method()
{
_method();
}
}
अंत में, मेरा मानना है कि ऐसे स्थान हैं (जैसा कि डिफॉल्ट के रूप में दर्शाया गया है) जहाँ सिंग्लेटन्स उपयोगी हैं। सिंगलटन की मुख्य परिभाषा में कहा गया है कि यह एक वर्ग के एक से अधिक उदाहरण बनाने के लिए अस्वीकृत है । यह परमाणु शक्ति के रूप में है। एक ऊर्जा या एक बम का उत्पादन कर सकते हैं। यह मानव पर निर्भर करता है।