2016-04-28 9 views
21

यदि प्रेजेंटर परत से मैं Activity खोलता हूं तो यह एक विरोधी पैटर्न होगा?प्रस्तुतकर्ता से विरोधी एमवीपी खुली गतिविधि, विरोधी पैटर्न?

यदि हां, तो क्या मुझे दृश्य परत से ऐप के नेविगेशन का प्रबंधन करना चाहिए?

उत्तर

24

हाँ, यह एक विरोधी एमवीपी पैटर्न है। एमवीपी में passive view के आधार पर, आपने अपनी टेस्टेबिलिटी खो दी है, क्योंकि आपको अपने प्रस्तुतकर्ता में एंड्रॉइड फ्रेमवर्क से निपटने की ज़रूरत नहीं है।

तो दृश्य परत से ऐप के नेविगेशन को प्रबंधित करना बेहतर है।

class MyPresenter { 
    MyPresenter.View view; 

    void backButtonClicked() { 
     view.navigateToHomeScreen(); 
    } 

    public interface View { 
     void navigateToHomeScreen(); 
    } 
} 

class MyActivity extends Activity implements MyPresenter.View { 
    @Override 
    void navigateToHomeScreen() { 
     startActivity(...) 
    } 

    @OnClick(R.id.my_button) 
    void onClick() { 
     presenter.backButtonClicked(); 
    } 
} 

इसके अलावा इस तरह का एक और लाभ यह है कि यह एक टुकड़ा या एक दृश्य के साथ गतिविधि को बदलने के लिए आसान हो जाएगा।

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

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

TaskDetailPresenter कॉल ShowEditTask जो एक नई ActivityTaskDetailFragment अंदर खोलने के लिए जिम्मेदार है: यहाँ एमवीपी के लिए गूगल से एक उदाहरण है।

लेकिन यह भी आप CommandPattern उपयोग कर सकते हैं जो एक बेहतर दृष्टिकोण

interface NavigationCommand { 
    void navigate(); 
} 

तो, प्रस्तुतकर्ता यह जब यह जरूरत प्रयोग करेंगे।

+1

यदि मैं अतिरिक्त डेटा के माध्यम से कुछ डेटा पास करना चाहता हूं तो क्या होगा? यह फिर से एमवीपी का उल्लंघन नहीं करेगा? क्योंकि दृश्य मॉडल के बारे में कुछ भी नहीं पता होना चाहिए। – cylon

+0

आईएमओ में एक दृश्य में वर्तमान यूआई स्क्रीन को अपडेट करने के लिए केवल विधियां होनी चाहिए और नेविगेशन को ज़िम्मेदारी नहीं दिखनी चाहिए क्योंकि यह चिंताओं के नियम को अलग करता है। क्लासिक एमवीपी में, वर्तमान प्रेजेंटर तय करता है कि कौन सा अन्य प्रस्तुति नियंत्रण (आमतौर पर एक संदेश बस का उपयोग कर) को नियंत्रित करने के लिए, फिर लक्ष्य एक "कैनवास" पर अपना विचार रखता है। एंड्रॉइड नेविगेशन में आमतौर पर एक गतिविधि या एक टुकड़ा वस्तु का उपयोग करके किया जाता है और विचारों को आमतौर पर एक टुकड़े या गतिविधि द्वारा लागू किया जाता है, वस्तुओं को अक्सर नेविगेशन करने के लिए उपयोग किया जाता है। हालांकि यह चिंताओं के शासन को अलग करने का एक स्पष्ट तोड़ रहा है आईएमओ – morgwai

+0

अच्छा महोदय, क्या आपके पास एंड्रॉइड एमवीपी + कमांड पैटर्न का कहीं उदाहरण @ सईदमासुमी है? – ericn

4

मेरी राय में यदि आप व्यू लेयर से कोई गतिविधि खोलते हैं तो यह बेहतर होगा। मैं पसंद करता हूं कि प्रस्तुतकर्ता जितना संभव हो सके गतिविधि के बारे में जानता है।

अगर वहाँ क्या गतिविधि शुरू किया जाना चाहिए में से कुछ की हालत है, तो आप कुछ इस तरह का उपयोग कर सकते हैं:

public class Presenter { 

    private ViewsPresentation mViewsPresentation; 

    public void someButtonClicked() { 
     if (/*some condition*/) { 
      mViewsPresentation.startFirstActivity(); 
     } else { 
      mViewsPresentation.startSecondActivity(); 
     } 
    } 

    public interface ViewsPresentation { 
     void startFirstActivity(); 
     void startSecondActivity(); 
    } 

} 
5

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

समस्या एंड्रॉयड प्लेटफॉर्म डिजाइन से निकलती है के रूप में Activity और Fragment कक्षाएं यूआई स्क्रीन पर संचालित करने के लिए और इरादे वस्तुओं कि startActivity जैसी अन्य गतिविधियों में शुरू भेजने के लिए दोनों पद्धतियां हैं।

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

+0

क्या आपके पास इस नेविगेटर इंटरफेस की कोई नमूना परियोजना लागू है? – toobsco42

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