বিশুদ্ধ সত্তা উপাদান সিস্টেম বনাম ভারী ওওপি বনাম? [বন্ধ]


13

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

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

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

যখন আমি এটি পড়তে শুরু করি, আমি দেখতে সক্ষম হয়েছি যে উপাদানগুলির সাথে traditionalতিহ্যবাহী ওওপি হায়ারার্কির সাথে আমার যে সমস্যাগুলি ছিল তা কতটা স্পষ্টভাবে সমাধান করতে সক্ষম হয়েছিল। এগুলি অবশ্য প্রথম পাঠেই ছিল। আমি যখন আরও বেশি হোঁচট খেয়েছি ... "র‌্যাডিক্যাল" ইএস পদ্ধতির যেমন টি-মেশিনের মতো

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

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

নিম্নলিখিত উদাহরণটি আমার কী বোঝায় তা দেখায় (এটি গেম ইঞ্জিন আর্কিটেকচার, অধ্যায় 14 এ পাওয়া একটি উদাহরণ থেকে অনুপ্রাণিত)।

আমার যানবাহনের জন্য একটি ছোট গাছ থাকবে। মূল যানবাহন শ্রেণীর একটি রেন্ডারিং উপাদান, একটি সংঘর্ষের উপাদান, অবস্থানের উপাদান ইত্যাদি থাকবে ..

তারপরে একটি ট্যাঙ্ক, যানবাহনের একটি সাবক্লাসগুলি সেগুলি থেকে সেই উপাদানগুলির উত্তরাধিকারী হবে এবং এটি তার নিজস্ব "কামান" উপাদান দেওয়া হবে।

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

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

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

আপনার মতামত?

পিএস: আমি জাভা ব্যবহার করছি, সুতরাং সাধারণ উপাদান ব্যবহার না করে এটি বাস্তবায়নের জন্য একাধিক উত্তরাধিকার ব্যবহার করা সম্ভব নয়।

পিপিএস: নির্ভরশীল উপাদানগুলি একে অপরের সাথে সংযুক্ত করে আন্তঃগঠিত যোগাযোগগুলি করা হবে। এটি সংযুক্তির দিকে পরিচালিত করবে, তবে আমি মনে করি এটি একটি ঠিক বাণিজ্য।


2
এই সব আমার ভাল লাগছে। আপনার শ্রেণিবিন্যাস বা সত্তা ব্যবস্থায় কোনও নির্দিষ্ট উদাহরণ রয়েছে যা আপনাকে "গন্ধ" দেয়? পরিশেষে, গেমটি খাঁটি করে তোলার চেয়ে আরও বেশি কিছু করা শেষ।
drhayes

আমি করি না, তবে যেমনটি বলেছিলাম, আমার সবেমাত্র কোনও অভিজ্ঞতা আছে এবং আমি এর জন্য সেরা বিচারকের কাছ থেকে দূরে।
মিডোরি রিউউ

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

4
আমিও বন্ধ করার পক্ষে ভোট দিয়েছি। এটি একটি ভাল এবং ভাল-লিখিত প্রশ্ন, তবে জিডিএসইয়ের পক্ষে উপযুক্ত নয়। আপনি গেমডেভ.টনে এটিকে পুনরায় পোস্ট করার চেষ্টা করতে পারেন।
শান মিডলডিচ

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

উত্তর:


8

এই উদাহরণ বিবেচনা করুন:

আপনি আরটিএস তৈরি করছেন। সম্পূর্ণ যৌক্তিকতার উপযুক্ততায় আপনি একটি বেস ক্লাস করার সিদ্ধান্ত নেন GameObjectএবং তারপরে দুটি সাবক্লাস Buildingএবং Unit। এটি অবশ্যই ঠিক কাজ করে, এবং আপনি এমন কিছু দিয়ে শেষ করেন:

  • GameObject
    • ModelComponent
    • CollisionComponent
    • ...
  • Building
    • ProductionComponent
    • ...
  • Unit
    • AimingAIComponent
    • WeaponComponent
    • ParticleEmitterComponent
    • AnimationComponent
    • ...

এখন Unitআপনার তৈরি প্রতিটি সাবক্লাসে ইতিমধ্যে আপনার প্রয়োজনীয় সমস্ত উপাদান রয়েছে। এবং একটি বোনাস হিসাবে, আপনার সমস্ত ক্লান্তিকর সেটআপ কোড রাখার জন্য একটি একক জায়গা রয়েছে যা newএকটি WeaponComponent, এটি একটি AimingAIComponentএবং একটি ParticleEmitterComponentবিস্ময়কর সাথে সংযুক্ত করে !

