2010-03-31 13 views
46

यह स्वीकार्य रूप से एक ढीला सवाल है। सिंगलेट्स की मेरी वर्तमान समझ यह है कि वे एक वर्ग हैं जिन्हें आपने इस तरह से स्थापित किया है कि केवल एक उदाहरण बनाया गया है।प्रोग्रामिंग में सिंगलेट्स का उद्देश्य

यह मेरे लिए एक स्थिर वर्ग की तरह लगता है। मुख्य अंतर यह है कि एक स्थिर वर्ग के साथ आप इसे उदाहरण नहीं दे सकते/नहीं कर सकते हैं, आप इसे Math.pi() जैसे उपयोग करते हैं। एक सिंगलटन वर्ग के साथ, आप अभी भी तरह

singleton mySingleton = new singleton(); 
mysingleton.set_name("foo"); 
singleton otherSingleton = new singleton(); 
// correct me if i am wrong, but mysingleton == othersingleton right now, yes? 
// this the following should happen? 
otherSingleston.set_name("bar"); 
mysingleton.report_name(); // will output "bar" won't it? 

कृपया ध्यान दें, मैं इस भाषा को स्वतंत्र रूप से पूछ रहा हूँ, अवधारणा के बारे में अधिक कुछ करने की आवश्यकता होगी। तो मैं वास्तव में इस तरह के वर्ग को कोड करने के बारे में चिंतित नहीं हूं, लेकिन अधिक क्यों आप नहीं करेंगे और आपको किस चीज पर विचार करने की आवश्यकता होगी।

+1

मैं बहुत से लोगों ने कहा है कि सिंगलटन मूल रूप से वैश्विक चर प्राप्त करने का एक तरीका है, और यह 'बुरा' है। लेकिन निश्चित रूप से ऐसे समय होते हैं जब वैश्विक चर उपयोगी होते हैं? यह कैसे है कि सिंगलेट्स के वैश्विक चर ' – thecoshman

उत्तर

49

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

हालांकि, व्यावहारिक रूप से सिंगलेट्स का मुख्य उद्देश्य वैश्विक चर होने के बारे में लोगों को कम बुरा महसूस करना है।

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

+38

* एलओएल * +1 "सिंगलेट्स ओओ पर वैश्विक चर के लिए राजनीतिक सही नाम हैं" ;-) –

+0

तो एक 'उचित' गठित सिंगलटन एक सामान्य वर्ग के बीच आधा रास्ता घर है जिसे आप कई बार उदाहरण सकते हैं आप जितने धागे और एक स्थैतिक वर्ग में चाहते हैं जो केवल बेहतर शब्द की इच्छा के लिए हो, एक बार ... आपके सभी धागे में? कभी भी बहु थ्रेडेड अनुप्रयोगों के साथ निपटाया नहीं। तो एक ही राज्य में स्थिर वर्ग मौजूद हैं, यहां तक ​​कि कई धागे से भी अधिक? – thecoshman

+0

@thecoshman: "प्रति थ्रेड" चीज सिर्फ एक उदाहरण थी, यह एक अलग मानदंड भी हो सकता है जैसे "हर 100 वें कॉलर को एक नया उदाहरण मिल जाता है"। लेकिन हाँ, एक स्थिर वर्ग सभी थ्रेडों पर समान होगा, अगर आपका पर्यावरण साझा-स्मृति बहुप्रवाह करता है। –

-1

सभी भाषाओं में "स्थिर वर्ग" नहीं हैं (उदाहरण के लिए सी ++ में उनके पास नहीं है)।

फिर से सी ++ उदाहरण के साथ, कक्षा में स्थैतिक चर जोड़ना एक दर्द है क्योंकि आपको उन्हें शीर्षलेख और .cpp फ़ाइल दोनों में रखना होगा, इसलिए उस मामले में एक सिंगलटन बहुत उपयोगी है।

प्रत्येक भाषा अलग है। मुझे लगता है कि सी # में वे बहुत उपयोगी नहीं हैं (और वास्तव में, जो मुझे पता है, वे अक्सर उपयोग नहीं किए जाते हैं)

