क्या अपरिवर्तनीय / स्टेटलेस सिंगलेट्स खराब हैं?


12

हाल ही में एकल के खिलाफ किसी प्रकार की क्रांति हुई है, लेकिन अगर वे स्टेटलेस हैं तो क्या उनके साथ कुछ गलत है?

मुझे पता है कि अति प्रयोग और सभी बातें ... यह सब कुछ पर लागू होता है न कि केवल एकल गीतों पर।


1
नहीं, सिंगलेट्स सिद्धांत रूप में बुरे नहीं हैं, वे केवल बड़े पैमाने पर अत्यधिक उपयोग किए जाते हैं।
बार्ट वैन इनगेन शनाउ

3
तुम हाल ही में क्या मतलब है?
मनोज आर।

5
@ जोशीम सौर: आपको बदलने की आवश्यकता क्यों होगी; अगर यह स्टेटलेस है तो आप इसे सही तरीके से परख सकते हैं।
m3th0dman

1
यदि आपके पास स्टेटलेस सिंगलटन है, तो आपके पास मूल रूप से एक स्टेटिक यूटिलिटी क्लास है, जिसमें गॉड क्लास एंटी-पैटर्न में बढ़ने की प्रवृत्ति है। आप आमतौर पर उनके द्वारा उपयोग किए जा रहे संदर्भ (या इससे भी बेहतर: C # में एक्सटेंशन विधियों का उपयोग करें) के बजाय स्थैतिक विधियों का उपयोग कर सकते हैं।
Spoike

जवाबों:


12
  > Are immutable/stateless singletons bad?
  • नहीं, अगर वे अन्य बाहरी प्रणालियों पर निर्भर नहीं करते हैं।
    • उदाहरण: एक स्ट्रिंग के अंदर HTML से बचने वाली स्ट्रिंगिलिटी।
    • कारण: unittests में इसे मॉक / सिम्युलेटर के साथ बदलने की कोई आवश्यकता नहीं है।
  • हाँ, यदि आपकी अपरिवर्तनीय / स्टेटलेस सिंगलटन अन्य बाहरी प्रणालियों / सेवाओं पर निर्भर करती है और यदि आप बिना सोचे-समझे (अलगाव में परीक्षण) करना चाहते हैं
    • उदाहरण: एक सेवा जो एक बाहरी कर-कैलकुलेटर-वेबबेस सेवा पर निर्भर करती है।
    • कारण: इस सेवा (अलगाव में) के साथ यूनिटेस्ट करने के लिए आपको बाहरी सिस्टम / सेवाओं का अनुकरण / मॉक करना होगा।

अधिक जानकारी के लिए प्याज-वास्तुकला देखें


  • सिंगलटन-एस इकाई-परीक्षण (अलगाव में) को अधिक विभेद / असंभव बना सकता है और
  • छिपे हुए आश्रितों / युग्मन को एक समस्या के रूप में देखा जा सकता है जैसा कि @yee द्वारा समझाया गया है

मैं अन्य कारणों से नहीं देखता कि सिंग्लेटन्स का उपयोग क्यों नहीं किया जाता है।


यदि आप अपनी कक्षा का परीक्षण करना चाहते हैं, तो भी आपको उस बाहरी वेब सेवा का मजाक उड़ाना होगा, भले ही वह (स्टेटलेस) सिंगलटन न हो।
m3th0dman

@ m3th0dman मैं सहमत हूँ
3 बी

10

यह हमेशा उपयोग पर निर्भर करता है। मुझे लगता है कि क्रांति इस तथ्य से आती है, कि प्रत्येक प्रोग्रामर इस पैटर्न को ऑब्जेक्ट ओरिएंटेड पैटर्न के रूप में सीखता है । अधिकांश यह सोचना भूल जाते हैं कि यह कहां समझ में आता है और कहां नहीं।
यह, निश्चित रूप से, हर पैटर्न के लिए सही है। बस पैटर्न का उपयोग करके आप अच्छा कोड या अच्छा सॉफ्टवेयर नहीं बनाते हैं।

यदि आपके पास एक स्टेटलेस सिंगलटन है, तो केवल स्थिर तरीकों की पेशकश करने वाले वर्ग का उपयोग क्यों न करें (या स्थिर वर्ग का उपयोग करें)?

यहां सामान्य रूप से वैश्विक चर और एकल के बारे में कुछ पोस्ट हैं।

मैं लेखक की तरह सख्त नहीं होता, लेकिन वह दिखाता है कि ज्यादातर मामलों के लिए जहां आपको लगता है कि आपको एक सिंगलटन की जरूरत है, आपको वास्तव में इसकी जरूरत नहीं है।


1
स्थैतिक विधियों के साथ एक वर्ग का उपयोग क्यों नहीं करें? उदाहरण के लिए वंशानुक्रम ...
m3th0dman

3
@ m3th0dman: वंशानुक्रम के लिए एक अच्छी जगह की तरह आवाज नहीं करता है।
बिली ओनली

@Billyoneal आप कह सकते हैं कि विरासत के लिए कुछ अच्छा या बुरा है यदि आप डोमेन मॉडल को जानते हैं, तो उस तरीके से क्या करना है ...
m3th0dman

2
@ m3th0dman: एर्म, नहीं। डोमेन मॉडल के बारे में कुछ भी जाने बिना मैं काफी सकारात्मक हो सकता हूं। बहुरूपता बहुरूपी व्यवहार के लिए है। लेकिन एक सिंगलटन के रूप में, आपके पास बहुरूपी व्यवहार नहीं है।
बिली ओनली

1
@ m3th0dman: क्योंकि सिंगलटन ऑब्जेक्ट को कॉल साइट पर सिंगलटन के नाम को निर्दिष्ट करने की आवश्यकता होती है। जिसका अर्थ है कि आप बहुरूपी व्यवहार का उपयोग नहीं कर रहे हैं। जिसका अर्थ है कि रचना वंशानुक्रम की तुलना में कहीं अधिक लचीली है।
बिली ओनेल

7

कुछ भी नहीं है एक अपरिवर्तनीय स्टेटलेस सिंगलटन एक स्थिर वर्ग नहीं कर सकता है।

जटिलता के अतिरिक्त स्तर को जोड़ने का कोई कारण नहीं है कि -> इंस्टेंस () बनाता है, जबकि एक स्थैतिक विधि को सादा कॉल संसाधनों के मामले में अधिक रूढ़िवादी, अधिक रूढ़िवादी और अधिक स्पष्ट होगा।

ऐसा नहीं है कि वे गलत हैं। यह है कि इसे करने का एक बेहतर तरीका है। ऐसे परिदृश्य हैं जहां सामान्य ("स्टेटफुल") सिंगलेट्स जाने का सही तरीका है। सिंगलटन के साथ बुराई यह है कि उन्हें अक्सर दुर्व्यवहार किया जाता है, वैश्विक चर के समान बुरे परिणाम के साथ, लेकिन ऐसे विशिष्ट मामले हैं जहां सिंगलटन का उपयोग करना सही है। स्टेटलेस के लिए ऐसे मामले नहीं हैं।


मुझे यकीन है कि आप कुछ मामलों का निर्माण कर सकते हैं जहां एक सिंगलटन के कुछ फायदे हैं। परिदृश्य और प्रोग्रामिंग भाषा के आधार पर संभवतः (जैसे आलसी लोडिंग का लाभ उठाते हुए)।
स्टैम्पडेक्स वीवी

1
@StampedeXV: हां, एक स्टेटफुल सिंगलटन निश्चित रूप से। एक स्टेटलेस और अपरिवर्तनीय - मैं वास्तव में किसी भी उदाहरण को सुनने के लिए उत्सुक हूं लेकिन मैं अपनी सांस नहीं रोक रहा हूं।
एसएफ।

ठीक है, आपके पास एक बिंदु है। मैंने आपके उत्तर को थोड़ा सामान्य किया। अपरिवर्तनीय स्टेटलेस के लिए मुझे कोई फायदा नहीं दिखता है।
स्टैम्पडेक्स वीवी

1
उन कक्षाओं के साथ जिनमें केवल स्थैतिक कार्य होते हैं, आप इनहेरिटेंस / बहुरूपता का उपयोग नहीं कर सकते हैं जो कि एक बड़ी सीमा है ...
m3th0dman

1
कुछ भी नहीं है एक अपरिवर्तनीय स्टेटलेस सिंगलटन एक स्थिर वर्ग नहीं कर सकता है। ठीक है, स्थैतिक तरीके एक इंटरफ़ेस को लागू नहीं कर सकते हैं, जो एक सिंगलटन
एम

3

सिंगलटन के साथ मुख्य समस्या यह है कि यह क्रॉस-कटिंग चिंताओं के परिदृश्य में उपयोग किए जाने पर निर्भरता और युग्मन को छुपाता है। देखें सिंग्लेटन्स पैथोलॉजिकल लियर्स हैं या आगे पढ़ने के लिए सिंगलनेट ईविल क्यों हैं

दूसरी तरफ, एक राज्य कम सिंगलटन, अगर दुरुपयोग नहीं किया जाता है, तो सहायक हो सकता है और प्रदर्शन में सुधार कर सकता है। एक उदाहरण पर विचार करें:

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();
    }
}

अंत में, मेरा मानना ​​है कि ऐसे स्थान हैं (जैसा कि डिफॉल्ट के रूप में दर्शाया गया है) जहाँ सिंग्लेटन्स उपयोगी हैं। सिंगलटन की मुख्य परिभाषा में कहा गया है कि यह एक वर्ग के एक से अधिक उदाहरण बनाने के लिए अस्वीकृत है । यह परमाणु शक्ति के रूप में है। एक ऊर्जा या एक बम का उत्पादन कर सकते हैं। यह मानव पर निर्भर करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.