আমি কীভাবে আমার গেমের আর্কিটেকচারে অনেকগুলি সিলেটলেট এড়াতে পারি?


55

আমি গেমস তৈরির জন্য কোকোস 2 ডি-এক্স গেম ইঞ্জিন ব্যবহার করি। ইঞ্জিন ইতিমধ্যে অনেক সিলেটলেট ব্যবহার করে। যদি কেউ এটি ব্যবহার করে তবে তাদের কিছুটির সাথে তাদের পরিচিত হওয়া উচিত:

Director
SimpleAudioEngine
SpriteFrameCache
TextureCache
EventDispatcher (was)
ArmatureDataManager
FileUtils
UserDefault

সামগ্রিক প্রায় 16 টি ক্লাস সহ আরও অনেক কিছু। আপনি এই পৃষ্ঠায় অনুরূপ তালিকাটি পেতে পারেন: কোকোস 2 ডি-এইচটিএমএল 5 ভি 3.0- তে সিঙ্গলটন অবজেক্টস তবে আমি যখন গেমটি লিখতে চাই তখন আমার আরও বেশি সিঙ্গলেট দরকার:

PlayerData (score, lives, ...)
PlayerProgress (passed levels, stars)
LevelData (parameters per levels and level packs)
SocialConnection (Facebook and Twitter login, share, friend list, ...)
GameData (you may obtain some data from server to configure the game)
IAP (for in purchases)
Ads (for showing ads)
Analytics (for collecting some analytics)
EntityComponentSystemManager (mananges entity creation and manipulation)
Box2dManager (manages the physics world)
.....

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

 - bad testability
 - no inheritance available
 - no lifetime control
 - no explicit dependency chain
 - global access (the same as global variables, actually)
 - ....

আপনি এখানে কিছু চিন্তাভাবনা খুঁজে পেতে পারেন: https://stackoverflow.com/questions/137975/ কি- is - so- bad - about- singletons এবং https://stackoverflow.com/questions/4074154/when-should-the-singleton -pattern নয়-করা ব্যবহৃত-ব্যতীত-সুস্পষ্ট

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

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


26
সিঙ্গেলনের বিরুদ্ধে তর্ককারী বেশিরভাগ লোকেরা বুঝতে পারে না যে সমস্ত কোডের মাধ্যমে কিছু তথ্য / কার্যকারিতা প্রচার করার জন্য যে কাজটি করা হয়েছিল সেটি সিঙ্গলটন ব্যবহারের চেয়ে বাগের উত্স হতে পারে। সুতরাং মূলত তারা তুলনা করছেন না, কেবল প্রত্যাখ্যান করে ==> আমি অবিশ্বাসিত এককত্বকে একটি ভঙ্গি বলে সন্দেহ করি :-) ঠিক আছে, সিঙ্গেলনের ত্রুটি রয়েছে, তাই যদি আপনি এটি এড়াতে পারেন তবে এটি করুন যাতে আপনি তার সাথে আসা সমস্যাগুলি এড়িয়ে যান you , এখন আপনি যদি না পারেন তবে পিছনে ফিরে তাকাবেন না। সর্বোপরি, কোকোস 2 ডি 16 টি
সিলেটলেটগুলির

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

আমি ধরে নিই যে এই সিঙ্গলেটগুলি তখন বিশ্বব্যাপী অ্যাক্সেসযোগ্য? যে প্যাটার্ন এড়ানোর এক কারণ হতে পারে।
পিটার - মনিকা পুনরায়

উত্তর:


41

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

এক, আরম্ভ এবং ক্লিনআপ ক্রম সহজ এবং পরিষ্কার। সিঙ্গলটনের মাধ্যমে অন্য যে কোনও জায়গায় দুর্ঘটনাক্রমে একটি পরিষেবা আরম্ভ করার উপায় নেই।

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

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


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

2
এটি আসলে কোনও সমাধান সরবরাহ করে না ... সুতরাং আপনার প্রোগ্রামের ক্লাসটিতে এতে একক সিঙ্গলটন অবজেক্ট রয়েছে এবং এখন দৃশ্যের জন্য কোডের মধ্যে 10 স্তরের গভীর কিছু স্তর রয়েছে those সেই সিলেটলেটগুলির মধ্যে একটির কীভাবে এটি পাস হবে?
যুদ্ধ

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

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

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

