2012-07-03 14 views
6

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

फिलहाल मेरे पास यह एक सूचक के रूप में है जो मैं अपने जादूगर के निर्माता को पास करता हूं लेकिन ऐसा लगता है ... सुरुचिपूर्ण और लचीला। मेरे संवाद या जो भी अन्य कक्षाएं मैं तय करने का निर्णय लेता हूं, मेरे एक QNetworkAccessManager तक पहुंचने का उचित तरीका क्या है? मुझे लगता है कि मेरे पास डेटा के किसी भी हिस्से के बारे में एक ही सवाल है जो मुझे सबकुछ तक पहुंचने की ज़रूरत है।

ठीक से सी ++ - डिज़ाइन किया गया समाधान क्या है? सिंगलटन पैटर्न एक विकल्प की तरह लगता है, लेकिन एक बुरा है जैसा कि मैं समझता हूं। मेरे प्रश्न को दिखाने के लिए मेरे यहां कुछ कोड है।

मेरे MainWindow निर्माता और स्लॉट जो मेरे जादूगर का शुभारंभ:

MyMainWindow::MyMainWindow 
{ 
    qnam = new QNetworkAccessManager(); 
} 

... 

MyMainWindow::wizardStarter 
{ 
    mywizard = MyWizard(vari, qnam, this); 
} 

एक QNetworkAccessManager जिसमें मेरे जादूगर निर्माता मैं नेटवर्क अनुरोध कर रहा हूँ और उपयोगकर्ता से डेटा प्राप्त करने के बाद डेटा पार्स करने, और इसलिए जिसमें मैं की जरूरत है :

MyWizard::MyWizard(SomeOtherArgument *vari, QNetworkAccessManager *qnam, QObject *parent) 
{ 
    ... 
    this->ourQnam = qnam; 
    ... 
} 

MyWizard::launchRequest(QUrl newUrl) 
{ 
    ourQnam->get(QNetworkRequest(newUrl)); 
} 
+0

मैं सिंगलटन डिजाइन पैटर्न सलाह देते हैं। आपको लगता है कि यह पैटर्न खराब क्यों है? – hamed

+1

@hamed, सिंगलेट्स कक्षाओं के बीच निर्भरता संबंध छुपाते हैं यदि आप उचित निर्भरता इंजेक्शन का उपयोग नहीं करते हैं। सिंगलटन डिज़ाइन पैटर्न के साथ कुछ भी गलत नहीं है, यह संवाद करने के लिए उचित इंजेक्शन का उपयोग करें कि आपकी कक्षा आपके सिंगलटन पर निर्भर करती है। – Matthew

+0

सिंगलटन के मामले में कोई उचित इंजेक्शन कैसे जोड़ सकता है? – MJBoa

उत्तर

5

अपने प्रश्न से, मुझे लगता है कि आप वास्तव में जो निर्भरता इंजेक्शन अपने निर्भरता (यानी इंजेक्शन लगाने के रूप में पूछ रहे हैं ऑब्जेक्ट्स में QNetworkAccessManager को दबाएं) उपयोग करने के लिए।

अपने मामले में आप निर्माता इंजेक्शन उपयोग कर रहे हैं। यह इंजेक्शन का एक पूरी तरह से ज्ञात और स्वीकार्य रूप है। यह आपके विज़ार्ड क्लास पर दृढ़ता से संचार करता है QNetworkAccessManager पर निर्भर करता है जो लोगों को समझने के लिए आपके कोड को आसान बनाता है। यदि आप विज़ार्ड क्लास कार्यान्वयन के अंदर से एक स्थिर QNetworkAccessManager को पकड़ने के लिए सिंगलटन का उपयोग करना चाहते थे, जबकि इसे कन्स्ट्रक्टर इंजेक्शन को हटाने का लाभ है, तो यह छिपाता है कि आपकी विज़ार्ड क्लास QNetworkAccessManager का उपयोग करती है।

इंजेक्शन की एक और अच्छी तरह से ज्ञात रूप है सेटर इंजेक्शन अर्थात setDelegate(delegate)

पेशेवर रूप से बोल रहा है के रूप में फिर से अपने वर्तमान दृष्टिकोण के साथ कुछ भी गलत नहीं है, यह स्पष्ट रूप से अपनी जादूगर वर्ग QNetworkAccessManager वस्तु पर निर्भर करता है संचार करता है।

यदि आप निर्भरता इंजेक्शन के बारे में अधिक जानने में रुचि रखते हैं तो यहां कुछ पढ़ना है।

Dependency Injection

Dependency Injection in C++

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