সিঙ্গলেটন / গ্লোবালগুলির বিকল্প


16

আমি সিলেটলেটস / গ্লোবালগুলির ক্ষতি সম্পর্কে অগণিত সময় শুনেছি এবং আমি বুঝতে পারি যে তারা কেন এত ঘন ঘন ভ্রান্ত হয়।

আমি যা বুঝতে পারি না তা হ'ল মার্জিত, অ-অগোছালো বিকল্প কী। দেখে মনে হয় যে সিঙ্গলেটন / গ্লোবালগুলি ব্যবহারের বিকল্প সর্বদা আপনার ইঞ্জিনের বস্তুগুলির মাধ্যমে প্রয়োজনীয় বস্তুগুলিতে পৌঁছা না হওয়া অবধি আপনার লক্ষ লক্ষ স্তর নিচে জড়িত থাকে।

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

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

এটি কি এমন ক্ষেত্রে যেখানে একটি সিঙ্গলটন ভাল জিনিস হতে পারে, বা আমি এখানে কিছু মার্জিত সমাধান খুঁজে পাচ্ছি না?

উত্তর:


16

সিলেটলেট এবং গ্লোবালগুলির সাথে সংঘবদ্ধ হন না। গ্লোবাল ভেরিয়েবল কোন ধরণের সাধারণত প্রয়োজনীয় সময়, Singleton হয় না শুধু একটি বিশ্বব্যাপী পরিবর্তনশীল জন্য একটি প্রতিস্থাপন, কিন্তু প্রাথমিকভাবে একটি সি ++ স্ট্যাটিক আরম্ভের আদেশের সমস্যার প্রায় কাজ করতে উপায় ( এবং FQA )। (অন্যান্য ভাষায়, এটি বৈশ্বিক ভেরিয়েবল এবং বেয়ার ফাংশনের অভাবের মতো বিভিন্ন ভাষার ঘাটতিগুলি সমাধান করার একটি উপায়))

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

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


+1 টি। ভাল উত্তর এবং পরিষেবা লোকেটার প্যাটার্ন লিঙ্কের জন্য ধন্যবাদ। এটি একটি খুব আকর্ষণীয় পড়া।
বম্মজ্যাক

1

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

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

এখন আইএমএইচও যে অ্যাসেটম্যানেজার, আপনি যে কোনও একটির মতো জিনিস চান তা হ'ল সিঙ্গলটনও হতে পারে। আপনি যদি সমস্যাগুলি বুঝতে পারেন এবং সেগুলি এড়ানোর জন্য বিশেষত কোডটি (ধরে নিই যে একাধিক থ্রেড থেকে সিঙ্গলটন একসাথে অ্যাক্সেস করা হবে এবং যখন কোনও কিছু ব্লক করার দরকার পরে কাঁটাচামচ দিয়ে নিজেকে ছুরিকাঘাত করবে), তারপরে নিজেকে ছিটকে পড়ুন।


1

আমি মনে করি জেসন ডি একেবারে ঠিক - আমি কীভাবে এটি পরিচালনা করব:

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

খেলার মধ্যে:

assetManager = new AssetManager();
screenManager = new ScreenManager();
screenManager.assetManager = assetManager;

স্ক্রিনম্যানেজারে:

screen = new Screen();
screen.assetManager = assetManager;

স্ক্রিনে:

myAsset = assetManager.getBitmp("lava.png");

এখন সমস্ত পর্দার তাদের প্রয়োজনীয় যে কোনও সম্পদে অ্যাক্সেস রয়েছে। এটি গ্লোবাল বা সিঙ্গললেটগুলি ব্যবহার করার চেয়ে জটিল বা ক্রেজি নয় এবং আপনার কাছে একই অ্যাপ্লিকেশনটিতে দ্বন্দ্ব ছাড়াই 2 গেম চলার বিকল্প রয়েছে। আমাকে একবার এমন একটি গেম তৈরি করতে হয়েছিল যা 8 মিনি-গেমগুলি নিয়ে তৈরি হয়েছিল, সমস্ত একই বেস ক্লাস / কাঠামো ভাগ করে নিয়েছিল। এই রেফারেন্স পাসিং শৈলীটি ব্যবহার করতে আমাকে আমার সমস্ত গ্লোবাল / সিলেটলেটগুলিকে রিফ্যাক্টর করতে হয়েছিল এবং আমি আর পিছনে ফিরে তাকাতে পারি নি। গ্লোবাল হওয়া উচিত কেবলমাত্র এমন জিনিস যা কেবল শারীরিকভাবে একবারে অস্তিত্ব থাকতে পারে যেমন অডিও, নেটওয়ার্কিং, আই / ও ইত্যাদি can


0

আপনি সিঙ্গলটন প্রতিস্থাপনের জন্য কারখানার প্যাটার্নটি ব্যবহার করতে পারেন । তারপরে আপনি কতগুলি দৃষ্টান্ত তৈরি করতে পারেন তার উপর কারখানার শ্রেণীর নিয়ন্ত্রণ রয়েছে যা আপনি পরে যখন সহজেই পরিবর্তন করতে পারেন যখন আপনার একাধিকের প্রয়োজন হবে AssetManagerযেমন এই নিবন্ধে বলা হয়েছে :

এটি আপনাকে সিঙ্গেলনের সমস্ত নমনীয়তা দেয়, যতই সমস্যা নেই তার কাছাকাছি।


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

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

এটি স্থির পদ্ধতি সম্পর্কে, তবে এটি স্ট্যাটিক শ্রেণিতেও প্রয়োগ করা যেতে পারে।


"ক্লাসটিকে স্ট্যাটিক করে" বলতে কী বোঝ? সি ++ এর স্ট্যাটিক ক্লাস নেই। আপনার অর্থ কি কেবল স্থির পদ্ধতি রয়েছে? কেন তখন নেমস্পেসের পরিবর্তে ক্লাস করা বিরক্ত করবেন?

1
@ জো: ঠিক আছে, প্রশ্নটি আমি বুঝতে পারার সাথে সাথে সি ++ এর উপর দৃষ্টি নিবদ্ধ করে না। সি # বা জাভাতে আপনি স্ট্যাটিক ক্লাস করতে পারেন এবং আমি তাদের উল্লেখ করছি। এছাড়াও, যেমনটি আমি বলেছি, স্থির ক্লাসগুলি বেশিরভাগ সময় একটি অনুকূল সমাধান নয়, তবে বিরল ক্ষেত্রে এটি একটি বিশ্বব্যাপী মতো কাজ করতে পারে।
মাইকেল ক্লিমেন্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.