ইন্টারফেস জড়িত সিমুলেশন জন্য এই খারাপ ওওপি নকশা?


13

আমি ভ্যাম্পায়ারস, ওলভস, হিউম্যানস এবং ট্রাকের অনুকরণের জন্য আমার নিজের ছোট্ট ওওপি প্রোগ্রামটি ডিজাইন করছি এবং ইন্টারফেসগুলি সম্পর্কে আমার নিজস্ব সীমিত বোঝার বাস্তবায়ন করার চেষ্টা করছি।

( আমি এখনও এখানে বিমূর্ত করছি এবং এখনও কোনও কোড প্রয়োগকরণ নেই, সুতরাং এটি বরং ওওপি ডিজাইনের প্রশ্ন ... আমার মনে হয়!)

আমি কি এই শ্রেণীর মধ্যে 'সাধারণ আচরণ' খুঁজছি এবং সেগুলি ইন্টারফেস হিসাবে বাস্তবায়িত করছি ?

উদাহরণস্বরূপ, ভ্যাম্পায়ারস এবং নেকড়েদের কামড়ায় ... তাই আমার একটি কামড় ইন্টারফেস করা উচিত?

public class Vampire : Villain, IBite, IMove, IAttack

তেমনি ট্রাকের জন্য ...

public class Truck : Vehicle, IMove

এবং মানুষের জন্য ...

public class Man : Human, IMove, IDead

আমার চিন্তা কি ঠিক এখানে? (আপনার সাহায্য তারিফ করা)


14
প্রাণী, শাকসবজি এবং খনিজগুলি খুব কমই প্রয়োগের প্রয়োগের জন্য ভাল উদাহরণ দেয়। প্রকৃত বাস্তবায়নের সাধারণত বিমূর্ত হয়, মত IEnumerable, IEquatableইত্যাদি
রবার্ট হার্ভে

6
আপনার কাছে একটি একক উল্লেখ আপনার বস্তু সম্পর্কে কি হয় না ( "দান্ত দিয়া ফুটা করা") আপনার সফ্টওয়্যার। সফ্টওয়্যারটি সাধারণত কিছু করার জন্য ডিজাইন করা হয় , কেবলমাত্র বৈশিষ্ট্যের উপর ভিত্তি করে কোনও অবজেক্টের মডেল স্থাপন করা কোথাও নেতৃত্ব দেয় না।
tofro

@ টফ্রো আমার উদ্দেশ্য ছিল আইবিাইটে একাধিক পদ্ধতি থাকবে যা আচরণ সম্পর্কে বাস্তবায়ন করবে (১) অন্যের 'জীবন / শক্তি' স্তর হ্রাস করা (২) 'রক্ত' গ্রাফিক্সের উপস্থিতি বা প্রার্থনা এবং (৩) সিমুলেশন স্ট্যাটিক্সের আপডেট ডেটা (যেমন NoOfBites)। আমি মনে করি আমি প্রশংসা করতে পারি যে পদ্ধতিগত আচরণগুলির একটি ব্যাপ্তি বাস্তবায়নের জন্য একটি ইন্টারফেস সর্বোত্তমভাবে ব্যবহৃত হয়।
ব্যবহারকারী 3396486

2
মানব, ভ্যাম্পায়ার এবং যানবাহনগুলি কি ইতিমধ্যে IMOV ইন্টারফেসটি প্রয়োগ করে না? সাবক্লাসগুলি কেন এটি খুব স্পষ্টভাবে প্রয়োগ করতে হবে?
পিয়ের আরলাড

এই সমস্ত ইন্টারফেস কি সত্যিই প্রয়োজনীয়? পাইথনে ভাগ্যক্রমে আপনার এই জিনিসগুলির কোনও প্রয়োজন নেই, এহাইকটি সত্যিই একটি সতেজ পরিবর্তন (আমার প্রথম ভাষা ছিল অবজেক্ট পাস্কাল)। এছাড়াও ভার্চুয়াল পদ্ধতিগুলি কিছু ক্ষেত্রে আরও ভাল সমাধান হতে পারে।
আজাসজা

উত্তর:


