2009-07-29 12 views
5

सावधान एकमात्र के बारे में तथ्यों को पढ़ने (कोड गंध, पैटर्न नहीं) के बाद मुझे आश्चर्य है:मैं अभ्यास में खराब सिंगलेट्स से कैसे बच/प्रतिक्रिया कर सकता हूं?

मैं अपने कोड कैसे refactor कर सकते हैं उनमें से छुटकारा पाने के लिए?

लगभग हर कोई इस बात से सहमत है कि बुरे सिंगलेट्स अच्छी तरह से बुरे हैं, मुझे उन्हें बदलने के तरीके पर कोई व्यावहारिक सलाह नहीं मिली। या तो यह बहुत छोटा या बहुत मुश्किल है।

कुछ तरीके हैं जिनके बारे में मैं सोच सकता हूं लेकिन यह सब मेरे कोड को बहुत ही खराब कर रहा है।

उदाहरण के लिए मान लीजिए कि मैं एक "वैश्विक" AppConfig वर्ग जो उत्पाद और सुविधाओं उपयोगकर्ता के लिए उपलब्ध का वर्णन के बारे में लाइसेंस जानकारी रखता डालते हैं।

मैं क्या सोच सकते हैं की:

  • प्रत्येक के लिए एक आम आधार वर्ग और अपनी परियोजनाओं के हर वर्ग है जो एक AppConfig उदाहरण रखती है बनाएँ। (बीएडी: उन मामलों के लिए असंभव जहां आपके पास पहले से ही बेस क्लास है, उदाहरण के लिए फॉर्म)
  • setAppConfig विधि के साथ एक सामान्य इंटरफ़ेस बनाएं।
  • एक वैश्विक AppConfigFactory जो AppConfig उदाहरण बना सकते हैं बनाएँ (BAD: केवल एक और वर्ग के लिए समस्या बदलाव)
  • हर विधि है जो इसकी आवश्यकता को पैरामीटर के रूप में उदाहरण के पास। (खराब: कोड ब्लोट)
  • ...

मैं क्या कर सकता है?

संपादित करें: स्पष्टीकरण: मैंने अपने कोड में एक खराब सिंगलटन की पहचान की है। अब मैं इसे हटाने के लिए अपने कोड को दोबारा बनाना चाहता हूं। मैं सुझावों और सामान्य विचारों के बारे में पूछ रहा हूं कि इसे कैसे प्राप्त किया जाए।

+0

http://stackoverflow.com/questions/86582/singleton-how-should-it-be-used – Justicle

+1

की एक डुप्ली की तरह दिखता है यह कम से कम आपके द्वारा छोड़े गए प्रश्न का डुप्लिकेट नहीं है। मैं एक सिंगलटन के सही उपयोग या पेशेवरों और विपक्ष को नहीं जानना चाहता हूं। मेरे पास एक खराब सिंगलटन है जिसे मैं निकालना चाहता हूं और मैं ऐसा करने का सबसे अच्छा तरीका जानना चाहता हूं। –

+0

http://misko.hevery.com/2008/08/21/where-have-all-the-singletons-gone/ –

उत्तर

6

नियंत्रण ढांचे का निर्भरता इंजेक्शन और उलटा उपयोग करें - इसके लिए महत्वपूर्ण रिफैक्टरिंग की आवश्यकता हो सकती है। फिर, कन्स्ट्रक्टर या प्रॉपर्टी निर्भरता का उपयोग करके, "सिंगलटन" के लिए पूछें - आदर्श रूप से, आप पूरी चीज़ के लिए नहीं पूछते हैं, जैसे डेमेटर के सिद्धांत के अनुसार, इसे केवल उस चीज के लिए पूछना चाहिए जिसकी वास्तव में आवश्यकता है (आपके मामले में लाइसेंस जानकारी)।

मैं सिंगलटन (एंटीपेटर्न ग्लोबल वेरिएबलिंग एंटीपेटर्न) और सिंगलटन (जिसका मतलब है कि आपको केवल एक की आवश्यकता है) के बीच अंतर करने की कोशिश करें। एक सच्चे सिंगलटन प्रोग्राम (या आपके कारखाने में) की शुरुआत में एक बार बनाया जाता है और उन वस्तुओं को पारित किया जाता है जिन्हें इसकी आवश्यकता होती है।

+0

आप सिर्फ सिंगलटन डिज़ाइन पैटर्न को नहीं समझते हैं, आपको हमेशा डिज़ाइन पैटर्न का उपयोग करना चाहिए !! – IAdapter