+1

सी ++ स्थिर सदस्य कार्यों की अनुमति देता है, और इसलिए स्थैतिक वर्गों का समर्थन करता है (जो मोटे तौर पर बोलते हैं, केवल स्थिर सदस्य कार्यों के साथ कक्षाओं से ज्यादा कुछ नहीं)। –

+0

थोड़ी देर के बाद से मैंने सी ++ के साथ इस तरह से खेला। स्थिर नहीं था इतना स्थिर 'सीमित' था। क्या आपके पास गणित कक्षाओं जैसी चीजें नहीं हैं जो आपके लिए पहले से ही उपयोग कर रही हैं? या वे पहले से ही पुस्तकालयों में शुरू कर रहे हैं? – thecoshman

+0

@ मार्सेलो: 'स्थिर वर्ग' से मेरा मतलब सी # में स्थिर कीवर्ड जैसा था। –

2

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

उदाहरण के लिए, आप एक केंद्रीय लॉगिंग सेवा घोषित करना चाहेंगे, लेकिन केवल रनटाइम पर निर्णय लें कि फ़ाइल लॉगर, स्टब लॉगर, डेटाबेस लॉगर, या संदेश-कतार लॉगर में हुक करना है या नहीं।

+0

क्या करें आप सिंगलटन सेवा से मतलब है? एक है जिसमें केवल एक उदाहरण है? – thecoshman

-1
  1. सिंगलटन वैश्विक चर का एक बहुत ही उपयोगी प्रतिस्थापन है, जो पूरे कोड में उपयोग किया जाता है।
  2. Singletons आमतौर पर नहीं 'नई' एड या "हटाएँ" कर रहे हैं घ, वे पहले उपयोग पर प्रारंभ और कार्यक्रम गुंजाइश
  3. Singletons पूरी तरह से प्रवेश, विन्यास और अन्य हार्डवेयर-इंटरफ़ेस कक्षाएं लपेटकर मेल के साथ हटा दिए हो जाते हैं ।
+0

सिंगलटन वैश्विक चर के लिए एक अच्छा प्रतिस्थापन नहीं हैं। गलत तरीके से उपयोग किया जाता है, उनके पास ग्लोबल वेरिएबल्स का हर नुकसान होता है, और अच्छे उपाय के लिए कुछ अतिरिक्त एक्स्ट्रा। ग्लोबल्स पर सिंगलेट्स का एकमात्र लाभ यह है कि जो लोग बेहतर नहीं जानते हैं वे खुद के बारे में अच्छा महसूस करते हैं क्योंकि वैश्विक का उपयोग करने के बजाय (जो उन्हें पता है कि बुरा है, भले ही वे नहीं जानते कि क्यों नहीं), उन्होंने एक डिज़ाइन का उपयोग किया है पैटर्न, जो एक अच्छी चीज है (भले ही उन्हें ग्लोबल्स की हर समस्या हो रही हो)। – kyoryu

+0

@kyoryu: एक विज्ञापन होमिनम हमला एक अच्छा तर्क नहीं है। यह बल्कि अच्छे तर्कों की कमी का सुझाव देता है। –

+0

@Elise: यह विज्ञापन होमिनम नहीं है। ग्लोबल्स कई कारणों से खराब हैं - निर्भरताओं के लिए स्थिर संबंध, साझा परिवर्तनीय स्थिति, और आवेदन का जीवनकाल (अच्छी बात नहीं)। सिंगलेट्स उन सभी पहलुओं को साझा करते हैं। सिंगलटन, अच्छी तरह से इस्तेमाल किया जाता है, या तो एक हैं) अपरिवर्तनीय या बी) एक इंटरफ़ेस लागू करें और निर्भरता इंजेक्शन के माध्यम से पारित किया। इस फैशन में सिंगलेटन का आमतौर पर उपयोग नहीं किया जाता है, वे वैश्विक चर के प्रतिस्थापन के रूप में अक्सर उपयोग किए जाते हैं, वास्तव में ग्लोबल्स की मौलिक समस्याओं को हल किए बिना। – kyoryu

