क्यूटी मॉडल / दृश्य शब्दावली का दुरुपयोग क्यों कर रहा है?


104

मुझे लगता है कि मॉडल / दृश्य नियंत्रण के साथ Qt में प्रयुक्त शब्दावली त्रुटिपूर्ण है। पर उनके स्पष्टीकरण पेज वे राज्य है कि वे देखें और नियंत्रक विलय और वे निम्न चित्र दे रहे हैं द्वारा एमवी को MVC सरलीकृत:

Qt MVC की व्याख्या करते हुए चित्र

हालाँकि मुझे लगता है, उन्होंने वस्तुओं की भूमिकाओं को गलत बताया और मुझे लगता है कि,

  1. जिसे वे मर्ज किए गए नियंत्रक के साथ दृश्य कहते हैं, वह वास्तव में केवल एक दृश्य है।
  2. जिसे वे मॉडल कहते हैं, वह वास्तव में नियंत्रक है।
  3. यदि आप वास्तव में एक मॉडल रखना चाहते हैं तो यह कहीं ऐसा होगा जहां उनका "डेटा" है।

मैं सामान्य और समझदार तरीके से बोल रहा हूं कि आप अपने ऐप में Qt मॉडल / व्यू कंपोनेंट का उपयोग करेंगे। ये कारण हैं:

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

क्या उनकी शब्दावली में क्यूटी गलत है, या यह सिर्फ मुझे है जो समझ नहीं आता है? (BTW: इसका कारण यह नहीं है कि यह अकादमिक प्रश्न नहीं है कि मैंने अपने नामकरण के बाद अपनी परियोजना को कोड करना शुरू कर दिया है और मुझे जल्द ही पता चला है, कि कोड स्पष्ट रूप से सही नहीं है। इसके बाद ही मुझे एहसास हुआ कि मुझे चाहिए। मॉडल लॉजिक लगाने की कोशिश न करें जिसे वे मॉडल कहते हैं)


1
MFC ने CDP और CView के साथ 2part मॉडल / व्यू गाइस के लिए मानक निर्धारित किया है - कोई कारण नहीं है कि एक विशेष MVC 'सही' है
मार्टिन बेकेट

@ मर्टिन बी: ​​मेरे पास एमएफसी पर एक नज़र होगी, हालांकि यहां तक ​​कि अगर अलग-अलग एमवीसी मॉडल हैं, तो मुझे लगता है कि उन्हें अपनी शब्दावली में सुसंगत होना चाहिए और मुझे लगता है कि मैंने मान्य तर्क प्रस्तुत किए हैं, क्यों इस्तेमाल की गई शब्दावली इस विशेष मामले में सुसंगत नहीं है। वे केवल यह कहते हैं कि उन्होंने व्यू और कंट्रोलर को मिला दिया है, लेकिन मुझे लगता है कि यह मामले में सिर्फ भ्रामक है। मुझे नहीं लगता कि कोई एमवीसी मॉडल है जहां सभी एप्लिकेशन विशिष्ट तर्क हो यह प्रस्तुति हो या मॉडल लॉजिक को मॉडल नामक एक ऑब्जेक्ट में डालना होगा।
गोर

1
@ मर्टिन बी: ​​क्यूटी शब्दावली के तहत सभी मॉडलों में आम एपीआई है जिसका मॉडल संरचना से कोई लेना-देना नहीं है, लेकिन सामान्य नियंत्रक संरचना के साथ सब कुछ करना है, जो स्पष्ट रूप से संकेत है कि इसे मॉडल कहना सही नहीं है। मैं यह नहीं कह रहा हूं कि एक सही MVC मॉडल है, लेकिन इसका मतलब यह नहीं है कि कुछ भी MVC मॉडल कहा जा सकता है। हो सकता है कि यह MFC में भी त्रुटिपूर्ण हो और मुझे इस पर एक नज़र हो सकती है, लेकिन मुझे Qt में यह दिलचस्पी है कि यह सही है, वह MFC जिसका उपयोग करने का मेरा कोई इरादा नहीं है। क्या आपके पास कोई अच्छा लिंक है जहां MFC मॉडल / व्यू सेपरेशन समझाया गया है?
Gorn

