উইজার্ডস এবং ওয়ারিয়র্সে বিধি বিধান করা


9

ইন ব্লগ পোস্ট এই সিরিজের , এরিক 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একটি উপর PlayerWeaponসম্পত্তি দ্বারা অ্যাক্সেসযোগ্য করা প্রয়োজন Wieldতাই এটি তৈরি করা যাবে না, কমান্ড private set

সুতরাং, কোন বিকাশকারীকে এটি করতে বাধা দেয় ? তাদের কি শুধু মনে রাখতে হবে না?


2
আমি মনে করি না যে এই প্রশ্নটি ভাষা নির্দিষ্ট (সি #) কারণ এটি সত্যই ওওপি নকশা সম্পর্কে একটি প্রশ্ন। সি # ট্যাগ অপসারণ বিবেচনা করুন।
পারে_ফ্যাক্টর

1
@ মাইবে_ফ্যাক্টর সি # ট্যাগটি ঠিক আছে কারণ পোস্ট করা কোড সি #।
কোডিংইশি

আপনি কেন সরাসরি এরিকলিপার্টকে জিজ্ঞাসা করবেন না? সময় মতো সময়ে সময়ে তিনি এখানে উপস্থিত আছেন বলে মনে হয়।
ডক ব্রাউন

@ মায়েবে_ ফ্যাক্টর - আমি সি # ট্যাগের উপর ঝাঁকুনি দিয়েছি, তবে কোনও ভাষা-নির্দিষ্ট সমাধানের ক্ষেত্রে এটি রাখার সিদ্ধান্ত নিয়েছি।
বেন এল

1
@ ডকব্রাউন - আমি এই প্রশ্নটি তার ব্লগে পোস্ট করেছিলাম (মাত্র কয়েকদিন আগে স্বীকার করে নিয়েছি যে আমি কোনও প্রতিক্রিয়া জানাতে অপেক্ষা করি নি)। আমার প্রশ্ন এখানে তাঁর নজরে আনার কোন উপায় আছে?
বেন এল

উত্তর:


9

সিরিজটি ব্লগ পোস্টগুলিতে যে পুরো তর্কটি চালিত হয় তা পঞ্চম অংশে রয়েছে :

আমাদের বিশ্বাস করার কোনও কারণ নেই যে সি # টাইপ সিস্টেমটি ডানজিওনস এবং ড্রাগনগুলির নিয়মগুলি এনকোড করার জন্য পর্যাপ্ত সাধারণতা তৈরি করার জন্য তৈরি করা হয়েছিল, তাই আমরা কেন চেষ্টা করছি?

আমরা "সিস্টেমটি নিয়মগুলি প্রকাশ করে এমন কোডটি কোথায় যায়?" এর সমস্যার সমাধান করেছি? এটি এমন অবজেক্টগুলিতে যায় যা সিস্টেমের নিয়মগুলিকে প্রতিনিধিত্ব করে, গেমের অবস্থাকে উপস্থাপনকারী বস্তুগুলিতে নয়; রাষ্ট্রীয় বিষয়গুলির উদ্বেগ তাদের রাজ্যটিকে সামঞ্জস্য বজায় রেখেছে, গেমের নিয়ম মূল্যায়নে নয়।

অস্ত্র, অক্ষর, দানব এবং অন্যান্য গেমের জিনিসগুলি তারা কী করতে পারে বা কী করতে পারে তা যাচাই করার জন্য দায়বদ্ধ নয়। নিয়ম ব্যবস্থা এটির জন্য দায়ী। Commandবস্তুর পারেন খেলা বস্তুর সঙ্গে কিছুই করছে। এটি কেবল তাদের সাথে কিছু করার প্রয়াসকে উপস্থাপন করে। রুল সিস্টেম তারপরে কমান্ডটি সম্ভব কিনা তা পরীক্ষা করে এবং এটি যখন নিয়ম সিস্টেম হয় তখন গেমের অবজেক্টগুলিতে উপযুক্ত পদ্ধতিগুলি কল করে কমান্ডটি কার্যকর করে।

যদি কোনও বিকাশকারী একটি দ্বিতীয় বিধি ব্যবস্থা তৈরি করতে চান যা অক্ষর এবং অস্ত্র দিয়ে কাজ করে যা প্রথম নিয়ম সিস্টেমটি অনুমতি দেয় না, তারা এটি করতে পারে কারণ সি # তে আপনি পারবেন না (বাজে প্রতিচ্ছবি হ্যাক ছাড়াই) কোনও পদ্ধতি-কল কোথায় আসে তা আবিষ্কার করতে পারেন থেকে।

একটি ওয়ার্কঅ্যারাউন্ড যা পারে কাজ কিছু পরিস্থিতিতে নিয়ম ইঞ্জিন সমাবেশ এক খেলা বস্তু (বা তাদের ইন্টারফেস) নির্বাণ এবং কোন mutator-পদ্ধতি চিহ্নিত করা হয় internal। গেম অবজেক্টগুলিতে কেবলমাত্র পঠনযোগ্য অ্যাক্সেসের প্রয়োজন রয়েছে এমন কোনও সিস্টেম আলাদা আলাদা সমাবেশে থাকবে, যার অর্থ তারা কেবল publicপদ্ধতিগুলিতে অ্যাক্সেস করতে সক্ষম হবে । এটি এখনও একে অপরের অভ্যন্তরীণ পদ্ধতিগুলি কল করে গেমের অবজেক্টগুলির লুফোল ছেড়ে দেয়। তবে এটি করা সুস্পষ্ট কোডের গন্ধ হবে, কারণ আপনি সম্মত হয়েছেন যে গেম অবজেক্ট ক্লাসগুলি বোবা রাষ্ট্র-ধারক হিসাবে বিবেচিত হবে।


4

মূল কোডটির স্পষ্ট সমস্যা হ'ল এটি অবজেক্ট মডেলিংয়ের পরিবর্তে ডেটা মডেলিং করছে । দয়া করে মনে রাখবেন যে লিঙ্কযুক্ত নিবন্ধে প্রকৃত ব্যবসায়ের প্রয়োজনীয়তার কোনও উল্লেখ নেই!

আমি প্রকৃত কার্যকরী প্রয়োজনীয়তা পাওয়ার চেষ্টা করে শুরু করব। উদাহরণস্বরূপ: "যে কোনও খেলোয়াড় অন্য যে কোনও খেলোয়াড়কে আক্রমণ করতে পারে, ..."। এখানে:

interface Player {
    void Attack(Player enemy);
}

"খেলোয়াড়রা আক্রমণে ব্যবহৃত একটি অস্ত্র চালাতে পারে, উইজার্ডস একটি স্টাফ, ওয়ারিয়র্স একটি তরোয়াল চালাতে পারে":

public class Wizard: Player {
    ...
    public void Wield(Staff weapon) { ... }
    ...
}
public class Warrior: Player {
    ...
    public void Wield(Sword sword) { ... }
    ...
}

"প্রতিটি অস্ত্র আক্রমণকারী শত্রুকে ক্ষতির সম্মুখীন করে"। ঠিক আছে, এখন আমাদের কাছে অস্ত্রের একটি সাধারণ ইন্টারফেস থাকতে হবে:

interface Weapon {
    void dealDamageTo(Player enemy);
}

এবং তাই উপর ... কেন নেই Wield()Player? কারণ কোনও প্লেয়ার যে কোনও অস্ত্র চালাতে পারে এমন কোনও প্রয়োজন ছিল না।

আমি ইমেজ করতে পারি, এটির একটি প্রয়োজন রয়েছে যা বলবে: "যে কেউ যে কোনওটিকে চালিত করার চেষ্টা করতে Playerপারে ।" এটি তবে সম্পূর্ণ আলাদা জিনিস হবে। আমি সম্ভবত এটি এইভাবে মডেল করব:Weapon

interface Player {
    void Attack(Player enemy);
    void TryWielding(Weapon weapon); // Throws UnwieldableException
}

সংক্ষিপ্তসার: প্রয়োজনীয়তাগুলি এবং কেবল প্রয়োজনীয়তার মডেল করুন। ডেটা মডেলিং করবেন না, এটি খুব মডেলিং নয়।


1
আপনি কি সিরিজটি পড়েছেন? হতে পারে আপনি সেই সিরিজের লেখককে ডেটা মডেল না করে প্রয়োজনীয়তাগুলি বলতে চান। আপনার উত্তরে যে সজ্জাগুলি রয়েছে তা হ'ল আপনার তৈরি প্রয়োজনীয়তা নয় সি # সংকলক তৈরি করার সময় লেখকের যে প্রয়োজনীয়তা ছিল তা নয়।
কোডিংইয়োশি

2
এরিক লিপার্ট সেই সিরিজের একটি প্রযুক্তিগত সমস্যার বিবরণ দিচ্ছেন, যা ভাল। এই প্রশ্নটি আসল সমস্যাটি সম্পর্কে, যদিও সি # বৈশিষ্ট্যগুলি নয়। আমার বক্তব্যটি হ'ল বাস্তব প্রকল্পগুলিতে আমাদের ব্যবসায়ের প্রয়োজনীয়তাগুলি অনুসরণ করা উচিত (যার জন্য আমি মেক-আপ উদাহরণ দিয়েছি, হ্যাঁ), সম্পর্ক এবং সম্পত্তিগুলি ধরে নিই না । এইভাবে আপনি ফিট করে এমন একটি মডেল পান। যা ছিল কোয়েসেশন।
রবার্ট ব্রুটিগাম

সেই সিরিজটি পড়ার সময় এটিই আমি প্রথম ভাবলাম। লেখক সবেমাত্র কিছু বিমূর্ততা নিয়ে এসেছিলেন, তাদের আর কখনও মূল্যায়ন করেন না, কেবল তাদের সাথে আঁটেন। যান্ত্রিকভাবে সমস্যাটি বারবার সমাধান করার চেষ্টা করা হচ্ছে। কোনও ডোমেন এবং দরকারী বিমূর্ততা সম্পর্কে চিন্তাভাবনা করার পরিবর্তে, সম্ভবত এটি প্রথমে উচিত go আমার upvote।
ভাদিম সামোখিন

এটা সঠিক উত্তর. নিবন্ধটি বিরোধী প্রয়োজনীয়তাগুলি প্রকাশ করেছে (একটি প্রয়োজনে বলা হয়েছে যে একজন খেলোয়াড় একটি [কোনও] অস্ত্র চালাতে পারবেন, অন্যদিকে অন্যান্য প্রয়োজনীয়তাগুলি বলছেন যে এটি তেমন নয়)) এবং তারপরে বিশ্লেষণটি সঠিকভাবে প্রকাশ করা সিস্টেমের পক্ষে কতটা কঠিন তা বিশদ বর্ণনা করে। একমাত্র সঠিক উত্তর হ'ল দ্বন্দ্ব দূর করা। এই ক্ষেত্রে, এর অর্থ কোনও খেলোয়াড় যে কোনও অস্ত্র চালাতে পারে সেই প্রয়োজনীয়তাটি সরিয়ে ফেলুন।
ড্যানিয়েল টি।

