निर्भरता इंजेक्शन के साथ यूआई में इंटरफेस की एक पागल राशि से कैसे बचें?


8

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

एक यूआई माता-पिता की निर्भरता जहां मूल रूप से उसके सभी बच्चों को मिलाया जाता है, इसलिए आगे पदानुक्रम एक यूआई तत्व था, और अधिक फूला हुआ इसका निर्माता था।

यूआई पदानुक्रम के शीर्ष पर सभी तरह एक आवेदन वर्ग था, जिसमें वर्तमान चयन के बारे में जानकारी और एक 3 डी मॉडल का संदर्भ था जो परिवर्तनों को प्रतिबिंबित करने की आवश्यकता है। अनुप्रयोग वर्ग 8 इंटरफेस लागू कर रहा था, और यह केवल आने वाले उत्पादों (/ इंटरफेस) का पांचवा हिस्सा था!

मैं वर्तमान में एक सिंगलटन के साथ वर्तमान चयन और यूआई तत्वों को स्वयं को अपडेट करने के लिए एक फ़ंक्शन रखने के साथ काम करता हूं। यह फ़ंक्शन UI पेड़ और UI तत्वों को नीचे गिरा देता है, फिर आवश्यकतानुसार वर्तमान चयन सिंगलटन का उपयोग करता है। कोड मुझे इस तरह से साफ लगता है।

प्रश्न
क्या इस परियोजना के लिए एक सिंगलटन शायद उपयुक्त है?
यदि नहीं, तो क्या मेरी सोच और / या DI के कार्यान्वयन में कोई मूलभूत दोष है जो इसे इतना बोझिल बनाता है?

के बारे में परियोजना अतिरिक्त जानकारी
अपार्टमेंट के लिए खरीदारी की टोकरी, साथ घंटियाँ और सीटी: प्रकार
आकार: कोड और यूआई के लिए 2 मानव महीने
रखरखाव: कोई अद्यतन चल रहा है, लेकिन शायद "संस्करण 2.0" बाद में
पर्यावरण: सी एकता में # का उपयोग करना है, जो एक इकाई का उपयोग करता है घटक प्रणाली

लगभग सभी मामलों में, उपयोगकर्ता इंटरैक्शन कई क्रियाओं को ट्रिगर करता है। उदाहरण के लिए, जब उपयोगकर्ता किसी आइटम का चयन करता है

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

डि केवल इंटरफेस का उपयोग करने के बारे में नहीं है, यह कंसट्रक्शन को स्वैप करने की क्षमता है जो विशेष रूप से यूनिट टेस्टिंग क्षेत्र में उपयोगी है ...
रॉबी डी

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

@RobbieDee हाँ, DI अधिक है, लेकिन मैं ऐसी स्थिति नहीं देख सकता जहाँ इंटरफ़ेस का उपयोग करना DI नहीं है। और अगर एक सिंगलटन पसंदीदा समाधान नहीं है - जिसे मैं भी मानता हूं - तो पसंदीदा समाधान इतना गड़बड़ क्यों है? यह मेरा मुख्य प्रश्न है, लेकिन मैं इसे खुला रखना चाहता था, क्योंकि कभी-कभी सामान्य नियम लागू नहीं होता है।
आर। शमित्ज़

इंटरफ़ेस-कंसट्रक्शन व्यवस्था भी मॉकिंग फ्रेमवर्क की एक विशेषता है। वे कुछ दशकों तक OO भाषाओं में भी रहे हैं ...
रॉबी डी

मुझे आपकी बात नहीं आती।
आर। शमित्ज़

जवाबों:


4

मुझे लगता है कि सवाल एक लक्षण है, समाधान नहीं।

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

