बड़े पैमाने पर देखें नियंत्रक - IOS - समाधान


16

मुझे यकीन है कि हर नए iOS डेवलपर को निम्नलिखित समस्या होती है: व्यू कंट्रोलर्स को विभिन्न प्रयोजनों के लिए कोड के साथ बहुत तेजी से भीड़ मिलती है, आसानी से कोड के 500 + लाइनों तक पहुंच जाती है।

यह दो बुनियादी और आम स्क्रीन के लिए कैसा दिखता है:

1) फॉर्म स्क्रीन: यहाँ छवि विवरण दर्ज करें

2) टेबल व्यू कंट्रोलर स्क्रीन यहाँ छवि विवरण दर्ज करें

अब तक मैंने दो अलग-अलग समाधानों के बारे में पढ़ा है:

  1. पहला समाधान: https://bendyworks.com/single-responsibility-principle-ios/ । यह सूचनाओं पर आधारित है, यह व्यू कंट्रोलर को (आशय) व्यू मॉडल से पूरी तरह से अलग करता है और इस प्रकार व्यू कंट्रोलर में कोड को कम करता है। मुझे लगता है कि इसमें गो-टू संरचनाओं के समान ब्रेकिंग कोड का नकारात्मक पहलू है। यह इस तरह दिख रहा है: यहाँ छवि विवरण दर्ज करें

  2. दूसरा समाधान समान भीड़-भाड़ वाला व्यू कंट्रोलर रखता है (बटन कार्रवाई वीसी के अंदर निष्पादित की जाती है और इसी तरह)। लेकिन श्रेणियों के आधार पर उनमें से अधिकांश जैसे TPKeyboardAvoiding , BlocksKit या अन्य समाधानों का उपयोग करता है । इस दूसरे समाधान के साथ, कोड काफी कम हो गया है लेकिन व्यू कंट्रोलर के पास अभी भी बहुत अधिक जिम्मेदारी है।

आप इन समाधानों के बारे में क्या सोचते हैं? कौनसा अच्छा है? क्या कोई बेहतर है?


5
मैं समय के कारण एक अच्छा जवाब नहीं दे सकता, लेकिन यह आपको सही दिशा में इंगित करना चाहिए।
माइक डी

मेरा इरादा अंत में इस समस्या को दूर करने के लिए जितने अच्छे उत्तर एकत्र करना है उतने नए डेवलपर्स के पास है। लिंक के लिए धन्यवाद, अगर मुझे कुछ नया मिलता है तो मैं इसे यहाँ पोस्ट करूँगा।
रवैल

जवाबों:


6

हम इस समस्या को हल करने के लिए MVVM का उपयोग कर सकते हैं।

मॉडल-व्यू-व्यूमॉडल, या एमवीवीएम पैटर्न जैसा कि आमतौर पर ज्ञात है, यूआई डिजाइन पैटर्न है। VM वीसी से यूआई के लिए मॉडल डेटा तैयार करने के बारे में सभी तर्क लेता है।

उदाहरण:
आपको कुछ क्षेत्रों के साथ मॉडल ऑब्जेक्ट मिला है, आप उनमें से कुछ को प्रारूपित करना चाहते हैं, गणना करें और उन्हें संयोजित करें।

MVC में ViewController में स्थित सभी तर्क।
MVVM में आप इसे वीसी से वीएम तक ले जाते हैं।

VM UI के लिए सभी डेटा तैयार करेगा और VC इसे इस तरह सेट करेगा।

(वीसी वर्ग में)

self.descriptionLabel = self.viewModel.textForDescriptionLabel;

ट्यूटोरियल और विषय:


3
जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो यहां उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगा।
बार्ट वैन इनगेन शेनॉ

मैं बार्ट से सहमत हूं। अगर कोई भी इन सभी तरीकों का सारांश पोस्ट नहीं करेगा, तो मैं जैसे ही समझूंगा और उन सभी का परीक्षण करूंगा।
रवैल

2
@Ravul अपडेटेड उत्तर
kaspartus

मैंने आपके उत्तर पर मतदान किया है और इस विचार के लिए धन्यवाद। मैं सिर्फ फंक्शनल रिएक्टिव प्रोग्रामिंग के बारे में पढ़ रहा हूं और यह एक अच्छा विचार है। मुझे लगता है कि इस प्रश्न का उत्तर कुछ फायदे, नुकसान और कम से कम एक वैचारिक आरेख के साथ निम्नलिखित 4 तरीकों के लिए समस्या है: 1) प्रतिक्रियाशील कोको 2) केवीओ 3) प्रतिनिधि विधि और 4: शास्त्रीय तरीका एक नियंत्रक देखें। जैसे ही मेरे सामने कोई और ऐसा करता है, तो मैं इन सभी तरीकों का परीक्षण करूंगा। अगर इस बीच मैं नए तरीके खोजता हूं, तो यह बेहतर है।
रवुल

3

मुझे पहले बड़े पैमाने पर आकार नियंत्रकों में कोड को अनटंगल करना पड़ा है और इसने पहली बार सामग्री को नेविगेट करने की मेरी क्षमता को बाधित किया है। एक महत्वपूर्ण बात मुझे महसूस हुई कि व्यू कंट्रोलर का आकार अकेले ही अलग करने के लिए पर्याप्त नहीं था। 1 बड़ी फ़ाइल होने में जटिलता है और छोटी फ़ाइलों का एक गुच्छा होने में भी जटिलता है। किसी व्यू कंट्रोलर को छोटे भागों में तोड़ने के लिए रिफ्लेक्टर के कुछ वैध कारण इस प्रकार हैं:

MVC

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

डेटा कंट्रोलर के रूप में व्यू कंट्रोलर के साथ मल्टीपल कंट्रोल

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

डुप्लिकेट कोड

यदि आपके पास अलग-अलग View Controllers में एक समान कोड है, तो उसे 1 साझा स्थान पर रखें। यह आपके कोड को पुन: प्रयोज्य बना देगा और जटिलता को प्रबंधित करने में मदद करेगा।

यहाँ देखें नियंत्रक जटिलता को कम करने के लिए कुछ अतिरिक्त सलाह:

प्रोग्राममैटिक की जगह स्टोरीबोर्ड

व्यू एलिमेंट्स बनाना बहुत सारे कोड हैं और फ्रेम ज्योमेट्री कोड भी बहुत काम का है। यदि पहले से ही ऑटो लेआउट बाधाओं का उपयोग करने और स्टोरीबोर्ड में व्यू तत्वों का अधिक से अधिक उपयोग करने पर विचार न करें।

अनावश्यक कोड / टिप्पणी

अनावश्यक कोड / टिप्पणियों को निकालना सुनिश्चित करें। बहुत बार एक नया व्यू कंट्रोलर फ़ाइल उन विधियों के साथ आएगा, जिनका आप उपयोग नहीं कर रहे हैं। यदि आप एक विधि का उपयोग नहीं कर रहे हैं didReceiveMemoryWarningतो इसे बाहर निकालना सुरक्षित है। इसके अलावा, क्योंकि व्यू कंट्रोलर फ़ाइल इतनी बड़ी होती है कि कभी-कभी पुराने कोड या टिप्पणियों को हटाना डरावना होता है। कि बंद मत करो! यह केवल जटिलता में जोड़ता है।

सूचनाएं

सूचनाओं के बारे में आपके प्रश्न का उत्तर देने के लिए: अधिसूचनाएं हर चीज के साथ उपयोग करने के लिए एक स्वर्ण हथौड़ा नहीं हैं। जब कई व्यू कंट्रोलर को 1 विशेष एक्शन के कारण एक ही समय में अपडेट करने की आवश्यकता होती है, तो मुझे उपयोगी होने के लिए सूचनाएं मिल जाती हैं। हालांकि, सूचनाओं से सावधान रहें, उनके अधिक उपयोग से आपको उन्हें ट्रैक करने में बहुत दर्द हो सकता है।


2

एक विशेष वास्तुकला है जिसे वे VIPER (व्यू, इंटरेक्टर, प्रस्तोता, इकाई और रूटिंग) कहते हैं। मैं यहां आपको फिर से शुरू करने की कोशिश करूंगा जो आपको जानना चाहिए:

राय

  • वे डमी विचार हैं;
  • UIView, UIViewController, UILabel, आदि जैसी वस्तुएँ शामिल हैं;
  • प्रस्तुतकर्ता की सामग्री की प्रतीक्षा करता है ;
  • उपयोगकर्ता इंटरैक्शन को हैंडल करें और इसे प्रस्तुतकर्ता परत में पास करें।

प्रस्तुतकर्ता

  • यूआई वस्तुओं को नहीं जानता;
  • दृश्य परत से इनपुट मिलते हैं ;
  • व्यू लॉजिक को हैंडल करें (ऐड मेथड अन्य स्क्रीन को प्रस्तुत करेगा);

रूटिंग

  • नेविगेशन तर्क और संक्रमण एनिमेशन संभाल;
  • UINavigationController, UIWindow, आदि जैसी वस्तुओं को जानता है;

तो, मुझे क्या लगता है कि आप अपने कोड में साफ करेंगे:

  • डेटा सत्यापन प्रस्तुतकर्ता परत में चला जाएगा;

  • नेविगेशन वायरफ्रेम ऑब्जेक्ट्स ( रूटिंग परत) पर जाएगा;

  • DRY सिद्धांत को देखते हुए अपने व्यू कंट्रोलर को विभाजित करें ;

  • जटिल स्क्रीन में दो या अधिक दृश्य और प्रस्तुतकर्ता होंगे।

आपको VIP आर्किटेक्चर के बारे में निम्न लिंक देखना चाहिए http://mutualmobile.github.io/blog/2013/12/04/viper-introduction/

अच्छा भाग्यशाली!


1
क्या यह आर्किटेक्चर छोटे अनुप्रयोगों के लिए काम करता है? ऐसा लगता है कि आपको इसे प्रोजेक्ट से परिचित कराने के लिए बहुत सी वस्तुएं बनानी होंगी।
टॉमस ब्च सिप

हाँ, मैं सहमत हूँ कि यह पारंपरिक एमवीसी से अधिक वस्तु है, लेकिन यह इसके लायक है। आप एक सरल उदाहरण देख सकते हैं जो मैंने इस साल बनाया था github.com/orafaelreis/cascavel Cascavel VIPER प्रोजेक्ट्स को इनिशियलाइज़ करने के लिए बेस प्रोजेक्ट की तरह है।
orafaelreis

अति उत्कृष्ट ! VIPER वास्तुकला वास्तव में बड़े पैमाने पर देखने वाले नियंत्रकों के मुद्दे से बचने के लिए डिज़ाइन की गई लगती है।
क्रिस्टोफ़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.