2

একটি উপায় হ'ল Wieldকমান্ডটি পাস করা Player। প্লেয়ারটি Wieldকমান্ডটি কার্যকর করে, যা যথাযথ বিধিগুলি পরীক্ষা করে এবং তারপরে ফিরে আসে Weapon, যা Playerতারপরে নিজের অস্ত্র ক্ষেত্রটি সেট করে। এইভাবে, অস্ত্রের মাঠে একটি ব্যক্তিগত সেটার থাকতে পারে এবং এটি কেবল Wieldপ্লেয়ারকে একটি আদেশ দেওয়ার মাধ্যমে নিষ্পত্তিযোগ্য।


আসলে এটি সমস্যার সমাধান করে না। কমান্ড অবজেক্ট তৈরি করা বিকাশকারী যে কোনও অস্ত্র পাস করতে পারে এবং প্লেয়ার সেট করে দেবে। সিরিজটি পড়ুন কারণ সমস্যাটি আপনি যা ভাবেন তার থেকে বেশি কঠিন। আসলে তিনি সেই সিরিজটি তৈরি করেছিলেন কারণ রোজলিন সি # সংকলকটি বিকাশকালে তিনি এই নকশাটি প্রকাশ করেছিলেন।
কোডিংইয়োশি

2

কিছুই বিকাশকারীকে তা করতে বাধা দেয় না। আসলে এরিক লিপার্ট অনেকগুলি বিভিন্ন কৌশল চেষ্টা করেছিলেন তবে তাদের সকলেরই দুর্বলতা ছিল। এটি সেই সিরিজের পুরো বিষয়টিই ছিল যে বিকাশকারীকে এটি করা থেকে বিরত রাখা সহজ নয় এবং তার চেষ্টা করা সমস্ত কিছুতেই অসুবিধা রয়েছে। অবশেষে তিনি সিদ্ধান্ত নিয়েছিলেন যে Commandনিয়ম সহ কোনও বস্তু ব্যবহার করা সেই উপায় the

