मेरे सॉफ्टवेयर इंजीनियरिंग वर्ग में एक असाइनमेंट एक एप्लीकेशन डिजाइन करना है जो विभिन्न रूपों को एक विशेष गेम खेल सकता है। विचाराधीन खेल मंचला है, इनमें से कुछ खेलों को वारी या कलाह कहा जाता है। ये खेल कुछ पहलुओं में भिन्न हैं, लेकिन मेरे प्रश्न के लिए यह जानना महत्वपूर्ण है कि खेल निम्नलिखित में भिन्न हो सकते हैं:
- जिस तरह से एक चाल के परिणाम को संभाला जाता है
- जिस तरह से खेल का अंत निर्धारित किया जाता है
- जिस तरह से विजेता निर्धारित किया जाता है
पहली बात यह है कि मेरे दिमाग में यह डिजाइन करने के लिए आया था कि रणनीति पैटर्न का उपयोग करें, मेरे पास एल्गोरिदम (गेम के वास्तविक नियम) में भिन्नता है। डिजाइन इस तरह दिख सकता है:
मैंने तब खुद से सोचा था कि मैंकला और वारी के खेल में जिस तरह से विजेता का निर्धारण किया जाता है वह बिल्कुल वैसा ही होता है और कोड डुप्लिकेट होगा। मुझे नहीं लगता कि यह परिभाषा 'एक नियम, एक जगह' या DRY सिद्धांत के उल्लंघन के रूप में है जिसे मनका के लिए नियमों में बदलाव के रूप में देखा जा सकता है, इसका मतलब यह नहीं होगा कि नियम को वैरी में भी बदला जाना चाहिए। फिर भी मुझे अपने प्रोफेसर से मिली प्रतिक्रिया से मुझे एक अलग डिज़ाइन खोजने का आभास हुआ।
मैं इसके बाद आया:
प्रत्येक खेल (मनकाला, वारि, कलाह, ...) में प्रत्येक नियम के इंटरफ़ेस के प्रकार की विशेषता होगी, अर्थात WinnerDeterminer
और यदि कोई मनकाला २.० संस्करण है जो मानकाला १.० के समान है, सिवाय इसके कि विजेता कैसे निर्धारित होता है, बस Mancala संस्करणों का उपयोग करें।
मुझे लगता है कि एक रणनीति पैटर्न के रूप में इन नियमों का कार्यान्वयन निश्चित रूप से मान्य है। लेकिन असली समस्या तब आती है जब मैं इसे और डिजाइन करना चाहता हूं।
टेम्पलेट पद्धति पैटर्न के बारे में पढ़ने में मुझे तुरंत लगा कि इसे इस समस्या पर लागू किया जा सकता है। उपयोगकर्ता द्वारा किए जाने पर किए जाने वाले कार्य हमेशा एक जैसे होते हैं, और एक ही क्रम में, अर्थात्:
- छेद में पत्थर जमा करना (यह सभी खेलों के लिए समान है, इसलिए इसे टेम्पलेट विधि में लागू किया जाएगा)
- चाल का परिणाम निर्धारित करें
- निर्धारित करें कि क्या खेल पिछले चाल के कारण समाप्त हो गया है
- यदि खेल समाप्त हो गया है, तो निर्धारित करें कि कौन जीता है
ऊपर वर्णित मेरी रणनीति पैटर्न में वे तीन अंतिम चरण हैं। मुझे इन दोनों को मिलाने में बहुत परेशानी हो रही है। एक संभावित समाधान जो मैंने पाया वह है कि रणनीति पैटर्न को छोड़ना और निम्नलिखित कार्य करना चाहिए:
मैं वास्तव में रणनीति पैटर्न और इसके बीच के अंतर को नहीं देखता हूं? लेकिन मैं निश्चित हूं कि मुझे एक टेम्पलेट पद्धति का उपयोग करने की आवश्यकता है (हालांकि मैं रणनीति पैटर्न का उपयोग करने के बारे में निश्चित था)।
मैं यह भी निर्धारित नहीं कर सकता कि TurnTemplate
ऑब्जेक्ट बनाने के लिए कौन जिम्मेदार होगा , जबकि रणनीति पैटर्न के साथ मुझे लगता है कि मेरे पास वस्तुओं के परिवार (तीन नियम) हैं जो मैं आसानी से एक अमूर्त कारखाना पैटर्न का उपयोग करके बना सकता हूं। मेरे पास तब ए MancalaRuleFactory
, WariRuleFactory
आदि होगा, और वे नियमों के सही उदाहरण बनाएंगे और मुझे एक RuleSet
वस्तु वापस देंगे ।
मान लीजिए कि मैं रणनीति + अमूर्त कारखाने पैटर्न का उपयोग करता हूं और मेरे पास एक RuleSet
वस्तु है जिसमें तीन नियमों के लिए एल्गोरिदम हैं। एकमात्र तरीका मुझे लगता है कि मैं अभी भी टेम्पलेट विधि पैटर्न का उपयोग कर सकता हूं, इस RuleSet
ऑब्जेक्ट को मेरे पास करना है TurnTemplate
। तब 'समस्या' जो कि सतहों की है कि मुझे अपने ठोस कार्यान्वयन की कभी आवश्यकता नहीं होगी TurnTemplate
, ये वर्ग अप्रचलित हो जाएंगे। अपने संरक्षित तरीकों में TurnTemplate
मैं बस फोन कर सकता था ruleSet.determineWinner()
। परिणामस्वरूप, TurnTemplate
वर्ग अब अमूर्त नहीं होगा, बल्कि उसे ठोस बनना होगा, क्या यह तब भी एक टेम्पलेट पद्धति है?
संक्षेप में, क्या मैं सही तरीके से सोच रहा हूं या क्या मैं कुछ आसान याद कर रहा हूं? यदि मैं सही रास्ते पर हूं, तो मैं रणनीति पैटर्न और टेम्पलेट पद्धति पैटर्न को कैसे संयोजित करूं?