স্থির ক্লাসগুলি যতক্ষণ না তারা সঠিক জায়গায় ব্যবহার করা হয় ঠিক আছে fine
যথা: যে পদ্ধতিগুলি 'পাতা' পদ্ধতিগুলি (তারা রাষ্ট্র পরিবর্তন করে না, তারা কেবল ইনপুটটিকে কোনওভাবে রূপান্তরিত করে)। এর ভাল উদাহরণগুলি হ'ল পাথ.কোমাইনের মতো জিনিস। এই ধরণের জিনিস দরকারী এবং টিয়ার সিনট্যাক্স জন্য তৈরি।
সমস্যারস্ট্যাটিক্স নিয়ে আমার তা অনেকগুলি:
প্রথমত, আপনার যদি স্ট্যাটিক ক্লাস থাকে তবে নির্ভরতাগুলি লুকানো থাকে। নিম্নোক্ত বিবেচনা কর:
public static class ResourceLoader
{
public static void Init(string _rootPath) { ... etc. }
public static void GetResource(string _resourceName) { ... etc. }
public static void Quit() { ... etc. }
}
public static class TextureManager
{
private static Dictionary<string, Texture> m_textures;
public static Init(IEnumerable<GraphicsFormat> _formats)
{
m_textures = new Dictionary<string, Texture>();
foreach(var graphicsFormat in _formats)
{
// do something to create loading classes for all
// supported formats or some other contrived example!
}
}
public static Texture GetTexture(string _path)
{
if(m_textures.ContainsKey(_path))
return m_textures[_path];
// How do we know that ResourceLoader is valid at this point?
var texture = ResourceLoader.LoadResource(_path);
m_textures.Add(_path, texture);
return texture;
}
public static Quit() { ... cleanup code }
}
টেক্সচারম্যানেজারের দিকে তাকিয়ে আপনি কোনও কনস্ট্রাক্টরের দিকে তাকিয়ে কী আরম্ভের পদক্ষেপগুলি পরিচালনা করতে হবে তা বলতে পারবেন না। আপনাকে অবশ্যই শ্রেণীর মধ্যে নির্ভর করতে হবে এবং সঠিক ক্রমে জিনিসগুলি সূচনা করতে হবে। এই ক্ষেত্রে, চালনার আগে এটির শুরু করার জন্য রিসোর্সলাডার প্রয়োজন। এই নির্ভরতার দুঃস্বপ্নটি এখন স্কেল করুন এবং সম্ভবত কী ঘটবে তা আপনি অনুমান করতে পারেন। কোডটি বজায় রাখার চেষ্টা করুন যেখানে সূচনা করার কোনও সুস্পষ্ট আদেশ নেই order উদাহরণগুলির সাথে নির্ভরতা ইনজেকশনের সাথে এটির বিপরীতে করুন - সেক্ষেত্রে কোডটিও করবে না সেক্ষেত্রে নির্ভরতাগুলি সম্পন্ন না হলে কোডটিও সংকলিত !
তদ্ব্যতীত, আপনি যদি স্ট্যাটিকস ব্যবহার করেন যা রাষ্ট্রকে সংশোধন করে, এটি কার্ডের বাড়ির মতো। আপনি কখনই জানেন না কার কার অ্যাক্সেস রয়েছে এবং ডিজাইনটি স্প্যাগেটি দানবটির সাথে সাদৃশ্যযুক্ত।
পরিশেষে, এবং ঠিক তেমনি গুরুত্বপূর্ণ, স্ট্যাটিক্স ব্যবহার একটি প্রোগ্রামকে একটি নির্দিষ্ট বাস্তবায়নের সাথে যুক্ত করে। স্ট্যাটিক কোড হ'ল টেস্টেবিলিটির জন্য ডিজাইনের বিরোধী। স্ট্যাটিক্সের সাথে ধাঁধাযুক্ত টেস্টিং কোডটি একটি দুঃস্বপ্ন। একটি স্ট্যাটিক কল কখনই পরীক্ষার দ্বিগুণ হয়ে যায় না (যদি না আপনি স্ট্যাটিক ধরণের উপহাসের জন্য বিশেষত ডিজাইন করা টেস্টিং ফ্রেমওয়ার্কগুলি ব্যবহার করেন), সুতরাং স্থিতিশীল সিস্টেমটি যা তাত্ক্ষণিক ইন্টিগ্রেশন পরীক্ষার জন্য ব্যবহার করে এমন সমস্ত কিছুই ঘটায়।
সংক্ষেপে, স্ট্যাটিকস কিছু জিনিস এবং ছোট সরঞ্জাম বা নিক্ষিপ্ত কোডের জন্য ঠিক আছে আমি তাদের ব্যবহারকে নিরুৎসাহিত করব না। তবে এর বাইরেও এগুলি রক্ষণাবেক্ষণযোগ্যতা, ভাল নকশা এবং পরীক্ষার স্বাচ্ছন্দ্যের জন্য একটি রক্তাক্ত দুঃস্বপ্ন।
সমস্যাগুলির জন্য এখানে একটি ভাল নিবন্ধ: http://gamearchitect.net/2008/09/13/an-anatomy-of-despair-managers-and-contexts/