নিয়ম সঙ্গে, আপনি সেট করতে পারেন Weaponএকটি সম্পত্তির Wizardএকটি হতে Swordকিন্তু যখন আপনাকে জিজ্ঞাসা Wizardঅস্ত্র (সোর্ড) শাসন এবং আক্রমণ এটা কোনো প্রভাব থাকবে না এবং সেইজন্য এটা যে কোনো অবস্থায় পরিবর্তন করবে না করে। যেমনটি তিনি নীচে বলেছেন:

আমাদের আরেকটি নিয়ম রয়েছে যা প্রথম নিয়মকে শক্তিশালী করে, যা বলে যে উইজার্ড যখন তরোয়াল চালানোর চেষ্টা করে তখন প্রথম নিয়মের প্রভাব প্রযোজ্য না। এই পরিস্থিতির জন্য প্রভাবগুলি হ'ল "একটি দুঃখজনক ট্রম্বোন শব্দ করুন, ব্যবহারকারী এই পালাটির জন্য তাদের ক্রিয়াটি হারাবেন, কোনও গেমের অবস্থা পরিবর্তন করা হবে না

অন্য কথায়, আমরা typeসম্পর্কের মাধ্যমে এমন নিয়ম প্রয়োগ করতে পারি না যা তিনি বিভিন্নভাবে চেষ্টা করেছিলেন তবে তা পছন্দ করেনি বা কাজ করেনি। সুতরাং কেবলমাত্র তিনি যা বলেছিলেন আমরা তা রানটাইমে এটি সম্পর্কে কিছু করা। ব্যতিক্রম নিক্ষেপ করা ভাল ছিল না কারণ তিনি এটিকে ব্যতিক্রম বলে মনে করেন না।

