6

हमारे कोडबेस परिपक्व होने के कारण मैं संदेश पास करने के लिए जानकारी को पैकेज करने के तरीके के रूप में शब्दकोष पारित करने के पैटर्न की तरह नहीं दिख रहा हूं, फिर भी खराब कार्य करता हूं। यह स्ट्रिंग अक्षर के अनियंत्रित एपीआई दोनों भेजने और प्राप्त करने की क्रिया की आवश्यकता है।NSDorms को पैरामीटर के रूप में पास करने से बेहतर पैटर्न?

..in some function.. 
NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys: 
         thisObject, @"thisKey", 
         thatObject, @"thatKey", 
         nil]; 

[[NSNotificationCenter defaultCenter] postNotificationName:@"MY_NOTIFICATION" object:nil userInfo:info]; 
.... 

और फिर someClass के श्रोता में

- (void)someClassListener:(NSNotification *)notification { 
    NSDictionary *info = [notification userInfo]; 

    ThisObject *ob1 = [info objectForKey:@"thisKey"]; 
    ThatObject *ob2 = [info objectForKey:@"thatKey"]; 
} 

आप को याद है कि thisKey और thatKey प्रकार ThisObject और ThatObject कि अधिसूचना के लिए की चाबियाँ हैं है, सुनिश्चित करें कि आप कुछ स्थिरांक कहीं उन लोगों के लिए बना सकते हैं कुंजी लेकिन यह वास्तव में समस्या को हल नहीं करता है।

और कहें कि आपके पास एक ऐसा कार्य है जिसके लिए 15 तर्क हैं, आप 15 पैरामीटर के साथ कोई फ़ंक्शन नहीं करने जा रहे हैं, यह केवल एक शब्दकोश को पास करने के लिए बहुत आसान होगा (हालांकि कम पठनीय) लेकिन अब आपके पास उपरोक्त के समान समस्या।

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

अगर मैं typeDef की तरह कुछ कर सकता है शीर्षक में एक पैरामीटर वस्तु यह बहुत अच्छा होगा लेकिन यह है कि समर्थन नहीं करता NSObject के int या float आदि

अनिवार्य रूप से मैं कोशिश कर रहा हूँ की तरह ही बातें संदेश प्रेषक और संदेश रिसीवर के बीच एक मजबूत अनुबंध बनाएं, वह कार्य या अधिसूचनाएं हों।

उत्तर

4

आप कुंजी के लिए स्थिरांक परिभाषित कर सकते हैं। उदाहरण के तौर पर, उदाहरण के लिए UIKeyboardDidShowNotification के लिए दस्तावेज़ देखें। अधिसूचना के बारे में जानकारी प्राप्त करने के लिए उपयोग की जा सकने वाली सभी चाबियों का एक लिंक है।

एक बेहतर दृष्टिकोण आपके डेटा को एक शब्दकोश के बजाय कक्षा में समाहित करना होगा। गुणों के साथ एक साधारण वर्ग बनाएँ। यह एक शब्दकोश से ज्यादा स्वयं दस्तावेज होगा। आप .h फ़ाइल में संपत्ति के नाम और संपत्ति प्रकार देख सकते हैं।

यदि आपको लगता है कि आपके पास 15 तर्कों की आवश्यकता है, तो आपको वापस कदम उठाने और उचित तर्क में उन तर्कों को समाहित करने की आवश्यकता है। शायद विधि कुछ तर्कों और वर्ग या कुछ समान रूप से ठीक से कम हो जाती है।

+0

मैं कुंजी के लिए स्थिरांक का उल्लेख नहीं करता क्योंकि यह एक अच्छा समाधान नहीं है क्योंकि आपको अभी भी देखना है कि कुंजी क्या है और यह मूल्य (ऑब्जेक्ट) के लिए एक मजबूत अनुबंध नहीं बना रहा है, एक सुझाव की तरह। कक्षा में डेटा को एक साथ जोड़ना एक दिशा थी जिसकी मैं जांच कर रहा था लेकिन ऐसा लगता है कि मैं जिस संदेश को पास करना चाहता हूं, उसके लिए कक्षा बनाने के लिए बोझिल लगता है, क्या यह 2 तर्क 10 हैं, क्या आप सहमत नहीं होंगे? – Shizam

+0

@Shizam, यदि उन संदेशों को अलग-अलग शब्दकोशों में रखा जाएगा, तो आपको शायद एक से अधिक कक्षा की आवश्यकता होगी। लेकिन, अगर आप उन संदेशों के बारे में बात कर रहे हैं जो कभी-कभी एक शब्दकोश से दो कुंजी पास करते हैं, और कभी-कभी 10, तो यह अभी भी एक वर्ग वस्तु होगी। – rdelmar