+1

मैं वास्तव में नहीं बता सकता। क्या आप व्यंग्यात्मक हो रहे हैं? –

+0

क्या आप इन ढांचे के लिए कुछ उदाहरण दे सकते हैं? कुछ कीवर्ड मैं गूगल के लिए गूगल कर सकते हैं? –

0

कक्षा बनाने के बारे में केवल स्थिर सदस्य हैं? की तरह, के बजाय इस (सी # कोड):

class AppConfig 
{ 
    public static readonly AppConfig Instance; 

    private AppConfig() { } 
    static AppConfig() 
    { 
     Instance = new AppConfig(); 
    } 

    public string SomeConfigParam { get; set; } 
} 

यह करें:

static class AppConfig 
{ 
    public static string SomeConfigParam { get; set; } 
} 

Singletons केवल मतलब अगर आप के आसपास उदाहरण पारित करने के लिए की जरूरत है - कार्य या एक संग्रह में मूल्यों के लिए मानकों की तरह। .NET में System.DBNull एक सिंगलटन का एक अच्छा उदाहरण है। यदि यह केवल डेटा की वैश्विक संग्रह है कि हर किसी को पहुंचने में सक्षम होना चाहिए, स्थिर वर्ग आपके कोड को छोटा और सरल बनाते हैं।

+0

ध्यान रखें कि स्थिर वर्ग आपके कोड को कठिन बना सकते हैं परीक्षा। यद्यपि यह एक साधारण डेटा स्टोर है जो यहां मामला नहीं है। –

+0

क्या यह अभी भी एक सिंगलटन नहीं होगा? –

+2

नहीं, यह एक अच्छा नेमस्पेस उपसर्ग के अलावा, वैश्विक चर की तरह है। इसका सामना करें - हर कार्यक्रम में कुछ वैश्विक चर होंगे। सेटिंग्स और डेटा जिन्हें प्रोग्राम-व्यापी तक पहुंचाया जाना चाहिए। स्टेटिक क्लास/क्लास के सदस्य ओओपी तरीके से उनको समाहित करने का सबसे अच्छा तरीका हैं। –

3

आप कहते हैं कि

एक वैश्विक AppConfigFactory जो AppConfig उदाहरण बना सकते हैं बनाएँ (BAD: केवल एक और वर्ग के लिए समस्या बदलाव)

मेरी नजर में यह वास्तव में बिल्कुल भी बुरा नहीं है। ग्राहक का विचार यह है कि वह उस कॉन्फ़िगरेशन के लिए फैक्ट्री ऑब्जेक्ट से पूछता है जिसका उपयोग करना चाहिए। वह नहीं जानता है कि यह एक सिंगलटन है! एक स्ट्रोक पर सिंगलटन-नेस फैक्ट्री में encapsulted है। [व्यावहारिक रूप से फैक्टरी अच्छी तरह से सिंगलटन के रूप में समाप्त हो सकती है, लेकिन सबकुछ बूटस्ट्रैप करना है, है ना?]

अब क्या आप निर्भरता इंजेक्शन तकनीकों का उपयोग करके फैक्टरी एक्सेस को लपेटते हैं, यह एक परिष्करण है, मूलभूत यह है कि केवल एक वस्तु है इन AppConfig वस्तुओं के निर्माण की देखभाल करते हुए, केवल कारखाना जानता है कि एक या कई हैं।

और यह मुझे एक और पालतू सिद्धांत के रूप में ले जाता है ... 1 जैसी कोई संख्या नहीं है, जब आप शुरू करते हैं तो यह सिंगलटन की तरह दिखता है, तो उलझन बढ़ता है, और आपको एक परिदृश्य मिल जाता है जहां आपके ऐप का कुछ हिस्सा (के लिए उदाहरण) एक कॉन्फ़िगर का उपयोग करता है और दूसरा भाग एक अलग उपयोग करता है (उदाहरण के लिए संस्करणों के बीच गतिशील संक्रमण में)। कारखाना उस जटिलता को छुपा सकता है।

0

या तो AppConfigsetAppConfig() विधि या कन्स्ट्रक्टर के माध्यम से पास करें, यदि ऑब्जेक्ट को पूरे जीवनकाल में ऐप-कॉन्फ़िगर की आवश्यकता है। यदि वैश्विक AppConfig के बीच संबंध और ऑब्जेक्ट सशर्त है (यानी, यह केवल कुछ तरीकों से आवश्यक है), फिर इसे अतिरिक्त तर्क के रूप में पास करें।

संबंधित मुद्दे