17

আমি সিলেটলেটের পিছনে দুষ্টতা সম্পর্কে আলোচনা করব না কারণ ইন্টারনেট আমার চেয়ে আরও ভাল এটি করতে পারে।

আমার গেমগুলিতে আমি সংখ্যক একক সিলেটলেট / পরিচালক এড়াতে সার্ভিস লোকেটার প্যাটার্নটি ব্যবহার করি ।

ধারণা বেশ সহজ। আপনার কাছে কেবলমাত্র একটি সিঙ্গলটন রয়েছে যা আপনি সিঙ্গেলটন হিসাবে ব্যবহার করেছেন তা পৌঁছানোর জন্য একমাত্র ইন্টারফেসের মতো কাজ করে। বেশ কয়েকটি সিঙ্গেলটন থাকার পরিবর্তে আপনার কাছে এখন কেবল একটি।

কলগুলি:

FlyingToasterManager.GetInstance().Toast();
SmokeAlarmManager.GetInstance().Start();

সার্ভিস লোকেটার প্যাটার্নটি ব্যবহার করে এরকম দেখাচ্ছে:

SvcLocator.FlyingToaster.Toast();
SvcLocator.SmokeAlarm.Start();

আপনি দেখতে পাচ্ছেন যে প্রতিটি সিঙ্গলটন সার্ভিস লোকেটারটিতে রয়েছে।

আরও বিস্তারিত ব্যাখ্যা করতে আমি আপনাকে কীভাবে লোকেটার প্যাটার্নটি ব্যবহার করতে হয় সে সম্পর্কে এই পৃষ্ঠাটি পড়ার পরামর্শ দিচ্ছি ।

[ সম্পাদনা ]: মন্তব্যে নির্দেশিত হিসাবে, সাইট গেমপ্রগ্রামিংপ্যাটার্নস.কম- এ সিঙ্গলটনের একটি খুব আকর্ষণীয় বিভাগ রয়েছে ।

আমি আসা করি এটা সাহায্য করবে.


4
এখানে লিঙ্কযুক্ত সাইট, গেমপ্রগ্রামিংপাটর্নস ডট কম, সিঙ্গলেটনে একটি অধ্যায় রয়েছে যা প্রাসঙ্গিক বলে মনে হয়।
এজেপি 15243

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

2
আপনি কি "সঠিক নির্ভরতা ইনজেকশন" সম্পর্কে বিস্তারিত বলতে পারেন?
ব্লু উইজার্ড

17
এটি সমস্যাটিকে সত্যই সহায়তা করে না। এটি মূলত প্রচুর একক একক একক একক একত্রে মিশ্রিত করে। অন্তর্নিহিত কাঠামোগত সমস্যাগুলির কোনওটিই স্থির বা এমনকি সম্বোধন করা হয়নি, কোডটি এখনও তার ঠিক প্রিটিটারকে দুর্গন্ধযুক্ত করে তোলে।
ক্লাসিকথান্ডার

4
@ ক্লাসিকথ্যান্ডার যদিও এটি প্রতিটি একক ইস্যুটির সমাধান করে না, এটি সিঙ্গলেটনের তুলনায় এটি একটি বড় উন্নতি কারণ এটি বেশ কয়েকটি সমাধান করে। বিশেষত, আপনি যে কোডটি লিখেছেন তা আর কোনও একক শ্রেণিতে মিলিত হয় না, বরং একটি ইন্টারফেস / শ্রেণীর শ্রেণীর হয়। এখন আপনি সহজেই বিভিন্ন পরিষেবার বিভিন্ন প্রয়োগ বাস্তবায়ন করতে পারেন।
14'9 এ ঝাঁকুনি

12

এই সমস্ত উত্তর, মন্তব্য এবং নিবন্ধগুলি উল্লেখ করে পড়া, বিশেষত এই দুটি উজ্জ্বল নিবন্ধ,

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

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

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

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

