2015-03-06 9 views
9

मैं रॉबर्ट मार्टिन द्वारा वर्णित Clean Architecture को लागू करने की कोशिश कर रहा हूं। अधिक विशेष रूप से मैं VIPER का उपयोग कर रहा हूं जो स्वच्छ वास्तुकला का आईओएस संस्करण है।स्वच्छ वास्तुकला - रॉबर्ट मार्टिन - उपयोग मामलों को कैसे कनेक्ट करें

समस्या मेरे पास है इस प्रकार है:

उपयोगकर्ता उस पर स्थानों (पिन) के साथ किसी मानचित्र को देखकर शुरू होता है। यदि वह एक बटन पर क्लिक करता है, तो एक पिन गिरा दिया जाता है और उसे स्थान (या रद्द) के निर्माण के लिए किसी अन्य दृश्य में ले जाया जाता है (या संपादित करें कि यह एक मौजूदा पिन पर क्लिक था)। इस अन्य दृश्य में, उपयोगकर्ता स्थान की जानकारी संपादित कर सकते हैं और फिर "वापस" या "पूर्ण" (या "संपादित करें") पर क्लिक कर सकते हैं। यदि वह "पूर्ण" पर क्लिक करता है, तो PlaceDetailsViewController स्थान जानकारी के साथ PlaceDetailsPresenter को एक संदेश भेजता है और PlaceDetailsPresenter स्थान बनाने के लिए CreatePlaceInteractor का उपयोग करता है। यह इंटरैक्टर GUID देता है जिसका उपयोग स्थान की पहचान करने के लिए किया जाता है।

यदि उपयोगकर्ता जगह बनाने से पहले वापस क्लिक करता है, तो वह मानचित्र पर वापस आ जाता है और गिराए गए पिन ऊपर और दूर जाते हैं (क्योंकि इसमें कोई GUID नहीं है, यह एक नई जगह है और चली जाती है)। यदि वह बनाने के बाद वापस क्लिक करता है, तो पिन वहां रहता है (क्योंकि इसमें GUID होना चाहिए)।

मुझे उन सभी को कैसे कनेक्ट करना चाहिए और स्थान जानकारी (GUID सहित) को कहां रखा जाना चाहिए? थोड़ा और अधिक स्पष्ट करने के लिए:

  1. कौन MapPresenter को सूचित करना चाहिए कि पिन रहता है या चली जाती है? क्या यह प्लेस डिस्प्ले प्रतिनिधि है या क्या मुझे यह जानकारी PlaceDetailsWireframe -> MapWireframe -> MapPresenter -> MapView पर पास करनी चाहिए?
  2. वापस जाने से पहले, यह GUID को PlaceDetailsPresenter में या PlaceDetailsViewController में कहां रखा जाना चाहिए?

अभी है कि मैं क्या है: enter image description here

संपादित करें:

मूल रूप से मुझे लगता है कि समस्या यह है कि सांप रॉबर्ट मार्टिन के स्वच्छ वास्तुकला से आया है और वह एक वेब (रेल) पृष्ठभूमि से आता है, इसलिए वह राज्य के बारे में ज्यादा नहीं सोचता (या इसे अपनी वार्ता में निर्दिष्ट नहीं करता है)।

जो मुख्य रूप से मेरा प्रश्न है, राज्य को कहां रखा जाना चाहिए, विभिन्न मॉड्यूल कैसे संवाद कर सकते हैं, यह वायरफ्रेम, या डेटाबेस के माध्यम से, या इंटरैक्टर्स के माध्यम से, या प्रस्तुतकर्ताओं के माध्यम से एक-दूसरे के साथ संवाद करना चाहिए यहां https://github.com/objcio/issue-13-viper-swift

+0

मैं सिर्फ सांप के साथ बाहर शुरू कर में GUID डालता है, लेकिन यह प्रस्तुतकर्ताओं एक दूसरे के बारे में पता करने के लिए मेरे लिए गलत लगता है। मैं वायरफ्रेम/राउटर के माध्यम से एक-दूसरे के साथ संवाद करने वाले मॉड्यूल का पक्ष लेता हूं। मुझे यहां सुधारने में खुशी है क्योंकि मैं अभी भी इस वास्तुकला को सीख रहा हूं। – bennythemink