33

সাধারণভাবে আপনি নিজের অনুমানের সাধারণ বৈশিষ্ট্যের জন্য ইন্টারফেস রাখতে চান।

আমি মন্তব্যগুলিতে @ রবার্ট হার্ভির সাথে আধা-একমত, যারা বলেছিলেন যে সাধারণত ইন্টারফেসগুলি ক্লাসের আরও বিমূর্ত বৈশিষ্ট্য উপস্থাপন করে। তবুও, আমি আরও কংক্রিট উদাহরণ থেকে শুরু করে বিমূর্ত ধারণা ভাবতে শুরু করার একটি ভাল উপায় find

যদিও আপনার উদাহরণটি প্রযুক্তিগতভাবে সঠিক (যেমন হ্যাঁ, উভয় ভ্যাম্পায়ার এবং নেকড়ে উভয়ই কামড়ায়, তাই এর জন্য আপনার একটি ইন্টারফেস থাকতে পারে), প্রাসঙ্গিকতার প্রশ্ন রয়েছে। প্রতিটি বস্তুর কয়েক হাজার বৈশিষ্ট্য রয়েছে (উদাহরণস্বরূপ প্রাণীগুলিতে পশম থাকতে পারে, সাঁতার কাটতে পারে, গাছে উঠতে পারে ইত্যাদি)। আপনি কি তাদের সবার জন্য একটি ইন্টারফেস তৈরি করবেন? খুব কম সম্ভাবনা।

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

মুল বক্তব্যটি হ'ল ইঞ্জিনিয়ার ওভার করবেন না। আপনি কীভাবে সেই ইন্টারফেসটি ব্যবহার করতে যাচ্ছেন সে সম্পর্কে আপনাকে ভাবতে হবে এবং একটি ইন্টারফেস তৈরির জন্য 2 টি ক্লাসের একটি পদ্ধতি প্রচলিত থাকা ভাল কারণ নয়।


1
আমি অবশ্যই আশা করি প্রতিটি বস্তুর নেই না বৈশিষ্ট্যাবলী হাজার হাজার আছে।
উদ্যানক্ষেত্র

4
ওপ বৈশিষ্ট্যগুলির মতো বৈশিষ্ট্যগুলি নয় তবে ব্যাকরণের বৈশিষ্ট্যগুলি / বৈশিষ্ট্যগুলি (যেমন গণনাযোগ্য, তুলনামূলক ইত্যাদি): ডি। শব্দের খারাপ পছন্দ।
Paul92

3
গুরুত্বপূর্ণ যে ইন্টারফেসগুলি কার্যকর তা হ'ল আপনি ব্যবহার করবেন। উদাহরণস্বরূপ, IBiteবিশেষভাবে দরকারী নয়, তবে আপনি চাইবেন IAttackযাতে আপনি আক্রমণকারী সমস্ত জিনিসগুলির উপর কাজ করতে পারেন, বা IUpdateযাতে আপনি সমস্ত কিছুর জন্য আপডেটগুলি চালনা করতে পারেন, বা IPhysicsEnabledযাতে আপনি তাদের জন্য পদার্থবিজ্ঞান প্রয়োগ করতে পারেন, ইত্যাদি
অ্যাক্সিম্যান্ডার

1
এই উত্তর কিছু খুব ভাল পয়েন্ট উত্থাপন। চূড়ান্ত অনুচ্ছেদে এটি বেশ ভালভাবে জুড়েছে; কমপক্ষে পাশাপাশি সরবরাহের বিশদ স্তরের সাথে আপনি পারেন।
লাইটনেস রেস

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

29

দেখে মনে হচ্ছে আপনি একক পদ্ধতিতে ইন্টারফেস তৈরি করছেন । এটি এর মুখের দিক থেকে ঠিক আছে তবে মনে রাখবেন যে ইন্টারফেসগুলি শ্রেণি / এসগুলির দ্বারা অনুমোদিত নয় যা সেগুলি প্রয়োগ করে। এগুলি তাদের ব্যবহার করে এমন ক্লায়েন্টদের মালিকানাধীন। ক্লায়েন্টরা সিদ্ধান্ত নেয় যে কোনও কিছু হ'ল এমন কিছু হওয়া দরকার যা আক্রমণ এবং আক্রমণ করতে পারে।