1
MVC की शब्दावली किसी भी तरह से सर्वसम्मति से सहमत नहीं है, इसलिए आपके प्रश्न को तर्कपूर्ण माना जा सकता है। हालांकि मार्टिन फाउलर ( martinfowler.com/eaaDev/index.html ) द्वारा किए गए उत्कृष्ट कार्यों से कई सहमत होंगे । आमतौर पर, नियंत्रक उपयोगकर्ता इनपुट को संभालता है और इस अर्थ में, Qt विजेट्स निश्चित रूप से दृश्य और नियंत्रक को जोड़ती है।
अर्नोल्ड स्पेंस

1
मैं समझता हूं कि एमवीसी के कई स्वाद हैं लेकिन इसका मतलब यह नहीं है कि एमवीसी कुछ भी हो सकता है। क्यूटी ने लाइन पार कर ली है और मैंने कई कारण दिए हैं। मार्टिन फाउलर MVC के विभिन्न प्रकारों की व्याख्या करते हैं, लेकिन उनमें से कोई भी ऐसा नहीं है जो Qt MVC का उच्चारण करता है। सबसे समान है martinfowler.com/eaaDev/PresentationModel.html , लेकिन प्रस्तुति मॉडल = नियंत्रक (उपयोगकर्ता सहभागिता) भाग और मॉडल (डेटा तर्क) के बीच यह अंतर करता है। इसलिए हालांकि एमवीसी की कोई सटीक परिभाषा नहीं है, क्यूटी उनमें से किसी का भी पालन नहीं करता है। यदि आप मुझे ऐसी परिभाषा के लिए लिंक दे सकते हैं, तो कृपया ऐसा करें।
Gorn

जवाबों:


78

मैं आपसे सहमत हूं कि क्यूटी का नामकरण भ्रामक है। मेरी राय में, हालांकि समस्या Qt की अकेली नहीं है, लेकिन उन सभी रूपरेखाओं द्वारा साझा की गई है, जो हमें हमारे UI को लागू करते समय चिंताओं के पृथक्करण के सिद्धांत का पालन करने की अनुमति देती हैं । जब कोई ऐसे ढांचे के साथ आता है, और "चीजों" को अलग रखने का एक अच्छा तरीका ढूंढता है, तो वे हमेशा मॉड्यूल के लिए बाध्य महसूस करते हैं कि वे "मॉडल" कहते हैं और अन्य जो उन्हें "व्यू" कहते हैं। वर्षों से मैंने इन चौखटों के साथ काम किया है:

  • MFC
  • क्यूटी
  • झूला
  • SWT
  • MVVM के साथ WPF

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

के बाद से वहाँ बहुत से अलग विचारों को क्या कर रहे हैं एक MVC पैटर्न, की तरह लग सकता है, जो सही है? मेरी राय में, जिन लोगों ने एमवीसी का आविष्कार किया था, उन्हें बदल दिया जाना चाहिए जब हम जानना चाहते हैं कि इसे "सही ढंग से" कैसे लागू किया जाना चाहिए। में मूल smalltalk कागज यह कहते हैं:

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

इसके प्रकाश में मैं इस प्रकार आपकी तीन मुख्य चिंताओं का उत्तर दूंगा:

  1. वास्तव में एक क्यूटी घटक "ग्राफिकल [...] आउटपुट" का प्रबंधन करता है, और "माउस और कीबोर्ड इनपुट की व्याख्या करता है", इसलिए इसे ऊपर की परिभाषा के संबंध में वास्तव में मर्ज किया गया व्यू और कंट्रोलर कहा जा सकता है।
  2. मैं मानता हूं कि आप कंट्रोलर और मॉडल (फिर से परिभाषा के संबंध में) को मर्ज करने के लिए मजबूर होंगे।
  3. मैं सहमत हूं, फिर से। मॉडल को केवल एप्लिकेशन डोमेन के डेटा का प्रबंधन करना चाहिए । इसे वे "डेटा" कहते हैं। स्पष्ट रूप से, उदाहरण के लिए पंक्तियों और स्तंभों के साथ काम करने का हमारे अनुप्रयोगों के डोमेन से कोई लेना-देना नहीं है।

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


2
मैं कहूंगा कि प्रतिनिधि Qt का नियंत्रक है, चूंकि प्रतिनिधि मॉडल को इनपुट प्राप्त करते हैं और भेजते हैं, जो संकेतों के माध्यम से दृश्य को अपडेट करता है।
Peregring-lk

82

संक्षिप्त जवाब

Qt का MVC केवल एक डेटा संरचना पर लागू होता है । एमवीसी एप्लिकेशन के बारे में बात करते समय आपको इसके बारे में QAbstractItemModelया नहीं सोचना चाहिए QListView

