दिलचस्प पोस्ट
ब्राउज़र पृष्ठ में चयनित पाठ के समन्वय क्या "असली संख्या" प्रकारों के लिए सी # सामान्य बाधा है? प्रक्रिया निकास कोड के आधार पर शेल स्क्रिप्ट से बाहर निकलें गतिशील रूप से h: कॉलम को हैशैप्स की सूची के आधार पर बनाएं एक प्रगति पट्टी के साथ एक फ़ाइल को एक HTTP फार्म के माध्यम से, MultipartEntityBuilder के माध्यम से अपलोड करें किसी स्क्रिप्ट को पुन: लोड करने और फिर से निष्पादित करने के लिए कैसे मजबूर किया जाए? जावा में एक मूल स्वैप फ़ंक्शन कैसे लिखें विंडोज में / dev / null? आप एचटीएमएल को सादा पाठ में कैसे परिवर्तित कर सकते हैं? अतिरिक्त गुणों को ढालने के साथ आटोकरिकमेंट वर्जनोडोड मैं जावा में स्ट्रिंग्स के एक ArrayList को कैसे सॉर्ट कर सकता हूं? नियमित अभिव्यक्तियाँ और एक पूरे वर्ण समूह को नकारना उनकी छवियों के साथ इमोटिकॉन की सूची बदलें सी # HttpWebRequest आदेश निर्देशिका लिस्टिंग पाने के लिए एंड्रॉइड एपीआई 1 (किटकैट) में अनुमति जारी रखने के लिए कैसे?

कोको / उद्देश्य-सी में वैश्विक चर?

मैक ओएस एक्स, 3 संस्करण के लिए कोको प्रोग्रामिंग के अनुसार , पृष्ठ 202 (अध्याय 13) पर:

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

यह वास्तव में सही सबसे अच्छा अभ्यास है? सार्वत्रिक चर? यह मेरे लिए पागल लगता है – मेरे द्वारा कभी भी सिखाया गया सब कुछ का मुकाबला करने के लिए।

बेहतर परिभाषा के साथ एक सरल सिंगलटन क्लास होना बेहतर होगा? या क्या यह वास्तव में वैश्विक स्तर पर जाने के लिए सही सर्वोत्तम अभ्यास है? क्या इससे कोई बेहतर पैटर्न है, बशर्ते कि बहुत से लोगों ने सोविलेटन को एक खूबसूरत पोशाक में ग्लोब बनाने का सोचा?

Solutions Collecting From Web of "कोको / उद्देश्य-सी में वैश्विक चर?"

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

ऐसा करने के बजाय:

[myArray setObject:theObject forKey:MyGlobalVariableKeyName]; 

