এটি কোন প্যাটার্নটি, এবং আমার এটি করা উচিত?


9

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

 var block:Block = new Block(gateway);

 //In the block class:
 this.gateway.player.setHealth(100);
 //Or:
 this.gateway.input.lock();

এটি কি সিঙ্গলটন প্যাটার্ন বা অন্য কিছুর মতো? আমার এই করা উচিত?

উত্তর:


13

একে কনটেক্সট অবজেক্ট ডিজাইনের প্যাটার্ন বলা হয় এবং এটি সিঙ্গলটন প্যাটার্নের চেয়ে ভাল।

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

সুতরাং না, এটি একটি সিঙ্গলটন নয়, এটি একটি সিঙ্গলটনের চেয়েও ভাল।

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

প্রসঙ্গের বিভিন্ন স্তর বিবেচনা করুন, উদাহরণস্বরূপ:

  • গেমপ্লে কনটেক্সট - প্লেয়ার, শত্রু, স্তর জ্যামিতি ইত্যাদির মালিক etc.
  • ইনপুট কনটেক্সট - কীবোর্ড এবং মাউস হ্যান্ডলস, ইনপুট ইভেন্টগুলি ইত্যাদির মালিক
  • গ্রাফিকস কনটেক্সট - টেক্সচারের মালিক, উইন্ডো হ্যান্ডেল ইত্যাদি s
  • গ্লোবাল কনটেক্সট - একটি গেমপ্লেকন্টেক্সট, একটি গ্রাফিকস কনটেক্সট এবং একটি ইনপুটকন্টেক্সটের মালিক। এটি অন্যদের জন্য প্রয়োজন অনুসারে কিছু প্রসঙ্গকে সরিয়ে নিতে সক্ষম হবার জন্য আপনি পরিষেবা লোকেটার প্যাটার্নটি প্রয়োগ করতে চান । এবং সম্ভবত, দ্রুত পুনরাবৃত্তি এবং পরীক্ষার জন্য, এটি একটি বাস্তব বৈশ্বিক পরিবর্তনশীল হওয়া উচিত - কেবলমাত্র বুঝতে হবে যে আপনি যখনই এটি ব্যবহার করবেন, আপনি প্রযুক্তি debtণ তৈরি করছেন

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


+1 ভাল উত্তর। কিছু গতি বা থ্রেডিং উদ্বেগ সত্যিকার অর্থে এই প্রসঙ্গে প্রযোজ্য না (যদিও অ্যাকশনস্ক্রিপ্ট 3 থ্রেডিং সমর্থন করে না এবং AS3 ব্যবহারের সময় সি ++ এ কাজ করে এমন প্রচুর গতি উন্নত করার পদ্ধতি প্রয়োগ করে না)।
bummzack

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

0

এটি সিঙ্গলটন প্যাটার্নের মতো দেখাচ্ছে না। আমি এটি যেভাবে বুঝতে পারি, আপনি আপনার সমস্ত দৃষ্টান্তের জন্য গুরুত্বপূর্ণ গেম-অবজেক্টের উল্লেখ সহ একটি বস্তুটি পাস করছেন।

এটি যদি সিঙ্গলটন প্যাটার্ন হয় তবে আপনার কাছে:

AudioManager.getInstance().playSound(XY);

তবে আপনার ক্ষেত্রে আপনার থাকতে পারে:

this.gateway.getAudioManager().playSound(XY);

এটি দেখতে মূলত একইরকম, তবে এটি আসলে তা নয়। আপনি যদি AudioManagerকোনও নতুন (বর্ধিত শ্রেণি) এর মতো প্রতিস্থাপন করতে চান তবে আপনি ExtendedAudioManagerসিঙ্গলটন প্যাটার্নটি ব্যবহার করে কোনও দেয়ালে আঘাত করবেন। আপনার গেটওয়ে পদ্ধতির যদিও এটি ঠিক আছে পরিচালনা করবে।

আপনার পদ্ধতির অপূর্ণতা হ'ল আপনাকে gatewayসর্বত্র সর্বত্র যেতে হবে। সেবা লোকেটার প্যাটার্ন (ইন জো Wreschnig দ্বারা প্রস্তাবিত এই থ্রেড), আপনার "গেটওয়ে প্যাটার্ন" জন্য একটি ভাল প্রতিস্থাপন মত দেখায়।

কখনও কখনও ওভার ডিজাইনিংয়ের পরিবর্তে সহজ এবং সোজা পদ্ধতিতে চালানো ভাল। বিশেষত যখন এটি একটি ছোট প্রকল্প বা প্রোটোটাইপ হয়। হতে পারে যে আপনি gatewayকিছু ধরণের একটি বৈশ্বিক পরিবর্তনশীল .. উদাহরণস্বরূপ। Game.gatewayএবং এটি দিয়ে চালান।


-2

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


এই উত্তরটি তৈরি করার পর থেকেই প্রশ্নটি যথেষ্ট পরিবর্তিত হয়েছে, এটিকে সম্পাদনা করার পক্ষে এটি যথেষ্ট উপযুক্ত বলে মনে হচ্ছে না।
গ্রেগরি অ্যাভেরি-ওয়েয়ার

2
শিরোনাম ছাড়াও প্রশ্নটিতে কিছুই পরিবর্তন হয়নি।
বাম্মজ্যাক

1
কি? শিরোনাম ব্যতীত আর কিছুই পরিবর্তন হয়নি। -1
আক্রমণকারীহোব

আমি মনে করি আমি এখানে শিরোনাম নিয়ে ভাবছিলাম; আমি মনে করি মূল শিরোনাম "আমি এটি কীভাবে করব?" উত্তরটি তৈরি করার সময় আমি প্রাথমিক শিরোনাম / প্রশ্নটি ভুলভাবে লিখতে পারি তা সম্পূর্ণ সম্ভব।
গ্রেগরি অ্যাভেরি-ওয়েয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.