एक समस्या की तलाश में एक समाधान; यह और गलतफहमी यह शायद आपके डिजाइन को खराब कर रही है। क्या आपने डीआई बनाम सिंगलटन, विभिन्न अवधारणाओं के बारे में यह एसओ प्रश्न पढ़ा है या नहीं? मैंने पढ़ा कि केवल एक सिंगलटन को लपेटने से, ताकि क्लाइंट को एक सिंगलटन से निपटना न पड़े। It.is.just.good.old.encapsulation। मुझे लगता है कि यह हाजिर है।


आगे पदानुक्रम एक यूआई तत्व था, और अधिक फूला हुआ इसका निर्माता था।

पहले छोटे बिट्स का निर्माण करें फिर उन्हें उस चीज के कंस्ट्रक्टर में पास करें जो वे संबंधित हैं और उस बड़ी चीज को अगले बड़े बीजों के कंस्ट्रक्टर में पास करते हैं ...

यदि आपको जटिल निर्माण मुद्दे मिले हैं, तो कारखाने या बिल्डर पैटर्न का उपयोग करें। नीचे की रेखा यह है कि अन्य कक्षाओं को साफ-सुथरा, साफ-सुथरा रखने के लिए जटिल निर्माण को अपनी कक्षा में खींच लिया जाता है।


अनुप्रयोग वर्ग 8 इंटरफेस लागू कर रहा था, और यह केवल आने वाले उत्पादों (/ इंटरफेस) का पांचवा हिस्सा था!

यह विस्तार-क्षमता की अनुपस्थिति जैसा लगता है। कोर डिजाइन गायब है और ऊपर से सब कुछ चरमरा रहा है। निर्माण, रचना और विरासत में अधिक नीचे होना चाहिए।

मुझे आश्चर्य है कि अगर आपका डिज़ाइन "शीर्ष भारी है।" लगता है जैसे हम एक वर्ग को सब कुछ या कुछ भी बनाने की कोशिश कर रहे हैं जो यह हो सकता है। और तथ्य यह है कि यह एक यूआई वर्ग है, न कि एक व्यावसायिक डोमेन वर्ग, जो वास्तव में मुझे चिंताओं को अलग करने के बारे में आश्चर्यचकित करता है।

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


... 3 डी मॉडल जो परिवर्तनों को प्रतिबिंबित करने की आवश्यकता है।

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

विज़िटर पैटर्न के बारे में पढ़ें। यह विभिन्न प्रकारों के लिए पूरी तरह से कार्यशीलता के पूरे चक होने का विचार है।


डिजाइन और डि

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


अपार्टमेंट शॉपिंग डोमेन मॉडलिंग पर ध्यान दें।

जेसिका सिम्पसन दृष्टिकोण से बचने के लिए डिज़ाइन करें : "मुझे पूरी तरह से पता नहीं है कि इसका क्या मतलब है, लेकिन मुझे यह चाहिए।"

निम्नलिखित गलत हैं:

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

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

बस एक बिंदु, और मैं यहाँ एक मदद पिशाच बनने की कोशिश नहीं कर रहा हूँ, लेकिन यह मूल प्रश्न का एक प्रकार था : सामान्य आम सहमति (और यह वैध कारणों पर आधारित है) लगता है कि आप वास्तव में नहीं चाहिए एक सिंगलटन का उपयोग करें। आप लिखते हैं "'मैं एक एकल का उपयोग करने वाला नहीं हूं' गलत है" - किस स्थिति में एक का उपयोग करना उचित होगा?
आर। शमित्ज़

सब मैं कह रहा हूँ, "यह निर्भर करता है।" बहुत बार मैं मैक्सिमम को काफी शब्दशः देख लेता हूं।
राडारबोब

3

