यदि "ResourceManager" वर्गों को बुरा माना जाता है, तो विकल्प क्या हैं?


19

मैं परस्पर विरोधी राय सुन रहा हूँ जैसे:

  • "समर्पित प्रबंधक कक्षाएं लगभग कभी भी सही इंजीनियरिंग उपकरण नहीं होती हैं"
  • "समर्पित प्रबंधक कक्षाएं (वर्तमान में) हजारों संसाधनों के साथ एक बड़ी परियोजना को जीवित करने का सबसे अच्छा तरीका है"

आइए एक क्लासिक रिसोर्समैन क्लास लें जिसमें निम्न कार्यक्षमता हो:

  • भार संपत्ति (बनावट, ऑडियो, 3D मॉडल आदि)
  • सुनिश्चित करता है कि संपत्तियां केवल एक बार कैश रखकर लोड की गई हैं
  • संदर्भ परिसंपत्तियों को यह निर्धारित करने के लिए गिनता है कि क्या उन्हें निपटाया जा सकता है
  • छुपाता है कि वास्तविक संपत्ति कहाँ से आई है (उदाहरण के लिए, एक फ़ाइल प्रति संपत्ति या एक पैकेज फ़ाइल में सभी परिसंपत्तियाँ हो सकती हैं, या संपत्ति नेटवर्क पर भी लोड की जा सकती हैं)
  • कार्यक्रम को फिर से शुरू किए बिना संपत्ति को फिर से लोड कर सकते हैं, जो खेल पर काम करने वाले कलाकारों के लिए बेहद उपयोगी है।

चलो भी लेते हैं "सिंगलटन खराब होते हैं" तालिका को बंद करके तर्क देते हैं कि इन संसाधन प्रबंधक ऑब्जेक्ट सिंगललेट नहीं हैं, और इसके बजाय निर्भरता इंजेक्शन के माध्यम से पारित किए जाते हैं ।

फिर "एक कारखाने का उपयोग करें" या "इसे एक कारखाना कहें" तर्क है। इसके साथ मेरी समस्या यह है कि, हाँ, यह एक कारखाना है, लेकिन यह एक कैश और एक लोडर (बेहतर शब्द की कमी के लिए) भी है। इसे एक कारखाने के रूप में वर्णित करना ठीक से वर्णन नहीं करता है, और अगर मैं इसे एक उचित कारखाना बनाता हूं, तो कैशिंग और पुनः लोडिंग कहां लागू होती है?

मैं सहमत हूं कि "प्रबंधक" कक्षाएं अक्सर खराब वास्तुकला का एक लक्षण हैं, लेकिन इस विशेष मामले में यह कैसे पुनर्गठन किया जा सकता है और अभी भी सभी कार्यक्षमता को बनाए रख सकता है ? क्या यह ऐसी स्थिति है जहां "प्रबंधक" वर्ग वास्तव में उपयुक्त है?


3
शायद इसे कारखाने के बजाय गोदाम कहें? : पी
deceleratedcaviar

जवाबों:


9

मुझे लगता है कि मुद्दा यह नहीं है कि यह एक खराब डिजाइन है। मुद्दा यह है कि "मैनेजर" नाम नॉन्डस्क्रिप्ट है, जैसे "अपडेट" और "प्रोसेस" और "एक्टर"। यह इस प्रणाली को समझने का प्रयास करने वाले किसी व्यक्ति के लिए अनपेक्षित है, और यह भ्रम पैदा करता है यदि आपके पास कभी अन्य वर्ग होते हैं जो संपत्ति पर कुछ ऑपरेशन करते हैं।

हालांकि, चीजों का इस तरह से नामकरण करना जो कुशलता से उनके उद्देश्य को व्यक्त करते हैं , वास्तव में वास्तव में कठिन है । अधिकांश प्रणालियां अपने नाम से स्पष्ट किए जाने के लिए बहुत जटिल हैं। आप जो सबसे अच्छा कर सकते हैं, वह संकीर्ण करने की कोशिश करता है कि कौन सा विशिष्ट विचार यह एक वर्ग को एकजुट करता है, और अन्य वर्गों को स्पष्ट रूप से अलग होने की आवश्यकता है, और एक अनूठा शब्द चुनें जो इस तरह के फिट बैठता है।

