অভিন্ন স্বাক্ষর সহ দুটি ইন্টারফেস


13

আমি এমন একটি কার্ড গেম মডেল করার চেষ্টা করছি যেখানে কার্ডগুলিতে দুটি গুরুত্বপূর্ণ বৈশিষ্ট্য রয়েছে:

প্রথমটি একটি প্রভাব। গেমের স্থিতিতে এই পরিবর্তনগুলি যা আপনি কার্ড খেললে ঘটে। প্রভাবের জন্য ইন্টারফেসটি নিম্নরূপ:

boolean isPlayable(Player p, GameState gs);
void play(Player p, GameState gs);

এবং আপনি যদি কার্ডটির ব্যয়টি পূরণ করতে পারেন এবং এর সমস্ত প্রভাব খেলতে পারা যায় তবে আপনি কার্ডটিকে প্লেযোগ্য হিসাবে বিবেচনা করতে পারেন। তাই ভালো:

// in Card class
boolean isPlayable(Player p, GameState gs) {
    if(p.resource < this.cost) return false;
    for(Effect e : this.effects) {
        if(!e.isPlayable(p,gs)) return false;
    }
    return true;
}

ঠিক আছে, এখন পর্যন্ত, বেশ সহজ।

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

boolean isActivatable(Player p, GameState gs);
void activate(Player p, GameState gs);

এবং আমি বুঝতে পারি যে এটি "প্লে" পরিবর্তে "অ্যাক্টিভেট" বলার ব্যতিক্রম Abilityএবং Effectঠিক একই স্বাক্ষর রয়েছে।


অভিন্ন স্বাক্ষর সহ একাধিক ইন্টারফেস রাখা কি খারাপ জিনিস? আমার কেবল একটি ব্যবহার করা উচিত এবং একই ইন্টারফেসের দুটি সেট থাকা উচিত? যেমন:

Set<Effect> effects;
Set<Effect> abilities;

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

সূক্ষ্ম মুদ্রণ:

আমি জানি যে এই প্রশ্নটি গেম ডেভেলপমেন্টের দ্বারা উদ্ভূত হয়েছে তবে আমি অনুভব করি যে এটি এমন এক ধরণের সমস্যা যা সহজেই অ-গেম ডেভেলপমেন্টে সহজেই আঁকিয়ে উঠতে পারে, বিশেষত যখন একটি অ্যাপ্লিকেশনে একাধিক ক্লায়েন্টের ব্যবসায়ের মডেলগুলিকে সামঞ্জস্য করার চেষ্টা করা হয় ঠিক তেমনটি ঘটানোর সাথে সাথে happens প্রতিটি প্রকল্প আমি একাধিক ব্যবসায়ের প্রভাব নিয়ে করেছি ... এছাড়াও, ব্যবহৃত স্নিপেটগুলি হ'ল জাভা স্নিপেটস, তবে এটি কেবলমাত্র বহুগুণ অবজেক্ট ওরিয়েন্টেড ভাষার ক্ষেত্রে প্রয়োগ হতে পারে।


কেবল KISS এবং YAGNI অনুসরণ করুন এবং আপনার ভাল হওয়া উচিত।
বার্নার্ড

2
এই প্রশ্নটি দেখা দেওয়ার একমাত্র কারণ হ'ল অবিশ্বাস্যভাবে প্রশস্ত এবং নিয়ন্ত্রণহীন প্লেয়ার এবং গেমস্টেট পরামিতিগুলির কারণে আপনার ফাংশনগুলিতে খুব বেশি রাজ্যে অ্যাক্সেস রয়েছে।
লার্স ভিক্লুন্ড

উত্তর:


18

কেবলমাত্র দুটি ইন্টারফেসের একই চুক্তি হওয়ার অর্থ এই নয় যে তারা একই ইন্টারফেস।

লিসকভ সাবস্টিটিউশন নীতিতে বলা হয়েছে:

টি (x) টি টাইপ টির x অবজেক্টের জন্য প্রাপ্য সম্পত্তি হতে হবে Then

বা, অন্য কথায়: ইন্টারফেস বা সুপার টাইপের ক্ষেত্রে যা কিছু সত্য তা তার সমস্ত উপপ্রকারের ক্ষেত্রেই সত্য হওয়া উচিত।

