मैं एक आवरण में बहुत सारे पास-थ्रू फ़ंक्शन लिखने से कैसे बचूँ?


13

मेरे पास एक वर्ग है, जो एक सामान्य आधार प्रकार के दूसरे वर्ग को लपेटता है। क्योंकि बेस टाइप इंटरफ़ेस काफी बड़ा है, जिसमें बहुत सारे पास-थ्रू फ़ंक्शन लिखना शामिल है। मैं इससे बचने का रास्ता ढूंढ रहा हूं।

आइए एक उदाहरण बनाते हैं:

      Car
     /   \
Volvo     VolvoWithTrailer

अब मुझे VolvoWithTrailer के लिए कार इंटरफ़ेस में प्रत्येक फ़ंक्शन को लागू करना होगा और हो सकता है कि GetMaxSpeed ​​() के अलावा लिपटे वोल्वो ऑब्जेक्ट पर उपयुक्त फ़ंक्शन को कॉल करें जो कुछ कम लौटाएगा। मूल रूप से मेरे कई कार्य होंगे जैसे

int VolvoWithTrailer::GetNumSeats() {
  return mVolvo.GetNumSeats()
}

इसे हल करने का एक स्पष्ट तरीका वोल्वोविथट्राइलर को वोल्वो का उपवर्ग बनाना होगा

    Car
     |
   Volvo
     |
VolvoWithTrailer

लेकिन ऐसा लगता है कि वंशानुक्रम पर रचना का पक्ष लेने के सिद्धांत का उल्लंघन होता है।

मैं उन सभी आवरणों को लिखने से कैसे बच सकता हूं (भाषा C ++ है)? या - यदि वह आपकी स्थिति है - तो मुझे सिर्फ उन्हें क्यों लिखना चाहिए / विरासत का उपयोग करना चाहिए? क्या कोई टेम्पलेट मैजिक है जो इसके साथ मदद कर सकता है?


2
हालांकि यह बहुत अधिक नहीं है, और जावा में सोच रहा है। एक 'ट्रेलर' इंटरफेस के बारे में क्या? VolvoWithTrailer वोल्वो का विस्तार करेगा और ट्रेलर इंटरफ़ेस को लागू करेगा?

7
विरासत पर अनुकूल रचना केवल तभी होती है जब वह ऐसा करने के लिए समझ में आता है।
रॉबर्ट हार्वे

@ रोबर्टहवे: +1। यह एक दिशानिर्देश है, न कि "सिद्धांत" और निश्चित रूप से एक निरपेक्ष आज्ञा नहीं।
मेसन व्हीलर

पायथन में आप इसे आत्मनिरीक्षण (जिसे C # कॉल प्रतिबिंब कहते हैं) से हल कर सकते हैं।
user16764

1
क्या आपका आईडीई कोड पीढ़ी नहीं संभालता है?
एमी ब्लेंकशिप

जवाबों:


5

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

तो सवाल फिर "आप क्या लिखने की जरूरत है?" मुझे नहीं लगता कि आप पर्याप्त जानकारी तो मैं बस कुछ चीजें हैं जो सूचीबद्ध करेंगे, एक निश्चित जवाब देने के लिए सक्षम होने के लिए प्रदान करते हैं मैं एक निर्णय लेने में के बारे में सोचना होगा:

1. क्या आपको ट्रेलर ऑब्जेक्ट को स्वयं, अभी या भविष्य में देखने की आवश्यकता है?
यदि हां, तो आपके पास दोनों कंपोजिट ऑब्जेक्ट्स के आसपास रैपर बनाने के लिए एक बहुत अच्छा तर्क है, क्योंकि आप पहले से ही एक या दूसरे को लपेटने जा रहे हैं। साथ ही सुसंगत हो सकता है।

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

3. समझने में आसान क्या है?
क्या कोई दृष्टिकोण आपके ऊपर कूदता है कि आपके पीछे आने वाला व्यक्ति तुरंत "मिल" जाएगा जो आप करने की कोशिश कर रहे हैं? क्या आपके टीम के साथियों में विशेष रूप से पूर्वाग्रह हैं जो उन्हें बनाए रखने के लिए एक दृष्टिकोण कठिन बना सकते हैं? यदि सभी चीजें समान हैं, तो सबसे कम संज्ञानात्मक भार लगाने वाले समाधान को चुनें।

4. क्या किसी दूसरे पर एक दृष्टिकोण का उपयोग करने के लिए कोई अतिरिक्त लाभ हैं?
एक बात जो मुझ पर उछलती है, वह यह है कि रैपर विचार का एक अलग फायदा है यदि आप इसे लिखते हैं कि आपका CarWithTrailerWrapper किसी भी कार और किसी भी ट्रेलर को CarWithTrailer में लपेट सकता है। फिर, आप अपने सभी पास-थ्रू तरीकों को लिखना बंद कर देते हैं, लेकिन आप प्रत्येक कार क्लास के लिए एक बार के बजाय केवल एक बार उन्हें लिखते हैं ।

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

हो सकता है कि विस्तार विधि का उपयोग करके आपको अलग-अलग फायदे मिलेंगे, लेकिन मैं उन्हें नहीं देखता।

ठीक है, ऐसा लगता है कि मैंने गैर-तुच्छ अनुप्रयोगों के लिए खुद को आगे बढ़ने और पास-थ्रू तरीकों से भरने के लिए बात की है।

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


3

क्योंकि बेस टाइप इंटरफ़ेस काफी बड़ा है, जिसमें बहुत सारे पास-थ्रू फ़ंक्शन लिखना शामिल है।

और आपकी समस्या है।

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


5
ओह क्या? एक वर्ग कई इंटरफेस को लागू कर सकता है, और इंटरफेस एक दूसरे से विरासत में मिल सकते हैं। इसलिए, भले ही एक इंटरफ़ेस काफी छोटा हो, जिसका उस वर्ग से कोई लेना-देना नहीं है या नहीं जो उन्हें लागू करते हैं, उन्हें बहुत सारे कार्यों या पास-फ़ंक्शंस की आवश्यकता होगी। छोटी और अधिक अच्छी तरह से परिभाषित कक्षाएं , अधिक संभावना यह बन जाती है कि आपको पास-थ्रू कार्यों की आवश्यकता होगी
एमी ब्लैंकेनशिप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.