2012-03-20 13 views
5

में एमवीसी डिज़ाइन पैटर्न को समझना आम तौर पर जब तक यह काम करता है, तब तक मैं किसी भी यादृच्छिक तरीके से एक ऐप डालता हूं, लेकिन इसका मतलब है कि मैं किसी भी डिज़ाइन पैटर्न पर कोई ध्यान नहीं देता हूं। मेरा आवेदन वर्तमान में वैश्विक चर के व्यापक उपयोग को बनाता है (मैं अपने AppDelegate.h में घोषित संपत्तियों तक पहुंचने के लिए प्रत्येक दृश्य नियंत्रक में अपने AppDelegate का एक उदाहरण लेता हूं)। हालांकि यह वही करता है जो मैं करना चाहता हूं, मैंने पढ़ा है कि यह एक अच्छा डिजाइन अभ्यास नहीं है।कोको टच

तो मैं अपना कोड "कानूनी" बनाना शुरू करना चाहता हूं। हालांकि, मैं वैश्विक चर के बिना अभी अपने ऐप की कल्पना नहीं कर सकता। वे ऐप के कल्याण के लिए बहुत महत्वपूर्ण हैं, लेकिन इसका मतलब यह होगा कि मैं कुछ गलत कर रहा हूं, है ना? मैं कल्पना नहीं कर सकता कि मैं कुछ और कैसे करूंगा। उदाहरण के लिए इस लें:

enter image description here

आप यहाँ दो दृश्य नियंत्रकों, एक SideViewController और एक MainViewController है। वैश्विक चर का उपयोग करना, जैसे कि पूरे एप्लिकेशन में SideViewController और MainViewController (appDelegate.sideViewController और appDelegate.mainViewController) का एक साझा उदाहरण था, मैं आसानी से दो दृश्य नियंत्रकों के बीच संवाद कर सकता हूं, ताकि अगर मैं अपने SideViewController में "समाचार फ़ीड" दबा सकता हूं, तो मैं कर सकता हूं इसके दृश्य को पुनः लोड करने के लिए मेरे MainViewController बताएं।

मैं कल्पना नहीं कर सकता, हालांकि, यह कैसे किया जाएगा यदि यह वैश्विक चर नहीं थे? यदि मेरे SideViewController में कोई ईवेंट होता है, तो मैं अपने MainViewController को डिज़ाइन मानकों के अनुसार कैसे सूचित करूं?

+0

क्या आप नेविगेशन नियंत्रक का उपयोग कर रहे हैं? –

+0

मैं अपने ऐप की मुख्य सामग्री के लिए एक नेविगेशन नियंत्रक का उपयोग कर रहा हूं, हालांकि मेरे साइड व्यू कंट्रोलर का वर्तमान कार्यान्वयन नेविगेशन स्टैक में नहीं जोड़ा गया है, लेकिन मुख्य एप्लिकेशन विंडो में '[appDelegate.window addSubView: sideViewController.view]' के माध्यम से जोड़ा गया है। – Snowman

उत्तर

5

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

वैसे ही आप इसे अभी भी करते हैं, सिवाय इसके कि साइडव्यू कंट्रोलर को मेनव्यू कंट्रोलर के लिए एक अलग जगह से संदर्भ मिलता है।

इन दो दृश्य नियंत्रकों को कैसे बनाया गया है? यह संभावना है कि यह दो तरीकों में से एक में होता है:

  1. वस्तुओं में से एक दूसरे को बनाता है। इस मामले में, शायद MainViewController SideViewController बनाता है।

  2. कुछ अन्य ऑब्जेक्ट, जैसे कि ऐप प्रतिनिधि या अन्य दृश्य नियंत्रक, उन्हें दोनों बनाता है।

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

दूसरा मामला समान है - यदि ऐप प्रतिनिधि (या कुछ अन्य ऑब्जेक्ट) मेनव्यू कंट्रोलर और साइडव्यू कंट्रोलर दोनों बनाता है, तो वह ऑब्जेक्ट दोनों ऑब्जेक्ट्स के बारे में जानता है और प्रत्येक को संदर्भ के साथ प्रत्येक को कॉन्फ़िगर कर सकता है।

दोनों मामलों में, प्रश्न में वस्तुएं एक-दूसरे के साथ संवाद करने में सक्षम हैं जितनी आसानी से उन्होंने कभी भी की है और वैश्विक चर की आवश्यकता नहीं है।

जो मैंने ऊपर बताया है वह संभव है कि आपने जो कुछ पूछा है उसे पूरा करने का सबसे आसान तरीका - दो वस्तुओं के बीच संचार। कि अपने कोड और भी बेहतर बनाने के लिए उन वस्तुओं के बीच संबंधों को परिष्कृत करने के लिए इस्तेमाल किया जा सकता पैटर्न की एक संख्या हैं:

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

  • अधिसूचना: SideViewController भी एक प्रतिनिधि की जरूरत नहीं कर सकते हैं - यह बस किसी भी वस्तु है कि सुनने जा करने के लिए होता है कुछ घटनाओं के बारे में सूचनाएं प्रसारित कर सकते हैं। यह विशेष रूप से प्रभावी होता है यदि एक से अधिक ऑब्जेक्ट को साइडव्यू कंट्रोलर में होने वाली किसी चीज़ के बारे में जानने की आवश्यकता हो सकती है, या यदि ऑब्जेक्ट्स जो SideViewController के कार्यों के बारे में सोचते हैं, वे बदल सकते हैं।

  • एमवीसी: मेनव्यू कंट्रोलर को कुछ कहने के बजाय, साइडव्यू कंट्रोलर मॉडल में डेटा को बदल देता है। जब भी MainViewController का दृश्य प्रकट होता है (या उस मामले के लिए कोई अन्य दृश्य नियंत्रक का दृश्य), नियंत्रक मॉडल से डेटा पढ़ता है और खुद को फिर से प्रदर्शित करता है।

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

+0

मामले 1 के लिए, यदि मेरा 'MainViewController' SideViewController बनाता है, तो' SecondViewController' 'SideViewController' कैसे एक्सेस कर सकता है? 'AppDelegate.sideViewController' के साथ, यह आसानी से किया जाता है, लेकिन मैं पढ़ रहा हूं कि उस तरह की चीजें AppDelegate में नहीं होनी चाहिए। – Snowman

+0

वही प्रश्न: जो 'माध्यमिक दृश्य नियंत्रक' बनाता है? साथ ही, * माध्यमिक दृश्य नियंत्रक को SideViewController तक पहुंचने की आवश्यकता क्यों है? क्या इसे * एक ही * साइड व्यू कंट्रोलर तक पहुंचने की आवश्यकता है, या यह बेहतर होगा अगर यह अपने स्वयं के SideViewController उदाहरण था? अपनी वस्तुओं के बीच संबंधों को समझना उन रिश्तों को विश्वसनीय और रखरखाव करने वाले किसी ऐसे संगठन में व्यवस्थित करने का पहला कदम है। – Caleb

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