তিনি শেষ পর্যন্ত উপরের সমাধানটি নিয়ে যেতে বেছে নিয়েছেন। এই সমাধানটি মূলত বলে যে আপনি যে কোনও অস্ত্র সেট করতে পারেন তবে আপনি যখন এটি উত্পাদন করেন, সঠিক অস্ত্র না হলে এটি মূলত অকেজো হয়ে যায়। তবে কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হবে না।

আমি এটি একটি ভাল সমাধান বলে মনে করি। যদিও কিছু ক্ষেত্রে আমি ট্রাই-সেট প্যাটার্নের সাথেও যাব।


This solution basically says you can set any weapon but when you yield it, if not the right weapon, it would be essentially useless.আমি এই সিরিজে এটি খুঁজে পেতে ব্যর্থ, আপনি কি দয়া করে আমাকে নির্দেশ করতে পারেন যেখানে এই সমাধানটির প্রস্তাব দেওয়া হচ্ছে?
ভাদিম সামোখিন

@ জাপাডলো তিনি পরোক্ষভাবে এটি বলেছেন। আমি আমার উত্তরে সেই অংশটি অনুলিপি করে দিয়েছি। এখানে আবার। উদ্ধৃতিতে তিনি বলেছেন: যখন উইজার্ড তরোয়াল চালানোর চেষ্টা করে। যদি একটি তরোয়াল সেট না করা হয় তবে উইজার্ড কীভাবে তরোয়াল চালাতে পারে? এটা অবশ্যই সেট করা হয়েছে। তারপরে যদি কোনও উইজার্ড একটি তরোয়াল চালায় তবে সেই পরিস্থিতির প্রভাবগুলি হ'ল "দুঃখজনক ট্রম্বোন শব্দ তৈরি করা হয়, ব্যবহারকারী এই
পালাটির

