5

मेरे पास एक कंटेनर है जिसमें बेस क्लास के पॉइंटर्स का एक गुच्छा है, और एक फ़ंक्शन जो कुछ इनपुट लेता है और बेस क्लास का उप-वर्ग है जो कक्षा देता है। यह कौन सा सबक्लास लौटाता है इनपुट पर निर्भर करता है।रचनाकारों के लिए विशाल स्विच स्टेटमेंट

class Base { ... } 

class A : public Base { ... } 
class B : public Base { ... } 
... 
class Z : public Base { ... } 

Base* depends(int input) { 
    switch (input) { 
    case 1: 
     return new A(...); 
    case 2: 
     return new B(...); 
    ... 
    case 26: 
     return new Z(...); 
    default: 
     ... 
    } 
} 

मैं इस डिजाइन करने के लिए किसी भी बेहतर तरीका है सोच रहा था:

अभी, मैं इस तरह एक विशाल स्विच बयान की है। मुझे कई "डिज़ाइन पैटर्न" नहीं हैं (मुझे लगता है कि उन्हें यही कहा जाता है) इसलिए मुझे नहीं पता कि यह डिजाइन करने के लिए एक (स्पष्ट) बेहतर तरीका है या नहीं।

+1

कक्षाओं या कक्षा के नामों में अपनी कुंजी मैपिंग करने के लिए एक शब्दकोश होना अच्छा होगा (या आपकी चाबियाँ इट्स हैं तो केवल एक सरणी)। लेकिन क्या यह संभव है? समान प्रश्न देखें: http://stackoverflow.com/questions/582331/c-is-there-a-way-to-instantiate-objects-from-a-string-holding-their-class-name –

+0

@ रे धन्यवाद लिंक के लिए, यह प्रश्न मेरा बहुत ही समान है, और बहुत अधिक प्रश्न teh सवाल है। –

उत्तर

6

जो आप खोज रहे हैं वह Factory Method pattern है।

बेस क्लास की व्युत्पन्न कक्षा कार्यान्वयन के बारे में कोई जानकारी रखने के लिए यहां महत्वपूर्ण बात है। यह बेस क्लास के लिए व्युत्पन्न कक्षाओं के बारे में ज्ञान रखने के लिए एक खराब डिजाइन है।

फैक्टरी विधि पैटर्न उपरोक्त समस्या को संबोधित करता है क्योंकि निर्माण बेस क्लास के बाहर होता है।

1

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

1

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

1

पूर्णांक पैरामीटर "इनपुट" कहीं से आता है। हो सकता है कि आप उस कोड को छोड़ सकें जो उस int को वास्तविक वस्तु बनाते हैं। अगर आप डिस्क से int या उस तरह से कुछ पढ़ रहे हैं तो यह काम नहीं करेगा।

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

+0

दुर्भाग्य से यह वही है जो यह प्रोग्राम करता है - फ़ाइल से डेटा पढ़ें। इस कार्यक्रम को हर तरह की दक्षता की आवश्यकता होती है, हालांकि मुझे लगता है कि 'स्विच' के साथ चिपकने का एक अच्छा तरीका होगा। धन्यवाद। –

+0

@ सेठ कार्नेगी एक चीज जो आप करना चाहते हैं वह है उप-वर्गों में कक्षा आईडी जैसे स्थिर स्थिर क्षेत्र को परिभाषित किया गया है। फिर दोनों कोड जो ऑब्जेक्ट बनाता है और आईडी को डिस्क पर लिखने वाला कोड उसी फ़ील्ड को संदर्भित कर सकता है। –

+0

हाँ, यही वह करता है। मैं वह आरटीटीआई करना चाहता हूं। –

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