2013-06-07 6 views
10

मुझे एक सी ++ कक्षा मिली है जो 3 डी स्पेस - स्थान, रोटेशन, स्केल इत्यादि में ऑब्जेक्ट के अभिविन्यास का वर्णन करती है। मेरे पास अन्य कक्षाएं हैं जिन्हें जरूरी जानकारी (या इसके सबसेट) की आवश्यकता होती है - मॉडल, इलाके, कैमरे, आदि। अब मैं मेरी ओरिएंटेशन क्लास के उन सबक्लास को बना सकता हूं, लेकिन गुगल ने मुझे विरासत पर रचना पसंद करने के लिए कहा है। यह दार्शनिक रूप से समझ में आता है - एक मॉडल एक अभिविन्यास नहीं है, यह में एक है (और हाँ मुझे पता है कि यह एक चीज है जो केवल एक उदारवादी है)। फिर भी यह अनावश्यक रूप से लगता है, उन सभी के लिए समान रैपर विधियों को फिर से लिखने के लिए लगभग हास्यास्पद रूप से सुरुचिपूर्ण होगा-उप-वर्गों को बस उस कार्यक्षमता पर जाना होगा। model.getOrientation().set_x(1) जैसी चीजें मूर्खतापूर्ण लगती हैं।सी ++ संरचना - क्या मुझे उन सभी कार्यों को लपेटना चाहिए?

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

+3

'model.orientation.set_x (1)' के साथ क्या गलत है? – Lol4t0

+0

@ Lol4t0 यह वर्बोज़ लगता है। इसके अलावा, क्या आप किसी ऑब्जेक्ट को इसे नष्ट किए बिना कुछ करने के लिए कहने में सक्षम नहीं होना चाहिए, तो बोलने के लिए? शायद एक समान डिजाइन पैटर्न उदाहरण मदद करेगा? – GraphicsMuncher

+0

बात यह है कि अभिविन्यास स्थापित करना एक बताने वाली वस्तु नहीं है कि क्या करना है (यदि वस्तु अभिविन्यास नहीं है)। उस! वास्तव में एक समस्या है। आपको ऑब्जेक्ट के लिए ओरिएंटेशन सेट नहीं करना चाहिए, इसके बजाय आपको उन शब्दों से बात करनी चाहिए, जैसे 'राक्षस-> हमला()' या 'कैमरा-> ज़ूम() '। – Lol4t0

उत्तर

6

यह मूर्खतापूर्ण प्रतीत हो सकता है लेकिन आपका model.getOrientation().set_x(1) शायद जाने का तरीका है।

आप getOrientation() भाग लिखने से थक हैं, तो आप कुछ इस तरह की कोशिश कर सकते:

Orientation & orient = model.getOrientation(); 
orient.set_x(1); 
orient.set_y(1); 
if(orient.check_something()) { 
    //whatever 
} 
//etc. 
+0

मैं इस पर झुका रहा हूं। अन्य लोग आपके उत्तर से सहमत हैं। क्या आप विस्तार कर सकते हैं कि यह ऐसा करने का सबसे अच्छा/पसंदीदा तरीका क्यों है? – GraphicsMuncher

+0

1. छोटे या कोई बॉयलरप्लेट 2. सही बनाए रखता है-एक/संबंध है। 3. मूर्खतापूर्ण है: अन्य प्रोग्रामर को भ्रमित नहीं करेगा – zindorsky

3

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

+0

अभिविन्यास वर्ग को विस्तारित करने से अलग कैसे है? – GraphicsMuncher

+1

यह विचारों को और स्पष्ट रूप से व्यक्त करता है। जैसा कि आपने कहा था, एक मॉडल एक अभिविन्यास नहीं है। – Oswald

+0

मुझे यह विचार पसंद है। आप 'अभिविन्यास' वर्ग से विरासत में प्राप्त होने वाली सभी चीज़ों के साथ मिलकर नहीं मिलते हैं, आप 'उन्मुखीकरण' वर्ग से जो कुछ भी चाहते हैं उसे ठीक से समेकित कर सकते हैं, और फिर इस मध्यवर्ती वर्ग से विरासत में प्राप्त करके उन encapsulated गुण/विधियों का पुन: उपयोग कर सकते हैं (यह देखते हुए कि मॉडल, इलाके, कैमरे सभी 'उन्मुखीकरण' ऑब्जेक्ट से सुविधाओं के समान सबसेट का उपयोग करते हैं) – Porkbutts

4

एक सस्ते रैपिंग बॉयलरप्लेट का सबसे बचने के लिए रास्ता नहीं है।

class model : private orientation { 
    public: 
    using orientation::set_x; 
    ... etc ... 
}; 

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

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

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