+0

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

+0

http://stackoverflow.com/questions/29054526/viper-should-the-interactor-return-only-the-necessary-information –

उत्तर

15

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

आपके मामले में दो स्क्रीन हैं। मानचित्र, और जगह संपादक। मानचित्र पर क्लिक करने से या तो जगह पिन नियंत्रक को बुलाया जा सकता है। यह क्लिक के स्थान को इकट्ठा करता है, और कोई अन्य प्रासंगिक डेटा, एक जगह बनाता है PinRequest डेटा संरचना और इसे PlacePinInteractor में भेजता है जो पिन के स्थान की जांच करता है, यदि आवश्यक हो तो उसे मान्य करता है, पिन रिकॉर्ड करने के लिए प्लेस इकाई बनाएं, एक संपादनप्लेस रीपॉन्स बनाता है ऑब्जेक्ट और इसे EditPlacePresenter पर भेजता है जो स्थान संपादक स्क्रीन लाता है।

यदि स्थान संपादक स्क्रीन पर पूर्ण बटन क्लिक किया गया है तो यह संपादनप्लेस नियंत्रक को आमंत्रित करता है जो संपादित डेटा को एडिटप्लेससक्वेट डेटा संरचना में एकत्र करता है और इसे EditPlaceInteractor में भेजता है। आदि ..

आपने विशेष रूप से पिन के GUID के बारे में पूछा। यह प्लेस इकाई द्वारा बनाया जाएगा और संपादन प्लेसपेंटर प्लेसपिनइंटरएक्टर पर वापस भेज दिया जाएगा।

+0

शायद मैं बहुत स्पष्ट नहीं था, लेकिन मुझे क्या पता था: क्लिक में होता है MapPresenter, लेकिन स्थान केवल बाद में बना देता है, यदि उपयोग PlaceDetailsViewController (जो दृश्य जैसा है) में "किया गया" दबाता है। जब उपयोगकर्ता "किया" क्लिक करता है तो स्थान बनाया जाता है। यदि उपयोगकर्ता "बैक" पर क्लिक करता है, तो उसे वापस MapPresenter पर जाना चाहिए और फिर पिन को खारिज नहीं करना चाहिए (या इसे बनाए जाने पर इसे खारिज कर दें)। –

+0

राज्य द्वारा मेरा मतलब है पिन की तरह चीजें जो अस्थायी रूप से मानचित्र में बनाई गई थीं। ताकि जब हम PlaceDetailsViewController/Presenter से वापस आएं, तो हम जानते हैं कि कौन सा पिन खारिज या बनाए रखने के लिए (और GUID को संबद्ध करने के लिए) दें। –

+0

विभिन्न उपयोग मामलों (विभिन्न इंटरैक्टर्स) के रूप में "पूर्ण" और "पीछे" के बारे में सोचें। –

0

शुद्ध सांप रूटर में एक प्रोटोकॉल के रूप में मॉड्यूल इनपुट धारण करना चाहिए। और मॉड्यूल प्रस्तुतकर्ता को इसके अनुरूप होना चाहिए। तो जब राउटर नए मॉड्यूल को इकट्ठा करने के लिए अन्य मॉड्यूल राउटर का उपयोग करता है तो यह इसके इनपुट को पास करता है।

दूसरा रूटर तो इसकी प्रस्तुतकर्ता उत्पादन के लिए इनपुट प्रदान करती है। इसलिए मूल रूप से पहले मॉड्यूल का प्रेजेंटर दूसरे मॉड्यूल प्रेजेंटर के लिए एक प्रतिनिधि बन जाता है।

तो अपने मामले के लिए एक उपयोगकर्ता एक जगह MapPresenter का चयन करता है जब में एक GUID के लिए MapInteractor पूछता है और MapRouter यह बताता है GUID के लिए विवरण के लिए नेविगेट करने के लिए।

MapRouter इस GUID के लिए PlaceDetailsModule इकट्ठा करने के लिए PlaceDetailsRouter पूछता है और इसे करने के लिए MapModuleInput गुजरता है। PlaceDetailsRouter PlaceDetailsPresenter को MapModuleInput असाइन करता है। PlaceDetailsRouter PlaceDetailsInteractor

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