IMHO, एक अच्छे नाम की सबसे महत्वपूर्ण विशेषता यह है कि यह इस संदर्भ में अद्वितीय है कि लोग इसे (कोड आधार) देखेंगे, और यह याद रखना आसान है। परीक्षण ऐसा होना चाहिए कि क्या आप अपने टीम के साथियों के साथ बातचीत कर सकते हैं, जो स्पष्ट रूप से बताए बिना कोड से परिचित हैं कि आप क्या उल्लेख कर रहे हैं। यदि आपको कभी भी संदर्भ दस्तावेज़ीकरण लिखने की आवश्यकता हो तो यह भी मदद करेगा।

अंत में, विचार करें कि यदि आप उस सामंजस्यपूर्ण विचार का वर्णन नहीं कर सकते हैं, तो यह बहुत सामंजस्यपूर्ण नहीं हो सकता है। उदाहरण के लिए, आप कैशिंग और रेफ़रिंग काउंटिंग को एक एसेटकैच में अलग कर सकते हैं, और एसेटेलैडेर में लोडिंग रख सकते हैं। लेकिन यह वास्तव में निर्भर करता है कि कोड कितना जटिल और अंतर्संबंधित है।

लेकिन अगर आपका AssetManager काफी सुसंगत है, और आपके खेल में और कुछ नहीं है, तो यह पूरी तरह से अच्छा नाम हो सकता है।


AssetLoader / AssetCache जुदाई एक बुरा विचार नहीं है।
टॉम डेलिंग

4

"क्या मैं यह एक जगह पर करता हूं, या क्या मैं इसे कई बार करता हूं?"

लोडिंग लॉजिक को आमतौर पर एकल बिंदु तक पहुंच के लिए केंद्रीकृत किया जाता है क्योंकि यह केवल एप्लिकेशन के प्रमुख बिंदुओं पर चलाया जाता है, जहां हम इसे एएसएपी से बाहर निकालने की कोशिश कर रहे हैं। यह आमतौर पर ऐप स्टार्टअप, गेम स्तर स्टार्टअप, या जब खिलाड़ी विश्व स्थिति अनुभव को सहज रखने के लिए एक नया हिस्सा लोड करने की मांग करता है। इसे देखते हुए एक बैच प्रक्रिया के रूप में किया जाता है (चाहे एक बड़े पैमाने पर चंक में या कई छोटे वाले वास्तव में कोई फर्क नहीं पड़ता), इस प्रक्रिया को किक करने के लिए एक विधि या कॉल करने के तरीकों का सेट होना आवश्यक है।

अधिकांश प्लेटफार्मों पर, लोडिंग अतुल्यकालिक है, इसलिए आपके पास वास्तव में बहुत कम विकल्प हैं लेकिन लोडिंग और अन्य ऐप लॉजिक को अलग करने के लिए कोड फ्लो रखने के लिए, संसाधन प्रबंधन कार्यों के अमूर्त होने का एक और कारण उनकी अपनी कक्षा में है।

अंत में, कुछ बिंदुओं पर सोचने के लिए:

संसाधन लोडिंग को उदाहरण के साथ तुलना में बहुत बार नहीं चलाया जाता है। गेम लॉजिक, तो क्या ऐसा करने के लिए आपके व्यक्तिगत गेम ऑब्जेक्ट्स में जटिलता जोड़ने लायक है? गेम ऑब्जेक्ट्स को आमतौर पर संभव के रूप में हल्का रखा जाता है और केवल सिमुलेशन के दौरान क्या आवश्यक है, इसके लिए इरादा है।

क्या किसी वस्तु के स्वयं के निर्माण और विनाश के लिए जिम्मेदार होना चाहिए ? यह इकाई प्रबंधन के दौरान प्रमुख सिरदर्द पैदा कर सकता है। यदि आप किसी ऑब्जेक्ट के प्रदर्शन की अपेक्षा करते हैं, तो यह स्वयं की निर्माण प्रक्रिया है (संसाधन निर्भरता प्राप्त करने सहित) तो उसी तरह यह स्वयं को नष्ट करने की जिम्मेदारी होगी। इससे नुकीले / अशक्त बिंदु हो सकते हैं, इसलिए वास्तव में इसे बाहर से प्रबंधित करना होगा। इस समस्या को अधिक विस्तार से रेखांकित करते हुए देखें ।


PS के अलावा सामान्य "सिंगलेट्स भयानक हैं" प्रकार के तर्क (जो बहुत ही हठधर्मी हैं), क्या आपने कभी रिसोर्स मैनेजर के खिलाफ एक अच्छा तर्क देखा है? "समर्पित प्रबंधक कक्षाएं लगभग कभी भी सही इंजीनियरिंग उपकरण नहीं होती हैं" इस विशिष्ट मामले के लिए कोई तर्क नहीं है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.