12

तुम क्यों

के लिए wan't हैं मुझे नहीं क्योंकि एकमात्र आमतौर पर बहुत बुरा तरीका है अपनी समस्याओं को हल करने के लिए कर रहे हैं।आपकी सिफारिश आपको पूरी तरह से टालना है।

मुख्य कारण हैं:

  • Singletons ज्यादातर वैश्विक राज्य का प्रतिनिधित्व करते हैं (जो बुराई है)।
  • सही निर्भरता इंजेक्शन असंभव हो जाता है।

मेरा सुझाव है कि आप इस गूगल कर्मचारी के ब्लॉग में (पूरी तरह से स्पष्टीकरण सहित) बाकी पढ़ें:

+4

पांच साल पहले मैंने एक नीति लागू की जो कहती है: "कभी भी सिंगलेट का उपयोग न करें। अगर आपको यकीन है कि आपको अपने नेतृत्व को समझाने की ज़रूरत है!"। को पांच साल में दो बार चुनौती दी गई। अंतिम परिणाम हमेशा एक जैसा था: गैर सिंगलटन समाधान बेहतर था। – Andreas

2
अन्य लोगों की तरह

है ने कहा:

  • सिंगलेट्स किसी अन्य नाम से वैश्विक चर हैं।
  • सिंगलेट्स आमतौर पर एक बुरा विचार है।
  • सिंगलेट्स को "मोनोस्टेट" कक्षाओं द्वारा प्रतिस्थापित किया जा सकता है - कक्षाएं जो स्पष्ट रूप से सामान्य निर्माण/विनाश अर्थशास्त्र है लेकिन सभी एक ही राज्य साझा करते हैं।

ध्यान दें कि मेरी राय में "स्थैतिक कक्षाओं" आम तौर पर कर रहे हैं भी एक बुरा विचार, एक भाषा है कि नि: शुल्क काम करता है, या पारित करने के लिए इच्छुक के बिना काम करता है के एक समूह के बीच राज्य को बांटने के लिए अनुमति नहीं है के लिए एक hackish वैकल्पिक हल वह पैरामीटर के रूप में राज्य।

मेरे अनुभव में लगभग सभी डिज़ाइन सिंगलटन या स्थैतिक वर्गों के साथ कुछ रचनाओं में से बेहतर होकर, आसानी से समझा जा सकता है और अधिक लचीला हो सकता है।

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

मुझे पता है कि अधिकांश भाषाओं में, अधिकांश सिंगलटन कक्षाओं को उस वर्ग के स्थिर सदस्य कार्य के माध्यम से उपयोग किया जाता है। एकल उदाहरण उन सभी कोडों के लिए उपलब्ध है जिनके पास सिंगलटन वर्ग की परिभाषा तक पहुंच है। यह एक वैश्विक चर है - कक्षा में शामिल सभी कोड आपके सिंगलटन के एक उदाहरण में संशोधन कर सकते हैं।
यदि आप स्थैतिक सदस्य फ़ंक्शन (या कुछ स्थैतिक फैक्ट्री विधि का उपयोग नहीं करते हैं) का उपयोग नहीं करते हैं, लेकिन इसके बजाय सिंगलटन ऑब्जेक्ट को उन सभी ग्राहकों को पास करें जिन्हें इसकी आवश्यकता है, तो आपको सिंगलटन पैटर्न की आवश्यकता नहीं होगी, बस पास करें सभी ग्राहकों के लिए एक ही वस्तु।

+0