+0

@rdelmar मुझे जो कुछ भी है, वह हमारे कार्यक्रम में है, हमारे पास शायद 10-15 अनन्य अधिसूचनाएं हैं, उनमें से प्रत्येक अधिसूचना को संदेश के लिए अपनी संपत्तियों को परिभाषित करने के लिए अपनी कक्षा की आवश्यकता होगी। – Shizam

2

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

पैरामीटर ऑब्जेक्ट को एक साधारण एपीआई दें जो दोनों वर्गों को आपके द्वारा उपयोग किए जाने वाले विशिष्ट फ़ील्ड सेट करने और प्राप्त करने देता है - setThisKey: और getThisKey। संक्षेप में, विधियों और वर्गों के बीच एपीआई दस्तावेज।

अगला, पैरामीटर ऑब्जेक्ट में कार्यक्षमता को स्थानांतरित करने के अवसरों को देखें।उदाहरण के लिए, यदि आप कुछ इस तरह है:

param.fieldSize=[self.data size]; 
param.fieldColor=[self.data color]; 
param.flavor=[self.data lookUpTheRecipe] 

आप यह सब

[param withField: self.data]; 
काम के साथ

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

+0

मैं इसे एक समाधान के रूप में उल्लेख करता हूं जिसे मैं देख रहा था, मुझे लगता है कि समस्या हर संदेश के लिए पैरामीटर ऑब्जेक्ट बनाना है, बोझिल लगता है। यह भी लगता है कि यह ऑब्जेक्ट उस वर्ग के शीर्षलेख में है जो उस संदेश को 'मालिक' है, जिसमें आपके पास एक शीर्षलेख में दो इंटरफेस हैं जो कि प्रतीत होता है। – Shizam

+0

आप कई संबंधित विधियों के बीच अक्सर एक पैरामीटर ऑब्जेक्ट साझा कर सकते हैं। –

+1

मुझे कक्षा के शीर्षलेख में सहायक वस्तुओं को इंटरफेस जोड़ने के लिए कोई आपत्ति नहीं है। लेकिन पैरामीटर ऑब्जेक्ट के साथ आपका लक्ष्य उस ऑब्जेक्ट पर बहुत उपयोगी व्यवहार जोड़ना है, न केवल कुछ डेटा लपेटना। तो, अंततः, पैरामीटर ऑब्जेक्ट दुनिया में अपनी जगह के लायक हो सकता है। NSURL जैसी कक्षाएं इस तरह से शुरू हो जाती हैं। –

0

सबसे पहले, 15 तर्क होने के लिए अच्छा नहीं है और ऐसे मामले में आपको ऐसे कॉलबैक न करने या संख्या को कम करने की कोशिश करने के बारे में सोचना चाहिए।


अधिसूचना के प्रेषक का उपयोग करने के बारे में क्या? उदाहरण के लिए आपकी ऑब्जेक्ट Task समाप्त हो गई और अधिसूचना भेजती है। रिसीवर sender.result, sender.error, sender.anything तक पहुंचने के लिए प्रेषक का उपयोग करता है।


आप उन वस्तुओं के बीच मजबूत संपर्क (प्रेषक/रिसीवर) चाहते हैं हो सकता है आप के बजाय संचार NSNotifications के किसी अन्य तरीके से उपयोग करना चाहिए।

कुछ विकल्प:

  • प्रतिनिधि (या प्रत्यक्ष विधि कॉल के कुछ अन्य प्रकार)
  • ब्लॉक
  • लक्ष्य + क्रिया

वे सब के सब करने के लिए कई के रूप में इस्तेमाल किया जा सकता उन्हें एक सरणी में संग्रहीत करके कॉलबैक और वे मूल्य पारित होने के लिए NSDictionaries का उपयोग नहीं करते हैं।

+0

हम प्रतिनिधि और ब्लॉक का भी उपयोग करते हैं, मैं सिर्फ एनएसएनोटिफिकेशन का उपयोग उदाहरण के रूप में कर रहा था जहां समस्या को देखना आसान था। मुझे अभी भी ब्लॉक आदि के साथ यह समस्या है, लेकिन मुझे लगता है कि पैरामीटर को रखने के लिए पैरामीटर ऑब्जेक्ट्स बनाना बहुत ही आसान तरीका है। – Shizam

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