2012-01-03 10 views
5

मैं आमतौर पर उन ऐप्स को बनाता हूं जिन्हें डेटा संग्रहण की आवश्यकता होती है, और यह डेटा पूरे कार्यक्रम में उपयोग किया जाता है। हालांकि, यह अधिक नहीं है, इसलिए मैं आमतौर पर इस डेटा को लोड/सहेजने के लिए NSUserDefaults का उपयोग करता हूं। हालांकि, बचत/लोडिंग कोड, डेटा पैकिंग/अनपॅक करने के साथ-साथ अंतरिक्ष लेता है, और मैंने सोचा कि इस कोड को वैश्विक सिंगलटन के अंदर पुन: प्रयोज्य तरीकों पर ले जाना एक अच्छा विचार होगा। ऐसा लगता है कि यह अच्छी तरह से काम किया है।डेटा प्रबंधक वर्ग के रूप में एक सिंगलटन का उपयोग खराब है?

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

तो, अकेले इस तरह की बुरी तरह से सिंगलटन का उपयोग कर रहा है? यदि हां, तो बेहतर विकल्प क्या है?

+1

नहीं, बुरा नहीं, बिल्कुल बुरा नहीं। ध्यान रखें कि ऐप्पल द्वारा प्रदान की गई कई आईओएस एसडीके कक्षाएं सिंगलेट के रूप में लागू की जाती हैं। जो यह नहीं कहना है कि ऐप्पल कोड स्वचालित रूप से अच्छा कोड है, लेकिन यह दृढ़ता से यह दर्शाता है कि सिंगलटन पैटर्न गुणों को रिडीम करने के बिना नहीं है। – aroth

उत्तर

3

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

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

मुझे एक उदाहरण के साथ व्याख्या करने की कोशिश करें - मैंने जो गेम लिखा है उससे कुछ कोड का उपयोग कर रहा हूं। मान लीजिए कि आपके पास GameMap वर्ग और Tile कक्षा है। GameMapTile ऑब्जेक्ट्स के 2 आयाम ग्रिड का प्रतिनिधित्व करता है।

GameMap *gameMap = [[GameMap alloc] init]; 
NSArray *theTiles = gameMap.tiles; 

GameMap के कहने टाइल्स के ग्रिड का मालिक है, और टाइल्स से उत्पन्न होने वाला खेल नक्शा बनाया जाता है। कोई सिंगलटन की जरूरत नहीं है।

आप कह सकते हैं "लेकिन मेरे पास एक समय में केवल GameMap है, बड़ा सौदा क्या है?"। सहेजे गए गेम लोड करने या नए स्तरों को लोड करने के बारे में क्या? खैर कि के रूप में आसान हो जाता है के रूप में:

// In whatever class object owns the game map 
self.gameMap = [[GameMap alloc] initWithSaveData:saveData]; 

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

+0

धन्यवाद, यह आमतौर पर चीजों पर भी मेरी राय है। मुझे बस पुष्टि करने के लिए थोड़ा सा जरूरी था कि सिंगलटन पैटर्न सभी बुरा नहीं था, क्योंकि मैंने उन सभी पठनों के बाद, यह थोड़ा सा लगता था जैसे वे किसी भी कीमत से बचने के लिए कुछ थे। –

+0

अच्छी तरह से मदद करने में खुशी हुई। मैंने अपना केस ऊपर बना दिया है। यह इस तरह की तरह है, अल्कोहल स्वास्थ्य के लिए माना जाता है लेकिन यह संयम में पीना ठीक है। इधर भी ऐसा ही है। –