হুম, আমি মনে করি তরোয়াল চালানোর অর্থ মূলত এটি সেট করা উচিত, না? আমি যেমন অনুচ্ছেদটি পড়ছি, আমি এটি ব্যাখ্যা করি যে প্রথম নিয়মের প্রভাব that the existing weapon, if there is one, is dropped and the new weapon becomes the player’s weapon। দ্বিতীয় বিধিটি যা that strengthens the first rule, that says that the first rule’s effects do not apply when a wizard tries to wield a sword.আমি তাই মনে করি যে অস্ত্রটি তরোয়াল কিনা তা পরীক্ষা করার কোনও নিয়ম রয়েছে, সুতরাং এটি উইজার্ড দ্বারা চালিত করা যায় না, সুতরাং এটি সেট করা হয়নি। পরিবর্তে একটি দু: খিত ট্রম্বোনের শব্দ হয়।
ভাদিম সামোখিন

আমার ভাবনায় অবাক লাগবে যে কিছু কমান্ডের বিধি লঙ্ঘন হয়েছে। এটি কোনও সমস্যার ঝাপসা হওয়ার মতো। ইতিমধ্যে কোনও নিয়ম লঙ্ঘন করা এবং একটি উইজার্ডকে একটি অবৈধ অবস্থায় সেট করার পরে কেন এই সমস্যাটি পরিচালনা করা? উইজার্ডের তরোয়াল থাকতে পারে না, তবে তা! তা হতে দিচ্ছে না কেন?
ভাদিম সামোখিন

আমি Wieldএখানে কীভাবে ব্যাখ্যা করতে পারি তার বিষয়ে @ জাপাডলোর সাথে একমত । আমি মনে করি এটি কমান্ডের জন্য কিছুটা বিভ্রান্তিকর নাম। এর মতো কিছু ChangeWeaponআরও সঠিক হবে। আমার ধারণা আপনার কাছে অন্যরকম মডেল থাকতে পারে যেখানে আপনি কোনও অস্ত্র সেট করতে পারেন তবে আপনি যখন এটি তৈরি করেন সঠিক অস্ত্র না হলে এটি মূলত অকেজো হয়ে যায় । এটি আকর্ষণীয় শোনায়, তবে আমি মনে করি না এরিক লিপার্ট এটি বর্ণনা করেছেন।
বেন এল

2

লেখকের প্রথম বাতিল হওয়া সমাধানটি টাইপ সিস্টেমের দ্বারা নিয়মগুলি উপস্থাপন করা ছিল। সংকলনের সময় টাইপ সিস্টেমটি মূল্যায়ন করা হয়। আপনি যদি টাইপ সিস্টেম থেকে নিয়মগুলি পৃথক করে থাকেন তবে সেগুলি আর সংকলক দ্বারা পরীক্ষা করা হয় না, তাই এমন কোনও কিছুই নেই যা কোনও বিকাশকারীকে প্রতি প্রতি ভুল করতে বাধা দেয়।