आपको इसके साथ कुछ करना होगा:

 [myArray setObject:theObject forKey:[[MySingletonVariableClass getInstance] myVariableKeyName]; 

ग्लोबल वैरिएबल एक ही प्रभाव के लिए अनिवार्य रूप से कम टाइपिंग हैं

बस स्पष्ट होने के लिए, इन-लाइन स्ट्रिंग स्थिरांकों (कठिन परिष्करण और संकलन-समय की जांच) या #defines (कोई संकलन समय जाँच) के बजाय अपरिवर्तनीय वैश्विक चर बनाने की सिफारिश है यहाँ आप ऐसा कैसे कर सकते हैं …

MyConstants.h में:

 extern NSString * const MyStringConstant; 

MyConstants.m में:

 NSString * const MyStringConstant = @"MyString"; 

फिर किसी भी अन्य। एम फ़ाइल में:

 #import "MyConstants.h" ... [someObject someMethodTakingAString:MyStringConstant]; ... 

इस तरह, आप संकलन-समय की जाँच करते हैं कि आपने एक स्ट्रिंग निरंतर गलत वर्तनी नहीं की है, आप अपनी स्थिरांक की तुलना में स्ट्रिंग समानता [1] की बजाय पॉंकर समानता की जांच कर सकते हैं, और डीबगिंग आसान है, क्योंकि स्थिरांक एक रन टाइम स्ट्रिंग मान

[1] इस उपयोग में, आप मूलतः स्थिरांक के रूप में सूचक मूल्य का उपयोग कर रहे हैं ऐसा सिर्फ इतना होता है कि ये विशेष पूर्णांक उन स्ट्रिंग्स को भी इंगित करते हैं जो डीबगर में उपयोग किए जा सकते हैं

इसे वैश्विक वैरिएबल कहकर तकनीकी तौर पर सही है लेकिन भ्रामक

यह एक वैश्विक स्थिरता है – वैश्विक दायरे में है, लेकिन निरंतर है और इस प्रकार इसलिए नहीं बुरा है कि वैश्विक चर खराब हैं

वैश्विक स्थिरांक कैसे सामान्य, सुरक्षित और कई हैं, यह दिखाने के लिए कि वैश्विक स्थिरांक के इन उदाहरणों पर विचार करें:

  • आपके कार्यक्रम में हर वर्ग
  • हर # परिभाषित करें
  • हर एन्यूम
  • कोको द्वारा घोषित लगभग हर नाम ( NSApp जैसे दुर्लभ वैश्विक चर को छोड़कर)

केवल एक बार जब आप वैश्विक स्थिरांकों के बारे में चिंता करें, तब जब उनके नाम बहुत सामान्य होते हैं (वे वैश्विक नामस्थान प्रदूषित कर सकते हैं)। इसलिए उन नामों का उपयोग न करें जो कि किसी के साथ संघर्ष करने की संभावना रखते हैं (हमेशा एक उपसर्ग का उपयोग करें और हमेशा नाम कार्य-विशिष्ट NSKeyValueObservingOptionNew जैसे करें)।

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

याद रखें, ऐप्पल खुद ही तकनीक का उपयोग करता है। मैं परिभाषित होने की उम्मीद में से कई स्थिरांक वास्तव में स्थिरांक हैं अगर हेडर पहुंचने योग्य हैं लेकिन फ्रेमवर्क नहीं है तो आपको लिंक त्रुटियां मिलेंगी।

@ बेरी वर्क और @ मैट गैलाघर के उत्कृष्ट उत्तर, और मेरी प्रारंभिक प्रतिक्रिया (इस उत्तर का अंत देखें) पर निर्माण एक तीसरा दृष्टिकोण है, और यह एक मैक्रो का उपयोग करना है / संयोजन शामिल है जो सुनिश्चित करता है कि आप केवल एक बार चर नाम टाइप करें, और इसलिए इसे एक साथ .h और .m दोनों फाइलों में शामिल किया गया है।

<संपादित करें>

"हमेशा एक और तरीका है …"

अतिरिक्त हेडर फाइल को शामिल किए बिना इसे कैसे सरल बनाने के बारे में सोचने के बाद, नेस्टेड मैक्रोज़ का उपयोग करते हुए यहां एक अधिक संक्षिप्त दृष्टिकोण है।

में .h फ़ाइल

 #define defineKeysIn_h_File(key) extern NSString * const key; #define defineKeysIn_m_File(key) NSString * const key = @#key; #define myKeyDefineKeys(defineKey) \ /**start of key list*/\ defineKey(myKeyABC);\ defineKey(myKeyXYZ);\ defineKey(myKey123);\ /*end of key list*/ myKeyDefineKeys(defineKeysIn_h_File); 

फ़ाइल में

 myKeyDefineKeys(defineKeysIn_m_File); 

कार्यान्वयन नोट

आप एक से अधिक हेडर में एक से अधिक बार इसका उपयोग कर सकते हैं, हालांकि आपको "myKeyDefineKeys" के नाम को अनोखा बनाने की आवश्यकता है, मैं यह सुझाव देता हूं कि आप जिस कुंजी को परिभाषित कर रहे हैं उसे उसी उपसर्ग के रूप में – उदाहरण के लिए मैंने " मैके "भर में

किसी अन्य फ़ाइल में मैं "myOtherKeyDefineKeys" का उपयोग कर सकता हूं

इसके साथ भी गड़बड़ न करें किके इन_एच_फ़ाइल को परिभाषित करें और कीइन्स इन_म_फाइल मैक्रोज़ को परिभाषित करें या आपको एक चेतावनी मिलेगी कि परिभाषा बदल गई है।

<अंत संपादित करें>

मूल उत्तर, अभी मान्य है, लेकिन रिचार्ज बिना

सबसे पहले, एक vanilla.h फ़ाइल बनाएं और डिफ़ॉल्ट #ifdef आदि को निकाल दें, और नीचे अपनी चाबियाँ दर्ज करें: (यह एवीएडियओप्लेयर के विस्तार के लिए लिखा गया एक वर्ग से एक कट और पेस्ट है)

 // playFromConsts.h define_key(AVAudioPlayer_key_player); define_key(AVAudioPlayer_key_duration); define_key(AVAudioPlayer_key_filename); define_key(AVAudioPlayer_key_filepath); define_key(AVAudioPlayer_key_fileurl); define_key(AVAudioPlayer_key_urlString); define_key(AVAudioPlayer_key_envelope); define_key(AVAudioPlayer_key_startDate); define_key(AVAudioPlayer_key_linkToPlayer); define_key(AVAudioPlayer_key_linkFromPlayer); define_key(AVAudioPlayer_key_linkToPlayerEnvelope); define_key(AVAudioPlayer_key_linkFromPlayerEnvelope); define_key(AVAudioPlayer_key_deviceStartTime); define_key(AVAudioPlayer_key_currentVolume); define_key(AVAudioPlayer_key_fadeFromVolume); define_key(AVAudioPlayer_key_fadeToVolume); define_key(AVAudioPlayer_key_fadeTime); define_key(AVAudioPlayer_key_segueTime); 

फिर अपनी सामान्य एच फ़ाइल में (जहां आपका @ इंटफेस, @प्रोटोकॉल आदि घोषित किया गया है) इन 3 लाइनों को (अपनी हेडर फाइल को निश्चित रूप से प्रतिस्थापित करना)

 #define define_key(x) extern NSString * const x; #include "playFromConsts.h" #undef define_key 

अंत में आपके। एम फ़ाइल में, जो आपकी "@ इंटरफेस .h" फ़ाइल से जोड़ा गया है, इन 3 पंक्तियों को रखें:

 #define define_key(x) NSString * const x = @#x; #include "playFromConsts.h" #undef define_key 

"#include" को ध्यान दें और "#import" न करें – हम वास्तव में इस फ़ाइल को एक से अधिक बार शामिल करना चाहते हैं।

यह सभी गंदा काम करेगा, और सुनिश्चित करें कि चाबियाँ NSString * const हैं

अनुगामी; वैकल्पिक है, क्योंकि यह मैक्रो में शामिल है, हालांकि मैं इसे व्यक्तिगत तौर पर पसंद करता हूं।

तो सब के बाद मैं 3 फाइलों के साथ आया था

Constants.h

 #define def_key(name) extern NSString *const name #define def_int(name, value) extern int const name #define def_type(type, name, value) extern type const name #include "ConstantsDefs.h" 

Constants.m

 #import "Constants.h" #undef def_key #define def_key(name) NSString *const name = @#name #undef def_int #define def_int(name, value) int const name = value #undef def_type #define def_type(type, name, value) type const name = value #include "ConstantsDefs.h" 

ConstantsDefs.h

 def_key(kStringConstant); def_int(kIntConstant, 313373); def_type(float, kFloatConstant, 313373.0f); 

यह आपके सॉफ़्टवेयर के डिज़ाइन पर निर्भर करता है मान लीजिए आपके पास एक नौकरी प्रबंधन सॉफ्टवेयर है और आपके "डिफ़ॉल्ट" में से एक निर्देशिकाओं की एक सूची है जिसमें विभिन्न मदों को सहेजा जा सकता है।

प्रत्येक जॉब के लिए आपके पास एक स्टोरेजफ़ाइल सदस्य हो सकता है जो एक सिंगलटन है जो स्टार्टअप पर उपयोगकर्ता पसंदीदा स्थान लोड करता है।

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

मेरे लिए कॉम्प्लेक्स डिफॉल्ट (दर्जनों विभिन्न प्रकार की कक्षाएं) अपने स्वयं के "स्पेस" में मॉडल के लिए सुलभ होनी चाहिए।

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

फिर यह आपके डिज़ाइन पर निर्भर करता है