এবং অবশ্যই, কারণ এটি এখনও উপাদানগুলিতে যুক্তি তৈরির কারণ রয়েছে, যখন আপনি শেষ পর্যন্ত সিদ্ধান্ত নেন যে আপনি একটি Towerশ্রেণি যুক্ত করতে চান যা একটি বিল্ডিং তবে একটি অস্ত্র রয়েছে, আপনি এটি পরিচালনা করতে পারেন। আপনি আপনার সাবক্লাসে একটি AimingAIComponent, একটি WeaponComponentএবং একটি যুক্ত করতে পারেন । অবশ্যই, তারপরে আপনাকে ক্লাসটি থেকে শুরু করে কোডটি খনন করতে হবে এবং অন্য কোথাও রেখে দিতে হবে, তবে এটি কোনও বড় ক্ষতি নয়।ParticleEmitterComponentBuildingUnit

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

if (myGameObject instanceof Unit)
    doSomething(((Unit)myGameObject).getWeaponComponent());

এটি আপনার Towerবিল্ডিংয়ের জন্য নিঃশব্দে কাজ করে না , যদিও আপনি সত্যই এটি কোনও অস্ত্র দিয়ে কোনও কিছুর জন্য কাজ করতে চেয়েছিলেন। এখন এটির মতো কিছু দেখতে হবে:

WeaponComponent weapon = myGameObject.getComponent(WeaponComponent.class);
if (weapon)
    doSomething(weapon);

অনেক ভাল! এটি পরিবর্তনের পরে আপনার কাছে এটি ঘটে যে আপনি লিখেছেন যে কোনও অ্যাক্সেসর পদ্ধতি এই পরিস্থিতিতে শেষ হতে পারে। তাই সবচেয়ে নিরাপদ কাজটি হ'ল তাদের সকলকে ছড়িয়ে ফেলা এবং এই এক পদ্ধতির মাধ্যমে প্রতিটি উপাদান অ্যাক্সেস করা getComponent, যা কোনও সাবক্লাসের সাথে কাজ করতে পারে। (পর্যায়ক্রমে, আপনি get*Component()সুপারক্লাসে প্রতিটি GameObjectএকধরণের যোগ করতে পারেন এবং উপাদানটি ফিরে পেতে সাবক্লাসে এগুলি ওভাররাইড করতে পারেন I'll তবে আমি প্রথমটি ধরে নেব।)

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

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


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

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

আরও সহজ উপায়ে। আপনি উত্তরাধিকারকে দরিদ্র লোকের কারখানার নিদর্শন হিসাবে ব্যবহার করে শেষ করেন।
Zardoz89

2

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


1

গেম অবজেক্টের উপর ভিত্তি করে বিদ্যমান গেমগুলিতে উপাদানগুলি ভিত্তিক সিস্টেমগুলিকে সংহত করার ক্ষেত্রে যখন কাউবয় প্রোগ্রামিংয়ের একটি নিবন্ধ আছে http://COboyprogramming.com/2007/01/05/evolve-your-heirachy/ যা আপনাকে কিছু পয়েন্টার দিতে পারে উপায় রূপান্তর করা যেতে পারে।

ইস্যু হিসাবে, আপনার মডেলটির এখনও প্লেয়ারটিকে অন্য শত্রু থেকে আলাদাভাবে পরিচালনা করতে হবে। যখন কোনও প্লেয়ার সংযোগ বিচ্ছিন্ন করে দেয় বা বিশেষ ক্ষেত্রে তাকে অন্য চরিত্রগুলি থেকে আলাদাভাবে পরিচালনা না করে আপনি স্থিতি পরিবর্তন করতে পারবেন না (অর্থাত্ প্লেয়ার এআই নিয়ন্ত্রিত হয়ে উঠছেন) special

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

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

এটি আপনার পক্ষে কাজ করতে পারে। তবে আমি একটি স্থাপত্য থেকে অন্য স্থাপত্যের বাইরে উভয়কেই মিশ্রিত করতে পারি না।

পিএস একটি ফোনে লিখিত হয়েছে তাই আমার বাহ্যিক সংস্থাগুলির সাথে লিঙ্ক করাতে খুব কঠিন সময় কাটাচ্ছে।


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

@ মিডোরিউইউ সত্তা সামগ্রীতে সমস্ত উত্তরাধিকার এড়িয়ে চলুন। অন্তর্নির্মিত প্রতিচ্ছবি (এবং অন্তর্নির্দেশ) সহ একটি ভাষা ব্যবহার করার জন্য আপনি যথেষ্ট ভাগ্যবান। ডান প্যারামিটারগুলির সাহায্যে আপনার জিনিসগুলি সূচনা করতে আপনি ফাইল (txt বা XML) ব্যবহার করতে পারেন। এটি খুব বেশি কাজ নয় এবং এটি পুনর্নির্মাণ না করে উন্নত গেম সূক্ষ্ম সুরের জন্য মঞ্জুরি দেয়। অন্তত আন্ত-উপাদান যোগাযোগ এবং অন্যান্য ইউটিলিটি কাজের জন্য, সত্তা শ্রেণি রাখুন। PS এখনও ফোনে :(
কোয়েট)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.