তবে এই সমস্যাটি প্রতিটি যুক্তি / মডেলিংয়ের মুখোমুখি হয় যা সংকলক দ্বারা পরীক্ষা করা হয় না এবং এর সাধারণ উত্তরটি (ইউনিট) পরীক্ষা করা হয়। অতএব, লেখকের প্রস্তাবিত সমাধানটির বিকাশকারীদের ত্রুটিগুলি রোধ করার জন্য একটি শক্তিশালী পরীক্ষার জোতা প্রয়োজন। কেবল রানটাইমের সময় সনাক্ত হওয়া ত্রুটিগুলির জন্য একটি শক্তিশালী পরীক্ষার জোতা প্রয়োজনের এই বিন্দুটিকে আন্ডারলাইন করার জন্য, ব্রুস এক্কেলের এই নিবন্ধটি দেখুন , যা একটি যুক্তি তৈরি করে যে গতিশীল ভাষাগুলিতে শক্তিশালী পরীক্ষার জন্য আপনার শক্ত টাইপিংয়ের বিনিময় প্রয়োজন।

উপসংহারে, একমাত্র জিনিস যা বিকাশকারীদের ভুল করতে বাধা দিতে পারে তা হ'ল (ইউনিট) পরীক্ষার একটি সেট পরীক্ষা করে যাচাই করে যে সমস্ত নিয়ম মেনে চলছে।


আপনি একটি এআইপিআই ব্যবহার করবেন এবং এপিআই আপনাকে ইউনিট পরীক্ষা করবে বা অনুমান করবে তা নিশ্চিত করার কথা? মডেলিং সম্পর্কে পুরো চ্যালেঞ্জটি তাই মডেলটি ব্যবহার করে বিকাশকারীরা অসাবধান হলেও মডেলটি ভেঙে না যায়।
কোডিংইয়োশি

1
আমি যে বিষয়টিটি করার চেষ্টা করছিলাম সেটি হ'ল এমন কিছুই নেই যা বিকাশকারীকে ভুল করতে বাধা দেয়। প্রস্তাবিত সমাধানে, বিধিগুলি ডেটা থেকে আলাদা করা হয়, সুতরাং আপনি যদি নিজের চেক তৈরি না করেন, বিধি প্রয়োগ না করে ডেটা অবজেক্টগুলি ব্যবহার করা থেকে বিরত থাকার মতো কিছুই নেই।
লার্সবে

1

আমি এখানে একটি সূক্ষ্মতা মিস করেছি, তবে আমি নিশ্চিত নই যে সমস্যাটি টাইপ সিস্টেমে রয়েছে। সম্ভবত এটি সি # তে কনভেনশন সহ।

উদাহরণস্বরূপ, আপনি Weaponসেটারটিকে সুরক্ষিত করে পুরোপুরি সুরক্ষিত করতে পারেন Player। তারপর যোগ setSword(Sword)এবং setStaff(Staff)করতে Warriorএবং Wizardযথাক্রমে যে কল সংরক্ষিত সেটার।

এইভাবে, Player/ Weaponসম্পর্কটি স্থিতিশীলভাবে যাচাই করা হয়েছে এবং কোডের যত্ন নেই যা কেবল একটি Playerপেতে একটি ব্যবহার করতে পারে Weapon


এরিক লিপার্ট ব্যতিক্রম ছুঁড়ে ফেলতে চাননি। আপনি কি সিরিজটি পড়েছেন? সমাধানটির প্রয়োজনীয়তাগুলি পূরণ করতে হবে এবং এই প্রয়োজনীয়তাগুলি সিরিজে পরিষ্কারভাবে বর্ণিত হয়েছে।
কোডিংইশি

