এক্সএনএ গেম সার্ভিস এবং গৌরবময় গ্লোবাল ভেরিয়েবলের মধ্যে পার্থক্য কী?


10

Microsoft.Xna.Framework.Gameবর্গ একটি আছে সার্ভিস সম্পত্তি প্রোগ্রামার ক্লাসের ধরন এবং পদ্ধতি যোগ করার জন্য ক্লাসের একটা নিদর্শন প্রদানের মাধ্যমে তাদের খেলা একটি পরিষেবা যোগ করার জন্য অনুমতি দেয়।

এখন, AudioComponentপ্রয়োজনীয় সমস্ত ক্লাস এবং পদ্ধতিগুলির জন্য একটি পাস করার পরিবর্তে, আপনি কেবল আপনার Gameউদাহরণটি পাস করে পরিষেবাটি সন্ধান করুন। ( পরিষেবা লোকেটার )

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

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

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


3
"পরিষেবা লোকেটারকে সমানভাবে অনেকের কাছে একটি বিরোধী-নিদর্শন হিসাবে বিবেচনা করা হয়" - [উদ্ধৃতি আবশ্যক]। স্পষ্টতই তাদের যেখানে আপনার প্রয়োজন হবে না সেগুলি ব্যবহার করা খারাপ - সমস্ত সফ্টওয়্যার নির্মানের ক্ষেত্রে সত্য - তবে আমি কখনও সার্ভিস লোকেটারকে অ্যান্টি-প্যাটার্ন বলে শুনেছি। (অন্যদিকে, আমি এমন প্রোগ্রামারদের এড়াতে চেষ্টা করি যা তাদের বেশিরভাগ সময় সর্বশেষতম প্যাটার্ন

@ জোওয়ারেসনিগ যদিও আমি আপনার সাথে একমত হই তবে আমি কিছু খনন করেছি এবং এটি পেয়েছি: blog.ploeh.dk/2010/02/03/SSLLocatorIsAntiPattern.aspx
রায় টি।

2
হ্যাঁ, তবে সেই লোকটি ডিআই ব্যবহারের বিষয়ে একটি বই বিক্রি করছে; স্পষ্টতই তিনি চান না যে আপনি সহজ কিছু ব্যবহার করুন, তবে আপনি তাঁর বইটি কিনবেন না! (সমস্ত গুরুত্বের সাথে, ফওলারের মূল ডিআই / এসএল নিবন্ধটি এই সঠিক বিষয়টি - মার্টিনফোলার.com / articles/… - এবং covered লোকটির ব্লগের

আমি আশা করি আপনি যে লিঙ্কটি সবেমাত্র মার্টিন ফোলার থেকে উত্তর হিসাবে পোস্ট করেছেন তা চিহ্নিত করতে পারলাম (যদিও এটি আমার প্রশ্ন নয়)
রায় টি।

উত্তর:


6

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

পরিষেবা লোকেটার এবং গ্লোবালগুলি সহ একটি শ্রেণীর মধ্যে পার্থক্য তৈরি করার জন্য নিম্নলিখিত উদাহরণটি বিবেচনা করুন:

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

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

যাইহোক আমি মনে করি আপনি গেম পরিষেবাদিগুলি বেশ কার্যকর পাবেন। আমি জানি সবাই এটি ব্যবহার করে। আপনাকে আরও কিছুটা সাহায্য করতে। আমি গেম পরিষেবাগুলির আশেপাশে একটি ছোট সহায়ক সহায়ক শ্রেণি তৈরি করেছি যাতে আপনি সর্বদা বেশ খানিকটা কম কাস্টিং করতে পারেন: http://roy-t.nl/index.php/2010/08/25/xna-accessing-contentmanager -আর-গ্রাফিক্স ডিভাইস-যেকোন সময়-যেকোনো সময়-গেমসারিক কনটেইনার / আমি এটি বেশ ব্যবহার করি।


জবাবের জন্য ধন্যবাদ. যে ক্লাসে একটি পরিষেবা প্রয়োজন, আপনি কি সাধারণত যখন প্রয়োজন তখনই কেবল পরিষেবার জন্য গেমসার্কেস ক্লাসের জন্য অনুরোধ করেন, বা আপনি কি ক্লাসে সদস্য ভেরিয়েবল তৈরি করেন এবং কেবল কনস্ট্রাক্টরে পরিষেবার জন্য অনুরোধ করেন? আমি মনে করি আমি যা জিজ্ঞাসা করছি তা ধীরে ধীরে return (T)Instance.GetService(typeof(T));
জন পোলিক

এছাড়াও, গেম সার্ভিস ক্লাসের এই প্রয়োগ সম্পর্কে আপনি কী ভাবেন? আমি অপ্রয়োজনীয় সিঙ্গলটনটি সরিয়েছি কারণ এতে বিমূর্তকরণটির ইতিমধ্যে কোনও বৈশিষ্ট্য নেই। এছাড়াও, আমি Serviceপ্রতিটি পদ্ধতির শেষে অপ্রয়োজনীয় প্রত্যয়টি সরিয়েছি ।
জন পোলিক

এছাড়াও, আমি মনে করি যে পরিষেবাদি AddServiceপদ্ধতি কোনও ধরণের গ্রহণের কারণটি আপনি পরিষেবার ইন্টারফেসটি নির্দিষ্ট করতে পারেন। উদাহরণস্বরূপ Services.AddService(typeof(IGraphicsDeviceManager), graphics);,। তারপরে পরিষেবাটি পুনরুদ্ধার করার সময় আপনি ইন্টারফেসটি টাইপ হিসাবে নির্দিষ্ট করতে পারেন এবং এটি আপনার নির্বাচিত সাবক্লাসে কাস্ট করতে পারেন।
জন পোলিক

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

1
ওহ, আমি আপনাকেও কস্ট করা দেখিনি। আপনি প্রথমে কাস্ট করেন তবে অবশ্যই এটি টাইপটি নির্ধারণ করতে সক্ষম :)
রায় টি।

5

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

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

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

আপনি পুরোপুরি মিলন এড়াতে পারবেন না। জিনিসগুলি অন্যান্য জিনিস ব্যবহার করে এবং এটি ছাড়া আপনার প্রোগ্রামটি কিছুই করে না। সুতরাং একমাত্র আসল প্রশ্নটি এটি কী বিমূর্ততার স্তরে রয়েছে।

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

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

তাহলে এক্সএনএ এবং গেম ডেভলপমেন্টে কেন পরিষেবাগুলির প্রস্তাব দেওয়া হচ্ছে?

আমি মনে করি না তারা গেম বিকাশে সর্বজনীনভাবে প্রস্তাবিত recommended

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