मैं देख सकता हूं कि आपके पास क्या मतलब है यदि आपके पास ऐसी कक्षा है जो केवल कुछ फ़ंक्शंस प्रदान करती है। मैं 'मुक्त फ़ंक्शंस' मानता हूं जिसका मतलब है कि एक फ़ंक्शन ने कहीं भी कहीं भी उपयोग के लिए घोषित किया है। लेकिन एक वर्ग है जो एक स्थिर चर कहता है कि सभी उदाहरणों का उपयोग कर सकते हैं, उदाहरण के काउंटर के रूप में काम करने के लिए भाग/डी-स्ट्रक्चर के रूप में/डी-क्रिएटर के रूप में कहें, विशेष रूप से जब एक स्थिर कार्य के साथ मिलकर 'साफ' हो सकता है वैरिएबल कहें, इस प्रकार आपको बताएंगे कि क्या आपके पास कुछ उदाहरण है। आप इसे पॉइंटर्स को उदाहरणों में वापस लाने के लिए भी विस्तारित कर सकते हैं, कक्षा को ट्रैक करें कि कौन से उदाहरण मौजूद हैं – thecoshman

+1

कोई कक्षा जिसमें कोई गैर स्थैतिक कार्यक्षमता शामिल है वह एक स्थिर वर्ग नहीं है - यह स्थिर सदस्यों के साथ एक वर्ग है। यह अक्सर जटिल परियोजनाओं में चिंता का कारण भी है, लेकिन केवल स्थिर डेटा और सदस्य कार्यों वाले वर्ग के रूप में स्पष्ट रूप से हैकिश नहीं है। –

+0

आप क्यों कहते हैं कि केवल स्थिर डेटा और कार्य वाले वर्ग 'हैकिश' है। निश्चित रूप से, इस उदाहरण के साथ एक मृत घोड़े को फेंकना, आपके पास गणित की सहायता कक्षा है, आपको केवल कार्य ही चाहिए। और सी # जैसी भाषाएं आपके पास केवल चारों ओर तैरने वाले फ़ंक्शंस नहीं हो सकती हैं, उन्हें कक्षा में होने की आवश्यकता होती है, जब तक कि आप उन्हें अपनी मुख्य कक्षा में चिपके न हों, लेकिन फिर आप आसानी से कोड का पुन: उपयोग नहीं कर सकते। – thecoshman

0

अन्य उत्तरों के अलावा मुझे यह कहना होगा कि जब आप एक स्थिर वर्ग चाहते हैं तो सिंगलेट्स आपकी मदद कर सकते हैं, लेकिन यह नहीं हो सकता है, क्योंकि आपके आवेदन के डिज़ाइन के कारण यह एक तत्काल वर्ग विरासत में होगा ।

2

थोड़ा ज्ञान एक खतरनाक चीज है और सिंगलेट्स खतरनाक संस्थाएं हैं। ऊपर लिखित चीजों के अतिरिक्त, मैं सिंगलटन वस्तुओं के जीवन-समय प्रबंधन पर भी जोर दे सकता हूं। एसीई ढांचे में, इसे सफलतापूर्वक संभाला जाता है। आप यहां पेपर पा सकते हैं: http://www.cs.wustl.edu/~schmidt/PDF/ObjMan.pdf

कृपया यह भी ध्यान दें कि सिंगलेट्स गैर-प्रतिलिपि योग्य कक्षाएं होनी चाहिए।यह पैटर्न सबसे आसान प्रतीत हो सकता है, लेकिन इसके विपरीत, यह मुश्किल में से एक है। इसलिए, मैं सिंगलेट्स में इस बुरे बिंदुओं के बारे में उम्मीदवारों से पूछता हूं।

0

सिंगलेट का उपयोग करने के दो तरीके हैं।

  1. जिस तरह से उनका उपयोग किया जाना चाहिए। आम तौर पर अपरिवर्तनीय चर के साथ (सी # की स्ट्रिंग। लक्षण, स्मॉलटाक में कक्षाएं, आदि)। यह सिंगलटन उपयोग का लगभग 1% है।
  2. वैश्विक चर के प्रतिस्थापन के रूप में। ये गलत है। इसका मूल कारण यह है कि बिल्डर का सही तरीके से उपयोग करने के तरीके को समझने के बिना सामान्य वस्तुओं को साझा करना चाहते हैं। इस फैशन में सिंगलेट्स का उपयोग आमतौर पर ऑब्जेक्ट उन्मुख डिजाइन की गहरी समझ की कमी का संकेत है।
संबंधित मुद्दे