আমার যদি Combatকোনও fight()পদ্ধতি সহ একটি ক্লাস থাকে তবে সেই পদ্ধতির সম্ভবত উভয়কে move()এবং attack()একই অবজেক্টে কল করা দরকার । এটি দৃ ICombatantinterface়ভাবে একটি ইন্টারফেসের প্রয়োজনের পরামর্শ দেয় যা fight()কল করতে পারে move()এবং তার attack()মধ্য দিয়ে যেতে পারে । এটি fight()কোনও পদক্ষেপ গ্রহণ করা IAttackএবং এটি নড়াচড়া করতে IMoveপারে কিনা তা দেখার জন্য এটি কাস্টিংয়ের চেয়েও পরিষ্কার ।

এর অর্থ এই নয় যে আপনার IMove IAttackইন্টারফেসও থাকতে পারে না । আমি কেবল আশা করি আপনি কিছু ক্লায়েন্টের প্রয়োজন ছাড়াই এগুলি তৈরি করছেন না। বিপরীতভাবে, যদি কোনও ক্লায়েন্টকে কোনও পদক্ষেপ এবং আক্রমণ উভয়ই তৈরি করার প্রয়োজন হয় তবে ICombatantপ্রয়োজন হয় না।

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


1
ধিক্কার এই ভাল। গেমিংটি ওওপি-র ব্যবহার এবং ব্যাখ্যা করার পক্ষে খুব ভাল উপায় বলে মনে হচ্ছে।
জেফো

7
@ জেফো যতক্ষণ না আপনি আসলে একটি যুক্তিসঙ্গতভাবে বড় গেমটি প্রয়োগ করেন এবং বুঝতে না পারেন যে ওওপি হ'ল একটি উত্তেজনাপূর্ণ উপাদান এবং আপনি উপাদান-ভিত্তিক সিস্টেম বা ডেটা-ভিত্তিক নকশাগুলি দিয়ে আরও ভাল হতে পারবেন।
দারখোগ

"ইন্টারফেসগুলি ক্লায়েন্টগুলির দ্বারা মালিকানাধীন যা সেগুলি ব্যবহার করে"
টিবোস


1
লাইব্রেরি এবং অ্যাপ্লিকেশন মধ্যে পার্থক্য জন্য +1, আমি প্রায়শই (অত্যধিক?: /) অনেকগুলি জিনিস পড়ি যা কেবল একটির জন্য উপযুক্ত এবং অন্যটির জন্য নয়।
ওয়ালফ্র্যাট

3

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

উদাহরণস্বরূপ, ধরুন যে কয়েকটি ধরণের প্রাণীটিরই Woozles থাকতে পারে এবং কেউ চান যে এই জাতীয় প্রাণীর একটি NumerOfWoozlesসম্পত্তি রয়েছে। যদি এই ধরণের সম্পত্তি এমন একটি ইন্টারফেসে থাকে যা কেবলমাত্র এমন প্রাণী দ্বারা প্রয়োগ করা হয়েছিল যা ভুজলস থাকতে পারে, তবে যে কোডটি মিশ্র প্রকারের প্রাণীর সংকলনের দ্বারা প্রাপ্ত উজলসের মোট সংখ্যা খুঁজে পেতে চেয়েছিল তার মতো কিছু বলতে হবে:

int total = 0;
foreach (object it in creatures)
{
   IWoozleCountable w = trycast(it, IWoozleCountable);
   if (w != null) total += w.WoozleCount;
}

তবে, যদি উজলকাউন্টটি ক্রিচার / আইক্রিচারের সদস্য হন, যদিও কম সাব টাইপগুলি ক্রিশের ডিফল্ট উজলকাউন্ট বাস্তবায়নকে সর্বদা শুন্য করে দেয়, কোডটি এখানে সরল করা যেতে পারে:

int total = 0;
foreach (ICreature it in creatures)
   total += it.WoozleCount;

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

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