ইভেন্ট শিডিয়ুলারের জন্য সিঙ্গলটন প্যাটার্নটি কীভাবে এড়ানো যায়?


13

আমি আমার গেমের জন্য ইভেন্টের শিডিয়ুলার তৈরি করতে চাই, আমি মূলত কোনও গেম ইভেন্টের ট্রিগার সূচী করতে সক্ষম হতে চাই। এটি ওয়ান টাইম ট্রিগার বা পর্যায়ক্রমে ট্রিগার (5 সেকেন্ডের ভিত্তিতে "E_BIG_EXPLOSION" ট্রিগার ইভেন্ট হতে পারে ...)।

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

এক্ষেত্রে সিঙ্গলটনের ব্যবহার এড়াতে আপনি কোন নকশার প্রস্তাব করবেন?


উত্তর:


12

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

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

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

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

class CollisionResponderFactory {
  public CollisionResponderFactory (EventScheduler scheduler) {
     this.scheduler = scheduler;
  }

  CollisionResponder CreateResponder() {
    return new CollisionResponder(scheduler);
  }

  EventScheduler scheduler;
}

class CollisionResponder {
  public CollisionResponder (EventScheduler scheduler) {
    this.scheduler = scheduler;
  }

  public void OnCollision(GameObject a, GameObject b) {
    if(a.IsBullet) {
      scheduler.RaiseEvent(E_BIG_EXPLOSION);
    }
  }

  EventScheduler scheduler;
}

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


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

আপনার ক্লাসগুলি শিডিয়ুলারের কাছে কী কী ইভেন্ট প্রেরণ / গ্রহণ করে তা না জেনে এটি কার্যকরভাবে কার্যকর।

আমার ইঞ্জিনে, যে কোনও গেম
সত্তায়

7

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


1
ধন্যবাদ !, প্রতিবারই
সিঙ্গলটন

3

আমিও সিঙ্গলেটন এড়ানোর প্রবণতা রাখি তবে কয়েকটি বস্তু রয়েছে যা সিঙ্গলেটন হিসাবে সর্বাধিক উপলব্ধি করে এবং সেগুলির মধ্যে একটি কেন্দ্রীয় মেসেজিং সিস্টেম। আমি শুনেছি Despite

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

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

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

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