ইন ব্লগ পোস্ট এই সিরিজের , এরিক Lippert উইজার্ড এবং উদাহরণ, যেখানে যেমন যোদ্ধারা ব্যবহার অবজেক্ট ওরিয়েন্টেড নকশা করার সময় একটি সমস্যা বর্ণনা
abstract class Weapon { }
sealed class Staff : Weapon { }
sealed class Sword : Weapon { }
abstract class Player
{
public Weapon Weapon { get; set; }
}
sealed class Wizard : Player { }
sealed class Warrior : Player { }
এবং তারপরে কয়েকটি বিধি যুক্ত করে:
- একজন যোদ্ধা কেবল তরোয়াল ব্যবহার করতে পারেন।
- উইজার্ড কেবলমাত্র একটি কর্মী ব্যবহার করতে পারে।
এরপরে আপনি যদি সি # টাইপ সিস্টেমটি ব্যবহার করে এই বিধিগুলি প্রয়োগ করার চেষ্টা করেন তবে আপনি যে সমস্যার মধ্যে পড়েছেন সেগুলি তিনি প্রদর্শন করে চলেছেন (উদাহরণস্বরূপ, Wizardউইজার্ড কেবলমাত্র একটি কর্মী ব্যবহার করতে পারে তা নিশ্চিত করার জন্য শ্রেণিকে দায়বদ্ধ করে তোলা)। আপনি লিসকভ সাবস্টিটিউশন নীতি লঙ্ঘন করেন, রান-টাইম ব্যতিক্রমগুলি ঝুঁকিপূর্ণ করেন বা কোডটি শেষ করেন যা প্রসারিত করা কঠিন।
তিনি যে সমাধানটি নিয়ে আসছেন তা হ'ল প্লেয়ার শ্রেণি দ্বারা কোনও বৈধতা নেওয়া হয় না। এটি শুধুমাত্র রাষ্ট্রকে ট্র্যাক করতে ব্যবহৃত হয়। তারপরে, কোনও খেলোয়াড়কে অস্ত্র দেওয়ার পরিবর্তে:
player.Weapon = new Sword();
রাষ্ট্রটি Commandএস দ্বারা এবং এর অনুসারে সংশোধিত হয় Rule:
... আমরা এমন একটি
Commandবস্তু তৈরি করিWieldযা দুটি গেমের স্টেট অবজেক্ট গ্রহণ করে, একটিPlayerএবং একটিWeapon। যখন ব্যবহারকারী সিস্টেমে একটি কমান্ড জারি করে "এই উইজার্ডটি সেই তরোয়ালটি চালিত করে", তখন সেই কমান্ডটি একটি সেট এর প্রসঙ্গে মূল্যায়ন করা হয়Rule, যাEffectএস এর ক্রম তৈরি করে । আমাদের একটি রয়েছেRuleযে বলছে যে কোনও খেলোয়াড় যখন অস্ত্র চালানোর চেষ্টা করেন, তখন প্রভাবটি হ'ল বিদ্যমান অস্ত্রটি যদি থাকে তবে তা ফেলে দেওয়া হয় এবং নতুন অস্ত্রটি প্লেয়ারের অস্ত্র হয়ে যায়। আমাদের আরেকটি নিয়ম রয়েছে যা প্রথম নিয়মকে শক্তিশালী করে, যা বলে যে উইজার্ড যখন তরোয়াল চালানোর চেষ্টা করে তখন প্রথম নিয়মের প্রভাব প্রযোজ্য না।
আমি এই ধারণাটি নীতিগতভাবে পছন্দ করি তবে এটি অনুশীলনে কীভাবে ব্যবহৃত হতে পারে তা নিয়ে আমার উদ্বেগ রয়েছে।
কিছুই circumventing থেকে একটি ডেভেলপার প্রতিরোধ বলে মনে হয় Commandsএবং Ruleকেবল সেটিং দ্বারা গুলি Weaponএকটি উপর Player। Weaponসম্পত্তি দ্বারা অ্যাক্সেসযোগ্য করা প্রয়োজন Wieldতাই এটি তৈরি করা যাবে না, কমান্ড private set।
সুতরাং, কোন বিকাশকারীকে এটি করতে বাধা দেয় ? তাদের কি শুধু মনে রাখতে হবে না?