2013-08-23 5 views
5

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

संपादित करें: मेरा मतलब यह नहीं है कि सिंगलेट्स खराब हैं, मेरा मतलब सिर्फ इस मामले में है। ऐप में अनिवार्य रूप से प्रत्येक महत्वपूर्ण चर इस उदाहरण में संग्रहीत किया जाता है।

+1

एक पैटर्न सिर्फ एक पैटर्न है ... वास्तव में बुरा क्या है कुछ अंधेरे से कहना बुरा है क्योंकि आपको लगता है कि यह है ... सिंगलेट्स खराब नहीं हैं, लेकिन आप निश्चित रूप से खराब सिंगलेट का उपयोग/निर्माण कर सकते हैं ... यह निर्भर करता है कि आप उन्हें कैसे डिजाइन/उपयोग करते हैं ... – Macmade

+0

सिंगलटन यह एक पैटर्न है ... उचित रूप से इसका उपयोग न करें और मुझे गंध है कि किसी को लगता है कि सिंगलटन का उपयोग कर रहे हैं जब वास्तव में यह सिंगलटन नहीं है –

+0

धन्यवाद @ जोश कैसवेल, मैंने पहले देखा था , लेकिन मैंने अपने सभी बिंदुओं का काफी पालन नहीं किया। पुनरावृत्ति के लिए खेद है! – Febble

उत्तर

3

UIKit में बहुत सारी ऑब्जेक्ट सिंगलेट हैं। यूआईएप्लिकेशन ऑब्जेक्ट एक सिंगलटन है। NSUserDefaults में standardUserDefaults सिंगलटन है। UIDevice currentDevice एक सिंगलटन देता है।

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

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

+0

तो यदि वे सभी इसका उपयोग चर के लिए कर रहे हैं, तो कोई नुकसान नहीं है? – Febble

+0

मैं कहूंगा कि यदि आप व्यू कंट्रोलर कोड के भीतर उन ऑब्जेक्ट्स को असाइन करने के बजाय व्यू कंट्रोलर कोड के भीतर अपने सिंगलटन की ऑब्जेक्ट्स को सीधे एक्सेस और संशोधित कर रहे हैं, तो यह खराब है। यानी '-viewDidLoad {[[[सिंगलटन साझा] सरणी] addObject: newObject]; } 'खराब होगा, बनाम आपके व्यू कंट्रोलर में सरणी के लिए एक संपत्ति सेट कर रहा है और इसे वहां संशोधित करेगा। – Justin

0

Globals.m वास्तव में एक सिंगलटन की तरह नहीं लगता है, और यदि ऐसा है, ऐसा लगता है कि यह अभी कॉन्फ़िगरेशन उद्देश्यों के लिए उपयोग किया जाता है? फिर #defines या extern से भरा फ़ाइल वही करेगी, मुझे लगता है। किसी और विवरण के बिना यह जानना मुश्किल है कि आप क्या खोज रहे हैं।

+0

इसे सिंगलटन के रूप में स्थापित किया गया है और स्पष्ट रूप से एक टिप्पणी है जो इसे सिंगलटन के रूप में संदर्भित करती है। और यह किसी भी चर को संग्रहीत करने के लिए सक्रिय रूप से उपयोग किया जा रहा है जिसे कॉन्फ़िगरेशन के लिए न केवल अन्य कक्षाओं तक पहुंचाना है। यूआई के अलावा, वास्तव में एक दूसरे का संदर्भ नहीं है। सब कुछ NSNotificationCenter और इस ग्लोबल्स उदाहरण के माध्यम से किया जाता है। यह बहुत संभव है कि मैं सिर्फ इस निष्कर्ष पर पहुंचा कि यह बुरा अभ्यास है, जैसा कि मैंने कहा, मैं बहुत अनुभवी नहीं हूं। – Febble

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

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