एक परियोजना की वास्तुकला को डिजाइन करते समय, वह एमवीपी पैटर्न पर बस गए - उन्होंने यूआई को आसानी से बदलने की क्षमता का भंडाफोड़ किया, साथ ही साथ परीक्षणों के साथ कवरेज में आसानी। सभी MVP कार्यान्वयन उदाहरण जो मुझे नेटवर्क पर मिले C # में थे। Qt पर लागू करते समय, कुछ स्पष्ट क्षण दिखाई दिए, जिसका समाधान सफलतापूर्वक मिल गया। जानकारी नीचे एकत्र की।
एमवीपी की कहानी
जैसा कि [1] और [२] से है, एमवीपी डिज़ाइन पैटर्न एमवीसी का एक संशोधन है, जो पहली बार आईबीएम द्वारा पिछली शताब्दी के ९ ० के दशक में उपयोग किया गया था जब ऑब्जेक्ट-ओरिएंटेड ऑपरेटिंग सिस्टम टैलिगेंट पर काम कर रहा था। बाद में, एमवीपी को माइक मोटल द्वारा विस्तार से वर्णित किया गया था।
एमवीपी और एमवीसी के बीच अंतर क्या है, यह देखने के लिए आप संबंधित पैराग्राफ पर देख सकते हैं [3]:
एमवीसी ,
एमवीपीQt में MVP लागू करें
सामान्य तौर पर, एमवीपी पहले से ही क्यूटी में निहित है, जैसा कि [4] में दिखाया गया है:

लेकिन ऐसे एमवीपी कार्यान्वयन के कई नुकसान हैं:
- एक प्रतिनिधि (प्रस्तुतकर्ता) के लिए कई विचार बनाना संभव नहीं है
- [3] ( यहाँ ) में वर्णित नियंत्रण पैटर्न के व्युत्क्रम का उपयोग करना असंभव है, क्योंकि इस योजना में, दृश्य स्वचालित रूप से उत्पन्न होता है और इंटरफ़ेस से विरासत में नहीं मिल सकता है
एक पूर्ण MVP कार्यान्वयन इस तरह दिखेगा:

इसलिए वर्ग आरेख:

प्रत्येक वर्ग पर विचार करें:
- IView - एक इंटरफ़ेस वर्ग जो उन तरीकों और संकेतों को परिभाषित करता है जिन्हें एक विशेष दृश्य को लागू करना चाहिए ([3 में नियंत्रण का उलटा देखें)
- Ui :: देखें - एक क्यूटी डिजाइनर की .ui फ़ाइल द्वारा उत्पन्न एक वर्ग
- दृश्य QWidget (या इसके वंशज) और IView से विरासत में मिला एक विशिष्ट दृश्य है। जीयूआई तर्क शामिल हैं, अर्थात् वस्तुओं का व्यवहार (उदाहरण के लिए, उनका एनीमेशन)
- मॉडल - डोमेन डेटा मॉडल (डोमेन मॉडल); इसमें चर, झंडे, टेबल मॉडल आदि शामिल हैं।
- प्रस्तुतकर्ता - प्रतिनिधि; मॉडल और दृश्य के बीच बातचीत को लागू करता है। इसके अलावा इसके माध्यम से बाहरी दुनिया के साथ बातचीत होती है, अर्थात्। मुख्य अनुप्रयोग के साथ, सर्वर के साथ (उदाहरण के लिए, एप्लिकेशन सेवाओं की परत के माध्यम से), आदि।
"ड्राइंग स्क्वायर" के चरण में सब कुछ स्पष्ट है। मुझे इसे लागू करने की कोशिश करने में समस्या थी।
- IView लिखते समय, आपको संकेतों की घोषणा करनी चाहिए। लेकिन इसके लिए, IView को QObject से विरासत में लिया जाना चाहिए। फिर, जब एक ही समय में QWidget और IView से व्यू इनहेरिट करने की कोशिश की गई, तो एक त्रुटि हुई। यह पता चला कि कक्षा को एक साथ दो QObject ऑब्जेक्ट से विरासत में नहीं मिला जा सकता है (यहां तक कि वर्चुअल इनहेरिटेंस ने भी मदद नहीं की)। इस समस्या से कैसे निजात पाएं [5]: लिंक में दिखाया गया है। इस प्रकार, IView QObject से विरासत में नहीं मिला है और केवल सार्वजनिक खंड में संकेतों को पूरी तरह से आभासी (सार) के रूप में घोषित करता है। यह काफी तार्किक है, क्योंकि सिग्नल भी एक फ़ंक्शन है जिसे कॉल करके पर्यवेक्षकों को उनके स्लॉट्स के माध्यम से सूचित किया जाता है (ऑब्जर्वर पैटर्न देखें)।
- प्रस्तुतकर्ता वर्ग में IVIV संकेतों को बाइंड करते समय एक और समस्या उत्पन्न हुई। तथ्य यह है कि प्रस्तुतकर्ता में IView का लिंक शामिल है (एक विशिष्ट दृश्य रन टाइम में प्रस्तुतकर्ता में जोड़ा जाता है, लेकिन IView के रूप में संग्रहीत - बहुरूपता का उपयोग किया जाता है)। लेकिन संकेतों और स्लॉट्स को जोड़ने के लिए, स्थिर
QObject::connect()
विधि का उपयोग किया जाता है, जो केवल QObject वंशज को ऑब्जेक्ट के रूप में स्वीकार करता है, और IView नहीं है। लेकिन हम जानते हैं कि हमारा कोई भी दृश्य यह होगा। इसलिए समस्या को गतिशील प्रकार के रूपांतरण द्वारा हल किया जाता है, जैसा कि [6] में दिखाया गया है:
QObject * view_obj = dynamic_cast < QObject *>( m_view ); // m_view - IView
QObject :: connect ( view_obj , SIGNAL ( okActionTriggered ()),
this , SLOT ( processOkAction ()));
यह भी ध्यान देने योग्य है कि IVIV को लागू करते समय, केवल हेडर (.h) फ़ाइल की आवश्यकता होती है। यदि आईवीक्यू के लिए एक .cpp फ़ाइल बनाई जाती है, तो उसे हटा दिया जाना चाहिए, अन्यथा संकलन समस्याएं हो सकती हैं।
सिद्धांत रूप में, यह जानकारी Qt में स्वतंत्र रूप से एमवीपी को लागू करने के लिए पर्याप्त है, लेकिन मैं एक साधारण उदाहरण (केवल एमवीपी कार्यान्वयन, एक वास्तविक अनुप्रयोग के संदर्भ में बातचीत पर विचार किए बिना) दूंगा।
Qt में MVP का उपयोग करने का एक सरल उदाहरण
पुरालेख में 3 उदाहरण हैं, यह एक ही अनुप्रयोग है, लेकिन प्रत्येक उदाहरण में परिवर्धन के साथ।
- एमवीपी कार्यान्वयन
- कई विचारों को बनाने की क्षमता जोड़ा गया
- जब डेटा बदलता है तो विचारों के बीच पूर्ण सिंक्रनाइज़ेशन
सभी कोड Doxygen शैली में टिप्पणी की गई है, अर्थात आप Doxywizard का उपयोग करके आसानी से प्रलेखन उत्पन्न कर सकते हैं।
यहाँ उदाहरण डाउनलोड
करेंदायरे से बाहर
इस विषय पर दिलचस्प सवालों की एक सूची है जो लेख में शामिल नहीं थे:
- परिणामी प्रणाली के मॉड्यूल का परीक्षण
- MVP के संदर्भ में पुस्तकालयों के रूप में (QtPlugin का उपयोग करके) का कार्यान्वयन
- MVP के संदर्भ में QtDeclarative (QML) का उपयोग करके दृश्य का कार्यान्वयन
- एक वर्ग कारखाने के माध्यम से प्रस्तुतकर्ता को विचार पारित करना (ताकि आप आसानी से शैलियों को बदल सकें)
इन मुद्दों पर कोई भी जानकारी टिप्पणियों में स्वागत योग्य है।
सूत्रों का कहना है
- http://www.rsdn.ru/article/patterns/generic-mvc2.xml
- http://en.wikipedia.org/wiki/Model-view-presenter
- http://www.rsdn.ru/article/patterns/ModelViewPresenter.xml
- http://thesmithfam.org/blog/2009/09/27/model-view-presenter-and-qt/
- http://doc.trolltech.com/qq/qq15-academic.html
- http://developer.qt.nokia.com/forums/viewthread/284