यदि आप अपने पूरे प्रोग्राम के लिए MVC आर्किटेक्चर चाहते हैं, तो Qt ने ऐसा "विशाल" मॉडल / व्यू फ्रेमवर्क नहीं बनाया है। लेकिन अपने कार्यक्रम में डेटा की प्रत्येक सूची / पेड़ के लिए आप Qt MVC दृष्टिकोण का उपयोग कर सकते हैं जो वास्तव में इसके दृश्य के भीतर एक नियंत्रक हैडेटा के भीतर या मॉडल के बाहर है; यह इस बात पर निर्भर करता है कि आप किस प्रकार के मॉडल का उपयोग कर रहे हैं (स्वयं का मॉडल उपवर्ग: संभवतः मॉडल के भीतर; उदाहरण के लिए QSqlTableModel: बाहर (लेकिन शायद मॉडल के भीतर कैश किया गया)। अपने मॉडल और विचारों को एक साथ रखने के लिए, स्वयं की कक्षाओं का उपयोग करें जो तब व्यावसायिक तर्क को लागू करते हैं


लंबा जवाब

Qt का मॉडल / दृष्टिकोण और शब्दावली:

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

Qt के मॉडल वास्तव में अंतर्निहित डेटा वाले मॉडल हैं। पाठ्यक्रम के सार मॉडल डेटा नहीं रखते हैं, क्योंकि क्यूटी को नहीं पता है कि आप उन्हें कैसे स्टोर करना चाहते हैं। लेकिन आप अपने डेटा कंटेनरों को उपवर्ग में जोड़कर और मॉडल इंटरफ़ेस को अपने डेटा तक पहुंच बनाकर अपनी आवश्यकताओं के लिए QAbstractItemModel का विस्तार करते हैं। तो वास्तव में, और मुझे लगता है कि आप इसे पसंद नहीं करते हैं, समस्या यह है कि आपको मॉडल को प्रोग्राम करने की आवश्यकता है, इसलिए डेटा को आपके डेटा संरचना में कैसे एक्सेस और संशोधित किया जाता है।

एमवीसी शब्दावली में, मॉडल में डेटा और तर्क दोनों शामिल हैं । Qt में, यह आपके ऊपर है कि आप अपने व्यवसाय के कुछ तर्क अपने मॉडल के अंदर शामिल करते हैं या बाहर रख देते हैं, अपने आप में एक "दृश्य" है। यह भी स्पष्ट नहीं है कि तर्क से क्या मतलब है: चयन करना, नाम बदलना और चारों ओर घूमना? => पहले से ही लागू। उनके साथ गणना कर रहे हैं? => इसे मॉडल उपवर्ग के बाहर या अंदर रखें। एक फ़ाइल से / से डेटा संग्रहीत या लोड करना? => इसे मॉडल उपवर्ग के अंदर रखें।


मेरी निजी राय:

एक प्रोग्रामर को एक अच्छा और सामान्य एमवी (सी) सिस्टम प्रदान करना बहुत मुश्किल है । क्योंकि ज्यादातर मामलों में मॉडल सरल होते हैं (जैसे केवल स्ट्रिंग सूची) क्यूटी भी एक तैयार-से-उपयोग QStringListModel प्रदान करता है। लेकिन अगर आपका डेटा स्ट्रिंग्स की तुलना में अधिक जटिल है, तो यह आपके ऊपर है कि आप Qt मॉडल / व्यू इंटरफ़ेस के माध्यम से डेटा का प्रतिनिधित्व कैसे करना चाहते हैं। यदि आपके पास, उदाहरण के लिए, 3 फ़ील्ड वाली संरचना (नाम, आयु और लिंग वाले व्यक्ति कहते हैं) तो आप 3 फ़ील्ड को 3 अलग-अलग कॉलम या 3 अलग-अलग भूमिकाओं के लिए असाइन कर सकते हैं। मुझे दोनों दृष्टिकोण पसंद नहीं हैं।

मुझे लगता है कि Qt का मॉडल / व्यू फ्रेमवर्क केवल तभी उपयोगी है जब आप सरल डेटा संरचनाओं को प्रदर्शित करना चाहते हैं । अगर डेटा कस्टम प्रकार का है या संरचित नहीं है, तो इसे संभालना मुश्किल हो जाता है, न कि किसी पेड़ या सूची में (उदाहरण के लिए ग्राफ)। ज्यादातर मामलों में, सूचियां पर्याप्त हैं और यहां तक ​​कि कुछ मामलों में, एक मॉडल को केवल एक ही प्रविष्टि रखना चाहिए। खासकर यदि आप एक एकल प्रविष्टि को अलग-अलग विशेषताओं (एक वर्ग का एक उदाहरण) के मॉडल के लिए चाहते हैं, तो क्यूटी के मॉडल / दृश्य रूपरेखा उपयोगकर्ता इंटरफ़ेस से तर्क को अलग करने का सही तरीका नहीं है।

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


मैंने (बड़े) एप्लिकेशन के भीतर Qt मॉडल / दृश्य का उपयोग कैसे किया?

मैंने एक बार (एक टीम में) एक एप्लिकेशन लिखा था जो डेटा का प्रबंधन करने के लिए कई क्यूटी मॉडल का उपयोग करता है। हमने DataRoleवास्तविक डेटा को रखने के लिए एक बनाने का फैसला किया जो प्रत्येक अलग-अलग मॉडल उपवर्ग के लिए एक अलग कस्टम प्रकार का था। हमने एक बाहरी मॉडल वर्ग बनाया, जिसे Modelसभी अलग-अलग क्यूटी मॉडल कहा जाता है । हमने एक बाहरी दृश्य वर्ग भी बनाया है, जिसे Viewविंडोज़ (विगेट्स) कहा जाता है , जो मॉडल से जुड़े होते हैं Model। तो यह दृष्टिकोण एक विस्तारित Qt MVC है, जो हमारी अपनी आवश्यकताओं के लिए अनुकूल है। दोनों Modelऔर Viewवर्गों को स्वयं Qt MVC से कोई लेना देना नहीं है।

हमने तर्क कहाँ रखा ? हमने ऐसी कक्षाएं बनाईं, जिन्होंने स्रोत मॉडल (जब वे बदले) से डेटा पढ़कर और लक्ष्य मॉडल में परिणाम लिखकर डेटा पर वास्तविक गणना की। क्यूटी के दृष्टिकोण से, यह तर्क कक्षाएं दृश्य होंगी, क्योंकि वे मॉडल से "कनेक्ट" करते हैं (उपयोगकर्ता के लिए "दृश्य" नहीं, लेकिन एप्लिकेशन के व्यावसायिक तर्क भाग के लिए एक "दृश्य")।

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


सबसे अधिक परेशान करने वाली बात यह है, कि आपको अपने मनचाहे दृश्य के आधार पर पूरी तरह से अलग-अलग क्यूटी मॉडल कक्षाएं लागू करनी होंगी। सूची दृश्य के लिए एक मॉडल ठीक से एक पेड़ के दृश्य का समर्थन नहीं करेगा और इसके विपरीत। एक विहित MVC मॉडल विभिन्न दृश्य प्रकारों के ढेर का समर्थन कर सकता है।
स्मरलिन

3
@ शेमलिन: मुझे नहीं लगता कि यह सही है। QListView और QTreeView दोनों को केवल QAbstractItemView इंटरफ़ेस की आवश्यकता होती है, जिसका अर्थ है कि कस्टम उपवर्ग, या QStandardItemModel जैसा एक ठोस वर्ग दोनों के लिए उस आवश्यकता को पूर्ण करना चाहिए। आप एक पेड़ चला सकते हैं और एक मॉडल को सूचीबद्ध कर सकते हैं।
जेडी

1
@ जेडी: ऐसे मामले हैं जहां आपका डेटा दोनों, एक सूची और एक पेड़ है ... जैसे आप अपनी फाइल सिस्टम को एक पेड़ के रूप में, या सभी फाइलों को एक सूची के रूप में प्रदर्शित करना पसंद कर सकते हैं। Qts मॉडल ठीक से अनुमति नहीं देते हैं। ट्री व्यू का समर्थन करने वाली QAbstractItemModel का एक कार्यान्वयन, सूची के रूप में आपकी रूट निर्देशिका में सभी फ़ाइलों / निर्देशिकाओं को प्रदर्शित करने की अनुमति देता है, लेकिन आप सभी फ़ाइलों को सूची के रूप में प्रदर्शित नहीं कर सकते। और यह मत कहो कि पेड़ डेटा को एक सूची के रूप में प्रदर्शित करना उपयोगी नहीं हो सकता। उदाहरण के लिए, आप उदाहरण के लिए उन्हें आसानी से सॉर्ट करने के लिए फाइल को खोजने के लिए उन्हें क्रमबद्ध कर सकते हैं यदि आप अपनी फ़ाइलों को एक सूची के रूप में प्रदर्शित करते हैं, तो पेड़ के विचार इसकी अनुमति नहीं देंगे।
स्मरलिन

1
उस ने कहा, प्रॉक्सी मॉडल आपके विचार का कुछ और है (क्योंकि यह संशोधित करता है कि डेटा कैसे देखा जाता है ) और इस प्रकार आपके विचार से संबंधित होना चाहिए। यदि आप मेरे लंबे उत्तर को पढ़ते हैं: "बड़े" Viewवर्ग में आपको प्रॉक्सी मॉडल को जोड़ना चाहिए, जिसमें ट्री मॉडल अपने अंतर्निहित मॉडल के रूप में है और इसका उपयोग आपकी फाइल सिस्टम सूची दृश्य द्वारा किया जाता है। जैसा कि आप कह रहे हैं: एक ही डेटा के लिए दो मॉडल नहीं होने चाहिए। कभी नहीँ! (लेकिन प्रॉक्सी मॉडल अलग-अलग मॉडल के रूप में गिनती नहीं है।)
leemes

1
@SamPinkus ऐसा इसलिए है क्योंकि इस सवाल पर कोई स्पष्ट हाँ या नहीं है। इसके अलावा, विभिन्न कार्यान्वयन हैं QAbstractItemModel, जिनमें से कुछ एमवीसी के अर्थ में मॉडल हैं और उनमें से कुछ नहीं हैं।
लेमिस

12

शब्दावली सही या गलत नहीं है, यह उपयोगी या बेकार है।

आप प्रश्न को थोड़ा बदल सकते हैं और पूछ सकते हैं कि क्यूटी अधिक एमवीसी-अनुकूल क्यों नहीं है। इसका उत्तर यह है कि प्रारंभिक क्यूटी डेवलपर्स का मानना ​​है कि जीयूआई अनुप्रयोगों में सी से डी को अलग करना खराब बनाम सीएसएस दोनों के लिए बनाता है। QWidget की डिज़ाइन पिक्सेल आउटपुट निर्णयों के साथ माउस इनपुट इंटरपरेशन को बाँधने के लिए इसे सरल बनाने की कोशिश करती है, और आप देख सकते हैं कि यह MVC की ओर सड़क नहीं है।


मैं आपकी बात देखता हूं और मूल रूप से I WOULD से पूछते हैं कि Qt अधिक MVC अनुकूल क्यों नहीं है, लेकिन यह करना बहुत कठिन है जब Qt प्रलेखन में MVC शब्दावली का उपयोग किया जाता है, जो MVC सामान्य रूप से उपयोग किया जाता है (जैसा कि मैंने प्रश्न में समझाया गया है) से अलग है। और जब व्यापक रूप से शब्दावली का उपयोग किया जाता है और कोई इसे दुनिया के बाकी हिस्सों से बहुत अलग तरीके से उपयोग करता है, तो मुझे लगता है कि यह न केवल बेकार है, बल्कि यह स्पष्ट है कि यह गलत है और भ्रामक है (इस भ्रम ने मुझे पहले सवाल पूछने के लिए प्रेरित किया। जगह)। मुझे बहुत दिलचस्पी होगी अगर आपके पास इन बातों के लिए कोई लिंक है जिस पर चर्चा की जाए या कहीं समझाया जाए। धन्यवाद
Gorn

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

क्या आपके पास कोई अंतर्दृष्टि है कि Qt में MVC शब्दावली पर कैसे सहमति हुई है। क्या यह कोड लिखने के दौरान, या केवल बाद में प्रलेखन प्रक्रिया के दौरान उपयोग किया गया था।
गोर

हमने ट्रोलटेक में अपने समय के दौरान क्यूटी प्रलेखन में "एमवीसी" शब्द का उपयोग नहीं किया। सामान्य तौर पर मुझे लगता है कि यह सबसे अच्छा है कि वहां क्या है, क्या नहीं है, इसके बारे में नहीं लिखें। हालाँकि, गोरक्षक पर आप यह पता लगा सकते हैं कि किसने उस पाठ को जोड़ा और उस व्यक्ति को सीधे जोड़ा।
arnt

1
एक अलग टिप्पणी। हमने क्यूटी (जब ट्रॉलेक एक तीन-व्यक्ति कंपनी थी) के डिजाइन और शुरुआती कार्यान्वयन वाक्यांश के दौरान एमवीसी पर चर्चा की, और हमने एक जीयूआई टूलकिट का मूल्यांकन किया जिसने एमवीसी का "ठीक से" उपयोग किया, मुझे इसका नाम याद नहीं है। हमारी राय यह थी कि टूलकिट का उपयोग करने के लिए भयानक था, और यह कि एमवीसी उस के लिए बहुत कारण था।
ARNT

3

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


2

मेरा मानना ​​है कि उनकी शब्दावली सही है ... हालाँकि वास्तविक अनुप्रयोगों में मुझे लगता है कि आपके स्तर के आधार पर मॉडल, दृश्य और नियंत्रक के बीच की रेखाओं को धुंधला करना बहुत आसान हो सकता है: एक स्तर का दृश्य उच्च स्तर का मॉडल हो सकता है।

मुझे लगता है कि उनके QAbstractModelItem वर्ग से भ्रम पैदा होता है। यह वर्ग एक मॉडल आइटम नहीं है, बल्कि यह एक मॉडल के लिए एक इंटरफ़ेस है। मॉडल के साथ अपने व्यू क्लासेस का इंटरफ़ेस बनाने के लिए, उन्हें मॉडल में एक जेनेरिक एब्स्ट्रैक्ट इंटरफ़ेस बनाना था। हालांकि, एक मॉडल एकल आइटम, वस्तुओं की सूची, 2 या अधिक वस्तुओं के आयाम, आदि की तालिका हो सकती है; इसलिए उनके इंटरफ़ेस को इन सभी मॉडल विविधताओं का समर्थन करना होगा। जाहिर है, यह मॉडल आइटम को काफी जटिल बनाता है, और वास्तविक मॉडल के साथ काम करने के लिए गोंद कोड मेटाफ़र को थोड़ा बढ़ाता है।


पहले से ही मैं सहमत हूँ कि आप QAbraphModelItem वर्ग के साथ सहमत हैं, मुझे भी लगता है कि इस जटिलता के बिना भी उनके MVC का नाम गलत है। क्या आप बता सकते हैं कि आपको क्यों लगता है कि उनकी शब्दावली सही है। मुझे यह सुनना अच्छा लगेगा कि मैं अपने तीन तर्कों में से किसी में भी क्यों सही नहीं हूँ।
'22:07

0

मुझे लगता है कि ... जिसे वे मॉडल कहते हैं वह वास्तव में नियंत्रक है।

नहीं, उनका "मॉडल 'निश्चित रूप से नियंत्रक नहीं है।

नियंत्रक उपयोगकर्ता दृश्य नियंत्रण का एक हिस्सा है जो मॉडल को संशोधित करता है (और इसलिए अप्रत्यक्ष रूप से दृश्य को संशोधित करता है)। उदाहरण के लिए, एक "हटाएं" बटन नियंत्रक का हिस्सा है।

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

चूंकि MVC का आविष्कार किया गया था, इसलिए नियंत्रक और दृश्य के बीच का अंतर तेजी से तनावपूर्ण हो गया है। एक टेक्स्ट बॉक्स के बारे में सोचें: यह दोनों आपको कुछ पाठ दिखाता है और आपको इसे संपादित करने देता है, तो क्या यह दृश्य या नियंत्रक है? इसका उत्तर यह है कि यह दोनों का हिस्सा है। जब आप 1960 के दशक में एक टेलेटाइप पर काम कर रहे थे तब भेद स्पष्ट था - के बारे में सोचोed - लेकिन इसका मतलब यह नहीं है कि उपयोगकर्ता के लिए चीजें वापस बेहतर थीं!

यह सच है कि उनका QAbstractItemModel सामान्य रूप से एक मॉडल की तुलना में उच्च स्तर का होगा। उदाहरण के लिए, इसमें आइटम्स का बैकग्राउंड कलर (तकनीकी रूप से ब्रश) हो सकता है, जो कि एक निश्चित रूप से दृश्य-ईश विशेषता है! तो एक तर्क है कि QAbstractItemModel एक दृश्य की तरह है और आपका डेटा मॉडल है। सच्चाई यह है कि यह दृश्य और मॉडल के क्लासिक अर्थों के बीच कहीं है। लेकिन मैं नहीं देख सकता कि यह कैसे एक नियंत्रक है; अगर कुछ भी है जो qt विजेट का उपयोग करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.