সম্পাদনা: এক বছর কাজ করার পরে এবং সরাসরি ডিআই ব্যবহার করার পরে এবং বিশাল নির্মাতা এবং প্রচুর প্রতিনিধিদের সাথে সমস্যা হওয়ার পরে, আমি আরও গবেষণা করেছি এবং একটি ভাল নিবন্ধ পেয়েছি যা ডিআই এবং পরিষেবা লোকেটার পদ্ধতি সম্পর্কে ভাল এবং কনস সম্পর্কে আলোচনা করে। মার্টিন ফওলারের এই নিবন্ধটির ( http://www.martinfowler.com/articles/inication.html ) উদ্ধৃত করে যা ব্যাখ্যা করে যে আসলে পরিষেবা লোকেটারগুলি কখন খারাপ হয়:

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

তবে যাইহোক, আপনি যদি আমাদের প্রথমবার ডিআই করতে চান তবে আপনার এটি পড়তে হবে http://misko.hevery.com/2008/10/21/d dependency-inication-myth-references-passing/ নিবন্ধ (@ ম্যাগদান দ্বারা চিহ্নিত) , এর খুব সতর্কতা অবলম্বন মনযোগ দ্বারা Demeter আইন (লোদ) অথবা অন্তত জ্ঞান নীতিকে


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

3

কোনও কোড বেসের অংশগুলি কোণঠাসা বস্তু বা ফাউন্ডেশন শ্রেণি হিসাবে বিবেচনা করা অস্বাভাবিক নয়, তবে এটি জীবনচক্রকে সিঙ্গলটন হিসাবে নির্ধারিত করার ন্যায়সঙ্গত করে না।

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

তাই নিজেকে রক্ষা করুন যা বজায় রাখা সহজ।

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

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

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


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

1

সিঙ্গেলটন একটি বিখ্যাত নিদর্শন, তবে এটি কীভাবে কাজ করে তার উদ্দেশ্যগুলি এবং এর পক্ষে ভাল তা জানা ভাল।

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

অন্যদিকে, আপনার যদি একটি নির্দিষ্ট কার্যকারিতা প্রয়োজন হয় যা কেবলমাত্র নির্দিষ্ট সময়ে ব্যবহৃত হয়, আপনার পাস করা রেফারেন্স পছন্দ করা উচিত ।

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

আপনাকে অবশ্যই কোনও উপাদানটির পরিবর্তে কোনও সার্ভিসের মতো সিঙ্গলটন দেখতে হবে ।

সিঙ্গলেটগুলি কাজ করে, তারা কোনও অ্যাপ্লিকেশন কখনও ভাঙেনি। তবে তাদের অভাবগুলি (আপনি প্রদত্ত চারটি) হ'ল কারণগুলি আপনি কোনওটি তৈরি করবেন না।


1

ইঞ্জিন ইতিমধ্যে অনেক সিলেটলেট ব্যবহার করে। যদি কেউ এটি ব্যবহার করে তবে তাদের কিছুটির সাথে তাদের পরিচিত হওয়া উচিত:

অচেনা কারণ সিংলেটন এড়ানো প্রয়োজন হয় না।

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

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

এই পরিষেবাগুলির একক কারণ এটির ভাল কারণ। তবে, আপনার তালিকাভুক্ত ক্লাসগুলিতে সিলেটলেট থাকার কোনও ভাল কারণ নেই।

কারণ আমার গেমটিতে আমার খুব আলাদা জায়গায় তাদের প্রয়োজন হবে এবং ভাগ করে নেওয়া অ্যাক্সেসটি খুব সহজ হবে।

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

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

আসুন আপনার ক্লাসগুলি পর্যায়ক্রমে দেখুন:


PlayerData (score, lives, ...)
LevelData (parameters per levels and level packs)
GameData (you may obtain some data from server to configure the game)

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


IAP (for in purchases)
Ads (for showing ads)

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


EntityComponentSystemManager (mananges entity creation and manipulation)

অন্য কথায়, একটি কনস্ট্রাক্টর এবং একটি পরিষেবা স্তর? কেন এই শ্রেণিটির কোনও স্পষ্ট সীমানা বা উদ্দেশ্য নেই সেখানেও সেখানে প্রথম স্থান আছে?


PlayerProgress (passed levels, stars)

খেলোয়াড়ের অগ্রগতি প্লেয়ার শ্রেণি থেকে আলাদা কেন? খেলোয়াড় শ্রেণীর কীভাবে তার নিজস্ব অগ্রগতির ট্র্যাক রাখতে হবে তা জেনে রাখা উচিত, যদি আপনি দায়িত্ব পৃথক করার জন্য প্লেয়ার শ্রেণির চেয়ে আলাদা শ্রেণিতে অগ্রগতি ট্র্যাকিং প্রয়োগ করতে চান তবে প্লেয়ারপ্রোগ্রেস প্লেয়ারের পিছনে থাকা উচিত।


Box2dManager (manages the physics world)

এই শ্রেণিটি আসলে কী করে তা না জেনে আমি এ বিষয়ে আর কোনও মন্তব্য করতে পারি না, তবে একটি বিষয় পরিষ্কার যে এই শ্রেণীর নামটি খারাপ।


Analytics (for collecting some analytics)
SocialConnection (Facebook and Twitter login, share, friend list, ...)

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

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


-1

আমার কাছে সিলেটলেটগুলি সবসময়ই খারাপ।

আমার স্থাপত্যে আমি একটি গেম সার্ভিস সংগ্রহ তৈরি করেছি যা গেম শ্রেণি পরিচালনা করে class আমি প্রয়োজন অনুসারে এই সংগ্রহ থেকে যুক্ত করতে এবং সরাতে পারি।

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

তবে এটি কেবল আমার ইঞ্জিনে আমার নকশা, আপনার পরিস্থিতি অন্যরকম হতে পারে।

এটিকে আরও সরাসরি স্থাপন করা হচ্ছে ... কোডটির প্রতিটি অংশের মালিক হওয়ায় একমাত্র আসল সিঙ্গলটন খেলা।

এটি উত্তরটি প্রশ্নের সার্থক প্রকৃতির উপর ভিত্তি করে এবং সম্পূর্ণভাবে আমার মতের ভিত্তিতে তৈরি, এটি সমস্ত বিকাশকারীদের পক্ষে সঠিক হতে পারে না।

সম্পাদনা করুন: অনুরোধ হিসাবে ...

ঠিক আছে এটি আমার মাথা থেকে রয়েছে কারণ এই মুহুর্তে আমার সামনে আমার কোড নেই তবে মূলত যে কোনও গেমের মূলে রয়েছে গেম ক্লাস যা সত্যই সিঙ্গলটন ... এটি হতে হবে!

তাই আমি নিম্নলিখিতগুলি যুক্ত করেছি ...

class Game
{
   IList<GameService> Services;

   public T GetService<T>() where T : GameService
   {
       return Services.FirstOrDefatult(s => s is T);
   }
}

এখন আমার কাছে একটি সিস্টেম ক্লাস (স্ট্যাটিক) রয়েছে যা পুরো প্রোগ্রাম থেকে আমার সমস্ত সিলেটলেট রয়েছে (এতে খুব সামান্য, গেম এবং কনফিগারেশন বিকল্প রয়েছে এবং এটি সম্পর্কে রয়েছে) ...

public static class Sys
{
    // only the main game assembly can set this (done by the game ctor)
    // anything can get
    public static Game Game { get; internal set; }
}

এবং ব্যবহার ...

যে কোনও জায়গা থেকে আমি এর মতো কিছু করতে পারি

var tService = Sys.Game.getService<T>();
tService.Something();

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

আমার কাছে এমন পরিষেবাও রয়েছে যা আরও নির্দিষ্ট দৃশ্যের দৃশ্যের জন্য অন্যান্য পরিষেবাদির উত্তরাধিকারী / প্রসারিত করে।

উদাহরণ স্বরূপ ...

আমার একটি পদার্থবিজ্ঞান পরিষেবা রয়েছে যা আমার পদার্থবিজ্ঞানের সিমুলেশনগুলি পরিচালনা করে তবে দৃশ্যের উপর নির্ভর করে পদার্থবিজ্ঞানের সিমুলেশন কিছুটা ভিন্ন আচরণের প্রয়োজন হতে পারে।


1
গেম পরিষেবাগুলি একবারে ইনস্ট্যান্ট করা উচিত নয়? যদি তা হয় তবে এটি কেবলমাত্র একক প্যাটার্নটি ক্লাস পর্যায়ে প্রয়োগ করা হয়নি, যা সঠিকভাবে প্রয়োগ করা সিঙ্গলটনের চেয়ে খারাপ।
গেমএলকেমিস্ট

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

10
এটি কেবলমাত্র গেম পর্যায়ে প্রয়োগ করা একটি একক প্যাটার্ন। সুতরাং মূলত এর সবচেয়ে আকর্ষণীয় দিকটি হ'ল আপনি সিঙ্গেলটন ব্যবহার করছেন না এমন ভান করার অনুমতি দেয়। যদি আপনার বসটি অ্যান্টি-প্যাটার্ন চার্চ থেকে আসে ful
গেমএলচেমিস্ট

2
আমি নিশ্চিত না যে এটি কীভাবে সিঙ্গলেটগুলি ব্যবহারের চেয়ে কার্যকরভাবে আলাদা। আপনি এই ধরণের আপনার একক বিদ্যমান পরিষেবাটিতে কীভাবে সুনির্দিষ্টভাবে অ্যাক্সেস করতে পারবেন তার মধ্যে কেবলমাত্র পার্থক্য নয়? অর্থাৎ অংশটি var tService = Sys.Game.getService<T>(); tService.Something();এড়িয়ে যাওয়া getServiceএবং সরাসরি এটি অ্যাক্সেস করার পরিবর্তে ?
খ্রিস্টান

1
@ ক্রিশ্চিয়ান: প্রকৃতপক্ষে, সার্ভিস লোকেটার অ্যান্টিপ্যাটার্নটি হ'ল এটি। দৃশ্যত এই সম্প্রদায়টি এখনও এটি প্রস্তাবিত নকশার ধরণ বলে মনে করে।
মাগাস

-1

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

উদাহরণস্বরূপ, জাভা HashMap.NET এর সাথে তুলনা করুন Dictionary। উভয়ই বেশ সমান, তবে তাদের মূল পার্থক্য রয়েছে: জাভা HashMapব্যবহার করতে কঠোর কোডড equalsএবং hashCodeএটি কার্যকরভাবে একটি সিঙ্গলটন তুলক ব্যবহার করে)। নেটগুলি কনস্ট্রাক্টর প্যারামিটার হিসাবে Dictionaryউদাহরণ গ্রহণ করতে পারে IEqualityComparer<T>। রাখার জন্য রান-টাইম ব্যয় IEqualityComparerন্যূনতম, তবে এটি যে জটিলতাটি প্রবর্তন করে তা নয়।

