আমার সফ্টওয়্যার ইঞ্জিনিয়ারিং ক্লাসে একটি অ্যাসাইনমেন্ট হ'ল একটি অ্যাপ্লিকেশন ডিজাইন করা যা কোনও নির্দিষ্ট গেম বিভিন্ন ফর্ম খেলতে পারে। প্রশ্নে থাকা খেলাটি মানচালা, এর মধ্যে কয়েকটি খেলা ওয়ারী বা কালাহ নামে পরিচিত। এই গেমগুলি কিছু দিক থেকে পৃথক তবে আমার প্রশ্নের জন্য গেমগুলি নিম্নলিখিতগুলির চেয়ে পৃথক হতে পারে তা জানা কেবল গুরুত্বপূর্ণ:
- যেভাবে কোনও পদক্ষেপের ফলাফলটি পরিচালনা করা হয়
- যেভাবে গেমের শেষটি নির্ধারিত হয়
- যেভাবে বিজয়ী নির্ধারিত হয়
এটি নকশা করার জন্য আমার মনে যে প্রথম জিনিসটি এসেছিল তা হ'ল কৌশল বিন্যাসটি ব্যবহার করা, আমার অ্যালগরিদমে (গেমের আসল নিয়ম) এর একটি প্রকরণ রয়েছে। নকশাটি দেখতে দেখতে এটির মতো হতে পারে:
আমি তখন নিজের কাছে ভেবেছিলাম যে মনচালা এবং ওয়ারির খেলায় বিজয়ী যেভাবে নির্ধারিত হয় ঠিক ঠিক তেমন এবং কোডটি নকল হবে। আমি মনে করি না যে এটি সংজ্ঞা অনুসারে 'এক বিধি, এক জায়গা' বা ডিআরওয়াই নীতি লঙ্ঘন হিসাবে মানচালার বিধি পরিবর্তনের হিসাবে দেখার অর্থ স্বয়ংক্রিয়ভাবে এই হবে না যে নিয়মেও ওয়ারীতে পরিবর্তন করা উচিত। তবুও আমার অধ্যাপকের কাছ থেকে প্রাপ্ত প্রতিক্রিয়া থেকে আমি আলাদা ডিজাইনের সন্ধান পেয়েছি।
আমি তখন এটি নিয়ে এসেছি:
প্রতিটি গেম (মানকালা, ওয়ারী, কালাহ, ...) কেবল প্রতিটি নিয়মের ইন্টারফেসের ধরণের বৈশিষ্ট্যযুক্ত থাকে, WinnerDeterminer
এবং যদি কোনও ম্যানচালা ২.০ সংস্করণ থাকে তবে বিজয়ী কীভাবে নির্ধারণ করা হয় তা ব্যতীত মানচালা ১.০ এর সমান মানকালা সংস্করণ ব্যবহার করুন।
আমি মনে করি কৌশল বিধি হিসাবে এই বিধিগুলির বাস্তবায়ন অবশ্যই বৈধ। তবে আসল সমস্যাটি তখনই আসে যখন আমি এটিকে আরও ডিজাইন করতে চাই।
টেমপ্লেট পদ্ধতির প্যাটার্নটি পড়ার সাথে সাথে আমি তত্ক্ষণাত ভেবেছিলাম এটি এই সমস্যার জন্য প্রয়োগ করা যেতে পারে। যখন ব্যবহারকারী কোনও পদক্ষেপ নেয় তখন যে ক্রিয়াগুলি করা হয় তা সর্বদা একই এবং একই ক্রমে, যথা:
- গর্তগুলিতে পাথর জমা করুন (এটি সমস্ত গেমের জন্য একই, সুতরাং এটি টেমপ্লেট পদ্ধতিতে প্রয়োগ করা হবে)
- পদক্ষেপের ফলাফল নির্ধারণ করুন
- আগের পদক্ষেপের কারণে গেমটি শেষ হয়েছে কিনা তা নির্ধারণ করুন
- গেমটি শেষ হয়ে গেলে, কে জিতেছে তা নির্ধারণ করুন
এই তিনটি শেষ পদক্ষেপগুলি সমস্ত উপরে বর্ণিত আমার কৌশল প্যাটার্নে রয়েছে। এই দুটি একত্রিত করতে আমার অনেক সমস্যা হচ্ছে। আমি যে সম্ভাব্য সমাধান খুঁজে পেয়েছি তা হ'ল কৌশল রীতিটি ছেড়ে দেওয়া এবং নিম্নলিখিতগুলি করা:
আমি সত্যিই কৌশল প্যাটার্ন এবং এই মধ্যে নকশা পার্থক্য দেখতে না? তবে আমি নিশ্চিত যে আমার একটি টেম্পলেট পদ্ধতি ব্যবহার করা দরকার (যদিও আমি কৌশল প্যাটার্নটি ব্যবহারের বিষয়ে ঠিক তেমন নিশ্চিত ছিলাম)।
আমি TurnTemplate
বস্তুটি তৈরির জন্য কে দায়ী হবে তাও নির্ধারণ করতে পারছি না , কৌশল কৌশল অনুসারে আমার মনে হয়েছে যে আমার কাছে অবজেক্টগুলির পরিবার রয়েছে (তিনটি বিধি) যা আমি সহজেই একটি বিমূর্ত কারখানার নিদর্শন ব্যবহার করে তৈরি করতে পারি। আমার তখন একটি MancalaRuleFactory
, WariRuleFactory
ইত্যাদি ছিল এবং তারা নিয়মের সঠিক দৃষ্টান্ত তৈরি করে এবং আমাকে কোনও RuleSet
বস্তু ফিরিয়ে দেয় ।
ধরা যাক যে আমি কৌশলটি + বিমূর্ত কারখানার প্যাটার্নটি ব্যবহার করি এবং আমার কাছে এমন একটি RuleSet
আইটেম রয়েছে যা এতে তিনটি নিয়মের জন্য অ্যালগরিদম রয়েছে। আমি এখনও এটির সাহায্যে টেমপ্লেট পদ্ধতির প্যাটার্নটি ব্যবহার করতে পারি বলে মনে হয় কেবলমাত্র এটি RuleSet
আমার কাছে এই অবজেক্টটি পাস করা TurnTemplate
। তারপরে 'সমস্যা' যে সমস্যাগুলি হ'ল তা হ'ল আমার কংক্রিট বাস্তবায়নের দরকার হবে না TurnTemplate
, এই শ্রেণিগুলি অচল হয়ে উঠবে। আমার সুরক্ষিত পদ্ধতিতে TurnTemplate
আমি কেবল কল করতে পারি ruleSet.determineWinner()
। ফলস্বরূপ, TurnTemplate
ক্লাসটি আর বিমূর্ত হবে না তবে কংক্রিট হয়ে উঠতে হবে, এটি কি এখনও একটি টেম্পলেট পদ্ধতির প্যাটার্ন?
সংক্ষেপে বলি, আমি কি সঠিক উপায়ে চিন্তা করছি বা খুব সহজ কিছু মিস করছি? যদি আমি সঠিক পথে থাকি, তবে আমি কীভাবে কৌশল প্যাটার্ন এবং একটি টেম্পলেট পদ্ধতি প্যাটার্নটি একত্রিত করব?