2009-09-19 22 views
20

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

+0

[यहां] (https://www.michaelsafyan.com/tech/design/patterns/singleton) सिंगलटन पर एक विरोधी पैटर्न होने पर एक अच्छा पठन है। – RBT

उत्तर

35

सिंगलटन आम तौर पर एक बुरा विचार है यदि आप यूनिट परीक्षण कर रहे हैं, और आमतौर पर यह एक बुरा विचार है कि यूनिट परीक्षण (या बीडीडी या स्वीकार्य परीक्षण) नहीं करना है।

वस्तुओं को वैश्विक स्थिति बनाने का मतलब है कि इन वस्तुओं को शामिल करने वाले यूनिट परीक्षणों को अलग-अलग किया जाएगा और एक दूसरे से अलग हो जाएगा। इसके बजाय, आपको प्रत्येक परीक्षा के लिए राज्य को रीसेट करने और मुझे विश्वास करने की चिंता करनी होगी ... यह कभी भी 100% समय नहीं किया जाता है। यदि आप वैश्विक स्थिति को रीसेट नहीं करते हैं तो आप समय बर्बाद करने वाले परीक्षणों में त्रुटियों को डीबग करने के लिए बहुत अजीब और कठिन हो जाते हैं।

वैश्विक राज्य भी आपके कोड में युग्मन बढ़ाता है और इसे प्रतिक्रिया देने में बहुत मुश्किल बनाता है।

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

यह सब आपकी समस्या के आकार पर निर्भर करता है। यदि आप कुछ कोशिश करने के लिए एक 4-कक्षा परीक्षण रिग को एक साथ हैक कर रहे हैं तो आगे बढ़ें और सिंगलटन का उपयोग करें। हालांकि, जैसे ही वह परियोजना जीवन पर ले जाती है और बड़े और अधिक जटिल हो जाती है तो सिंगलटन को दोबारा प्रतिक्रिया दें।

+0

तो क्या आपका मतलब है कि सिंगलटन वास्तविक परियोजनाओं में उपयोग के लिए * कभी * योग्य नहीं हैं (और वास्तविक परियोजना में सिंगलटन को स्वचालित रूप से उपयोग मामले के बावजूद कोड गंध के बराबर समझा जाता है)? – Pacerier

+0

मैं एक ट्रोल गंध ... –

+0

तब खुद को गंध से बचना चाहिए। आपके उत्तर से पता चलता है कि सिंगलटन का उपयोग केवल "प्रारंभिक चरण" कोड के लिए किया जाता है और सभी परिपक्व परियोजनाओं में फैक्टर किया जाना चाहिए जो बड़ा हो जाता है। तो क्या आपका मतलब है कि सिंगलटन इन परियोजनाओं में कभी भी उपयोग के लिए योग्य नहीं हैं, या क्या वैध उपयोग के मामले हैं? – Pacerier

3

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

7

अन्य पदों में उल्लिखित परीक्षण और डिजाइन मुद्दों के अलावा, सिंगलेट्स और क्लासलोडर्स के साथ समस्याएं हैं। सिंगलेट्स वास्तव में जेवीएम या एप्लिकेशन प्रति "सिंगल" नहीं हैं - वे स्थिर संपत्ति के माध्यम से इसे पूरा करते हैं, जिसका वास्तव में मतलब है कि प्रति वर्ग एक है। यदि कई क्लासलोडर हैं - जैसे अधिकांश ऐप सर्वर - प्रत्येक अलग एप्लिकेशन को एक नया क्लासलोडर मिलता है, यहां तक ​​कि ईजेबी में क्लासलोडर के कई स्तर भी उपयोग किए जाते हैं। एक सिंगलटन इंस्टेंस प्रति क्लासलोडर लोड हो जाता है - जो कि आप सिंगलटन के साथ क्या कर रहे हैं उसके आधार पर, आपके द्वारा अपेक्षित परिणामों का उत्पादन नहीं कर सकता है।

+1

@Nate, यह दिलचस्प लगता है, क्या आप मुझे एक ठोस उदाहरण दे सकते हैं? – eric2323223

+0

क्या आपके दावे के लिए आधिकारिक स्रोत हैं? जेआरई के उदाहरण अलग-अलग उदाहरणों का उपयोग क्यों नहीं करेंगे? – Pacerier

+0

@Pacerier http://www.oracle.com/technetwork/articles/java/singleton-1577166.html अलग सिंगलटन उदाहरणों का उपयोग कर अलग जेआरई अपेक्षित मामले है - समस्या एक एकल जेआरई में एकाधिक क्लासलोडर हो सकते हैं और इस प्रकार एकाधिक सिंगलटन उदाहरण । – Nate

18

Google टेक वार्ता कुछ समय पहले Global State and Singletons के बारे में अच्छी प्रस्तुति थी। स्थैतिक सिंगलटन पैटर्न बुरा है, क्योंकि अवांछित साइड इफेक्ट्स का कारण बनता है और कोड को अवांछित बनाता है। स्टेटिक सिंगलटन वैश्विक चर के ओओ संस्करण है।

समाधान पर है बस ऑब्जेक्ट का एक उदाहरण बनाएं और इसे निर्भरता इंजेक्शन के माध्यम से अपने उपयोगकर्ताओं को पास करें। डी फ्रेमवर्क, जैसे Guice, अच्छे प्रकार के सिंगलेट्स को परिभाषित करना आसान बनाएं (गिस में बस @ सिंगलेटन के साथ एक कक्षा को एनोटेट करें)। Don't Look For Things! नामक एक समान टेक टॉक था जिसने डीआई पर चर्चा की।

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