আমি যদি আপনার বর্ণনাটি সঠিকভাবে বুঝতে পারি তবে একটি ক্ষমতা কোনও প্রভাব নয় এবং প্রভাব কোনও দক্ষতা নয়। যে কোনও একটিতে তার চুক্তি পরিবর্তন হওয়া উচিত, অন্যটি এটির সাথে পরিবর্তিত হওয়ার সম্ভাবনা কম। একে অপরের সাথে আবদ্ধ করার চেষ্টা করার কোনও ভাল কারণ আমি দেখতে পাচ্ছি না।


2

উইকিপিডিয়া থেকে : " ইন্টারফেস প্রায়শই একটি বিমূর্ত প্রকার সংজ্ঞায়িত করতে ব্যবহৃত হয় যাতে কোনও ডেটা থাকে না, তবে পদ্ধতি হিসাবে সংজ্ঞায়িত আচরণগুলি প্রকাশ করে "। আমার মতে একটি ইন্টারফেসটি কোনও আচরণের বর্ণনা দেওয়ার জন্য ব্যবহৃত হয়, সুতরাং আপনার যদি বিভিন্ন আচরণ থাকে তবে এটি বিভিন্ন ইন্টারফেসটি বোধগম্য হয়। আপনার প্রশ্নটি পড়ার ফলে যে ধারণাটি পেয়েছি তা হ'ল আপনি বিভিন্ন আচরণের বিষয়ে কথা বলছেন যাতে বিভিন্ন ইন্টারফেসটি সেরা পন্থা হতে পারে।

আরেকটি বিষয় যা আপনি বলেছিলেন তা হ'ল যদি সেই আচরণগুলির মধ্যে একটির পরিবর্তন হয়। তারপরে কী হবে যখন আপনার কেবল একটি ইন্টারফেস থাকবে?


1

যদি আপনার কার্ড গেমের নিয়মগুলি "প্রভাব" এবং "দক্ষতা" এর মধ্যে পার্থক্য করে তবে আপনাকে তা নিশ্চিত করতে হবে যে সেগুলি বিভিন্ন ইন্টারফেস। এটি আপনাকে দুর্ঘটনাক্রমে যেখানে অন্যটির প্রয়োজন হয় সেগুলির একটি ব্যবহার থেকে বিরত রাখবে।

এটি বলেছে যে এগুলি যদি চূড়ান্তভাবে সাদৃশ্যপূর্ণ হয় তবে এগুলি একটি সাধারণ পূর্বপুরুষের কাছ থেকে নেওয়া বুদ্ধিমান হতে পারে। সাবধানে বিবেচনা করুন: আপনি বিশ্বাস করতে যে, "প্রভাব" এবং "ক্ষমতার" সবসময় হবে কারণ আছে অগত্যা একই ইন্টারফেস আছে? আপনি যদি effectইন্টারফেসে কোনও উপাদান যুক্ত করেন , তবে আপনি কি ইন্টারফেসে একই উপাদান যুক্ত হওয়ার আশা করবেন ability?

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


0

আপনি যা দেখছেন তা হ'ল মূলত টাইপ সিস্টেমগুলির সীমিত অভিব্যক্তির একটি শিল্পকর্ম।

তাত্ত্বিকভাবে, যদি আপনার টাইপ সিস্টেম আপনাকে সেই দুটি ইন্টারফেসের আচরণটি নির্ভুলভাবে নির্দিষ্ট করার অনুমতি দেয় তবে তাদের স্বাক্ষরগুলি ভিন্ন হবে কারণ তাদের আচরণগুলি পৃথক। ব্যবহারিকভাবে, টাইপ সিস্টেমগুলির অভিব্যক্তিতা হ্যালটিং সমস্যা এবং ধানের তত্ত্বের মতো মৌলিক সীমাবদ্ধতার দ্বারা সীমাবদ্ধ থাকে, সুতরাং আচরণের প্রতিটি দিক প্রকাশ করা যায় না।

এখন, বিভিন্ন ধরণের সিস্টেমে ভাবের বিভিন্ন ডিগ্রি রয়েছে তবে সর্বদা এমন কিছু থাকবে যা প্রকাশ করা যায় না।

উদাহরণস্বরূপ: দুটি ইন্টারফেসের পৃথক ত্রুটিযুক্ত আচরণের সি # তে একই স্বাক্ষর থাকতে পারে তবে জাভাতে নয় (কারণ জাভা ব্যতিক্রমগুলি স্বাক্ষরের অংশ)। দুটি ইন্টারফেস যাদের আচরণ কেবল তাদের পার্শ্ব প্রতিক্রিয়াগুলির সাথে পৃথক হয় জাভাতে একই স্বাক্ষর থাকতে পারে তবে হাস্কেলের বিভিন্ন স্বাক্ষর থাকতে পারে।

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

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