"कक्षा उत्तराधिकार" लाल ध्वज का एक सा है। हाइपोथेटिकल: 5 विगेट्स वाला एक वेब पेज। पृष्ठ किसी भी विजेट का पूर्वज नहीं है। यह उन विजेट्स का संदर्भ रख सकता है। लेकिन यह पूर्वज नहीं है। वर्ग उत्तराधिकार के बजाय, रचना का उपयोग करने पर विचार करें। 5 विगेट्स में से प्रत्येक का निर्माण अन्य विजेट्स या शीर्ष पृष्ठ के संदर्भ के बिना, अपने दम पर किया जा सकता है। फिर शीर्ष पृष्ठ का निर्माण एक मूल पृष्ठ बनाने के लिए पर्याप्त जानकारी के साथ किया जाता है और विजेट ऑब्जेक्ट्स (संग्रह) को लेआउट किया जाता है जो इसके पास होते हैं। पृष्ठ लेआउट आदि के लिए ज़िम्मेदार है, लेकिन विजेट के निर्माण और तर्क के लिए नहीं।

एक बार जब आप रचना का उपयोग करते हैं, तो DI आपका सबसे अच्छा दोस्त है। DI आपको DI में जो भी संस्करण या विजेट प्रकार परिभाषित करता है, उसके लिए प्रत्येक विजेट को स्वैप करने की अनुमति देता है। विगेट्स का निर्माण DI में कैप्चर किया गया है और शीर्ष पृष्ठ से अलग है। शायद यहां तक ​​कि संग्रह की रचना को आपके DI में परिभाषित किया जा सकता है। शीर्ष पृष्ठ उस पर दिए गए विगेट्स के आधार पर लेआउट निष्पादित करता है, जैसा कि इसे करना चाहिए। शीर्ष पृष्ठ निर्माणकर्ता को कोई बदलाव की आवश्यकता नहीं है। शीर्ष पृष्ठ को केवल विजेट के लेआउट को प्रदर्शित करने और परिभाषित इंटरफेस के आधार पर विजेट से / पास करने के लिए तर्क की आवश्यकता है।

श्रोताओं को रचना की श्रृंखला से ऊपर और नीचे पारित करने के बजाय, श्रोताओं के एक संग्रह को उन विगेट्स पर इंजेक्ट करें, जिनकी आवश्यकता है। एक प्रकाशक में संग्रह को इंजेक्ट करें ताकि वे संग्रह को प्रकाशित कर सकें। श्रोताओं में संग्रह को इंजेक्ट करें ताकि वे खुद को संग्रह में जोड़ सकें। रचना की श्रृंखला में संग्रह सभी वस्तुओं में कटौती करता है।


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

@ R.Schmitz: ओवरहेड मामला था? क्या यूआई सुस्त था, और क्या आप पर दोष लगाने के लिए डिजाइन किया गया था?
रॉबर्ट हार्वे

@ R.Schmitz क्या आप "बहुत सारे श्रोताओं को पारित करने" पर विस्तार से बता सकते हैं? शायद C # में DI के साथ मेरा अनुभव कम है, लेकिन कुछ मुझे बताता है कि उचित डिजाइन के साथ (कम से कम निर्माणकर्ता में) आवश्यक नहीं होगा।
Katana314

@RobertHarvey कोई प्रदर्शन नुकसान बिल्कुल नहीं, यह केवल पठनीयता के बारे में है।
आर। शमित्ज़

@ Katana314 उदाहरण के लिए, जब कोई आइटम जोड़ा जाता है, तो 3 डीमॉडल को अद्यतन करने की आवश्यकता होती है और यह उत्पाद श्रेणियों में से किसी में नहीं होता है, इसलिए इसे एप्लिकेशन क्लास में संदर्भित किया जाता है, जो आइटम को जोड़ा / हटाया / परिवर्तित होने के लिए सुनता है। अंत में जो हर उत्पाद श्रेणी के लिए बहुत ही समान होगा। अन्य UI भाग भी प्रतिक्रिया करते हैं (और सुनते हैं), लेकिन संदेश को शीर्ष पर यात्रा करने की आवश्यकता होती है क्योंकि यही वह जगह है जहां 3dmodel संदर्भ और वास्तविक डेटा (जो तब अद्यतन भी होता है) है।
आर। शमित्ज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.