@ কোডিংইয়োশি কেন এই ব্যতিক্রম হবে? এটি নিরাপদ টাইপ করুন সংকলনের সময় চেকযোগ্য।
অ্যালেক্স

দুঃখিত আমি একবার বুঝতে পেরেছিলাম যে আপনি ছাড় ছাড়ছেন না my তবে আপনি তা করে উত্তরাধিকার ভেঙে ফেলেছেন। লেখক যে সমস্যাটি সমাধান করার চেষ্টা করছেন তা দেখুন আপনি নিজের মতো করে কেবল একটি পদ্ধতি যুক্ত করতে পারবেন না কারণ এখন ধরণগুলি বহুবিকভাবে চিকিত্সা করা যায় না।
কোডিংইয়োশি

@ কোডিংইয়োশি পলিমারফিকের প্রয়োজনীয়তা হ'ল একজন প্লেয়ারের একটি অস্ত্র থাকে। এবং এই স্কিমে, প্লেয়ারটির সত্যই একটি অস্ত্র রয়েছে। কোনও উত্তরাধিকার ভেঙে যায় না। আপনি যদি নিয়মগুলি সঠিকভাবে পান তবে এই সমাধানটি সংকলন করবে।
অ্যালেক্স

@CodingYoshi এখন, তার মানে এই নয় যে আপনাকে লিখতে কোড যে একটি রানটাইম চেক যেমন প্রয়োজন, যদি আপনি একটি যোগ করার জন্য চেষ্টা করবে যা করতে পারেন Weaponএকটি থেকে Player। তবে এমন কোনও সিস্টেম নেই যেখানে আপনি সংকলনের সময় কংক্রিটের ধরণগুলি জানেন না যা সংকলনের সময় concrete কংক্রিটের ধরণের উপর কাজ করতে পারে। সংজ্ঞানুসারে. এই স্কিমটির অর্থ হ'ল রানটাইমের সময় কেবলমাত্র সেই ক্ষেত্রেই মোকাবিলা করা দরকার, যেমন এরিকের যেকোনও স্কিমের চেয়ে বাস্তবে এটি ভাল।
অ্যালেক্স

0

সুতরাং, কোন বিকাশকারীকে এটি করতে বাধা দেয়? তাদের কি শুধু মনে রাখতে হবে না?

এই প্রশ্নটি কার্যকরীভাবে পবিত্র-যুদ্ধ-ইশ ইস্যুতে কার্যকর হয়েছে যেখানে " বৈধতা কোথায় রাখি " (সম্ভবত সম্ভবত ডিডিডিও লক্ষ করা যায়) বলা হয়।

সুতরাং, এই প্রশ্নের উত্তর দেওয়ার আগে নিজেকে জিজ্ঞাসা করা উচিত: আপনি যে নিয়মগুলি অনুসরণ করতে চান তার প্রকৃতি কী? তারা পাথর খোদাই এবং সত্তা সংজ্ঞায়িত করা হয়? এই বিধিগুলি ভঙ্গের ফলে কি কোনও সত্তা যা হয় তা বন্ধ করে দেয়? যদি হ্যাঁ, এই বিধিগুলি কমান্ড বৈধকরণের সাথে রাখার পাশাপাশি এগুলি একটি সত্তায়ও রাখুন। সুতরাং যদি কোনও বিকাশকারী কমান্ডটি বৈধ করতে ভুলে যায় তবে আপনার সত্তাগুলি কোনও অবৈধ অবস্থায় থাকবে না।

যদি না - ভাল হয়, তবে এটি সহজাতভাবে বোঝায় যে এই বিধিগুলি কমান্ড সুনির্দিষ্ট এবং ডোমেন সত্তাগুলিতে থাকা উচিত নয়। সুতরাং এই বিধিগুলি লঙ্ঘন করার ফলে এমন ক্রিয়াকলাপ ঘটে যা সংঘটিত হওয়ার অনুমতি দেওয়া উচিত ছিল না, তবে অবৈধ মডেল অবস্থায় নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.