जब तक वे सही स्थानों पर उपयोग किए जाते हैं तब तक स्थिर कक्षाएं ठीक होती हैं।
अर्थात्: वे विधियां जो 'लीफ' विधियां हैं (वे राज्य को संशोधित नहीं करती हैं, वे केवल किसी तरह इनपुट को बदल देती हैं)। इसके अच्छे उदाहरण Path.Combine जैसी चीजें हैं। इस प्रकार की चीजें उपयोगी होती हैं और टेरियर सिंटैक्स के लिए बनाती हैं।
मेरे पास स्टैटिक्स की समस्याएं हैं:
सबसे पहले, यदि आपके पास स्थिर कक्षाएं हैं, तो निर्भरताएं छिपी हुई हैं। निम्नलिखित को धयान मे रखते हुए:
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 }
}
TextureManager को देखते हुए, आप यह नहीं बता सकते हैं कि एक निर्माणकर्ता को देखकर क्या आरंभिक कदम उठाए जाने चाहिए। सही क्रम में इसकी निर्भरता और प्रारंभिक चीजों को खोजने के लिए आपको कक्षा में पहुंचना चाहिए। इस स्थिति में, इसे चलाने से पहले रिसोर्सलॉडर को इनिशियलाइज़ करना होगा। अब इस निर्भरता को दुःस्वप्न के पैमाने पर और आप शायद अनुमान लगा सकते हैं कि क्या होगा। कल्पना करें कि कोड को बनाए रखने की कोशिश कर रहा है, जहां कोई प्रारंभिक क्रम का स्पष्ट आदेश नहीं है। उदाहरणों के साथ निर्भरता इंजेक्शन के साथ इसके विपरीत - उस मामले में कोड भी संकलित नहीं करेगा यदि निर्भरताएं पूरी नहीं हुई हैं!
इसके अलावा, यदि आप स्टेटिक्स को संशोधित करने वाले स्टेटिक्स का उपयोग करते हैं, तो यह कार्ड के घर जैसा है। आप कभी नहीं जानते कि किसकी पहुंच किस तक है, और डिजाइन एक स्पेगेटी राक्षस से मिलता जुलता है।
अंत में, और महत्वपूर्ण रूप से, सांख्यिकीय का उपयोग करके एक कार्यक्रम को एक विशिष्ट कार्यान्वयन के लिए जोड़ा जाता है। स्टेटिक कोड परीक्षण क्षमता के लिए डिजाइनिंग का विरोधी है। परीक्षण कोड जिसे स्टैटिक्स के साथ जोड़ा गया है वह एक बुरा सपना है। एक स्थिर कॉल को टेस्ट डबल के लिए कभी भी स्वैप नहीं किया जा सकता है (जब तक कि आप विशेष रूप से स्थिर प्रकारों का मजाक उड़ाने के लिए डिज़ाइन किए गए परीक्षण फ्रेमवर्क का उपयोग नहीं करते हैं), इसलिए एक स्थिर प्रणाली सब कुछ का कारण बनती है जो इसका उपयोग तत्काल एकीकरण परीक्षण करता है।
संक्षेप में, स्टैटिक्स कुछ चीजों के लिए और छोटे उपकरणों के लिए ठीक हैं या फालतू कोड मैं उनके उपयोग को हतोत्साहित नहीं करूंगा। हालांकि, इससे परे, वे स्थिरता, अच्छे डिजाइन और परीक्षण में आसानी के लिए खूनी दुःस्वप्न हैं।
यहाँ समस्याओं पर एक अच्छा लेख है: http://gamearchitect.net/2008/09/13/an-anatomy-of-despair-managers-and-contexts/