যেহেতু প্রতিটি Dictionaryউদাহরণ একটি এনকেপুলেট করে IEqualityComparer, এর রাজ্যটি এটিতে থাকা কীগুলি এবং তাদের সম্পর্কিত মানগুলির মধ্যে কেবল একটি ম্যাপিং নয়, পরিবর্তে কীগুলি এবং তুলনাকারী এবং তাদের সম্পর্কিত মানগুলি দ্বারা সংজ্ঞায়িত সমতা সেটগুলির মধ্যে একটি ম্যাপিং হয় । দুই স্থানেই যদি d1এবং d2এর Dictionaryএকই হোল্ড রেফারেন্স IEqualityComparerযে এটা একটা নতুন দৃষ্টান্ত উত্পাদন করা সম্ভব হবে d3যেমন যে কোন x, d3.ContainsKey(x)সমান হবে d1.ContainsKey(x) || d2.ContainsKey(x)। তবে, d1এবং d2যদি বিভিন্ন স্বেচ্ছাসেবী সমতা তুলনাকারীদের রেফারেন্স ধরে রাখতে পারে তবে সাধারণভাবে তাদের মার্জ করার কোনও উপায় থাকবে না যাতে শর্তটি ধরে থাকে তা নিশ্চিত করে।

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


1
যদিও এটি অবশ্যই আলোচনার একটি আকর্ষণীয় দিক, তবে আমি মনে করি না যে এটি আসলে ওপি কর্তৃক জিজ্ঞাসিত প্রশ্নের সমাধান করে।
জোশ

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

2
উত্তরগুলি সরাসরি প্রশ্নের উত্তর দেওয়ার জন্য যে মন্তব্যগুলি দেওয়া হয় সেগুলি সম্বোধনের জন্য নয়।
ক্লাসিকথান্ডার

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