क्या XNA में Game1 स्टेटिक का होना एक बुरा विचार है?


10

क्या मेरी Game1कक्षा को स्थैतिक होना वास्तव में बुरा विचार है ? जैसा कि मेरी Game1कक्षा में इस समय मेरे पास एक वर्ग है, TileHandlerजो मेरे वर्तमान टाइल्स के सेट के साथ सब कुछ संभालता है, और AnimalHandlerजो मेरे सभी जानवरों (आश्चर्यजनक रूप से) को संभालता है।

अब अगर मैं अंदर हूं AnimalHandlerऔर यह जांचना चाहता हूं कि क्या कोई टाइल चलने योग्य है TileHandlerतो इससे समस्याएं पैदा होती हैं या मुझे चलने योग्य टाइलों की सूची पास करनी होगी AnimalHandler, जो मैं नहीं करूंगा।

क्या आसान होगा Game1स्थैतिक और फिर AnimalHandlerबस में जाओ Game1._tileHandler.WalkableTile(position)

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

जवाबों:


9

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

जब आपके पास एक चमकदार नया हथौड़ा होता है, तो हर समस्या नाखून की तरह दिखती है।

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

यहाँ आपके मुद्दे की जड़ है:

... अगर मैं अंदर हूं AnimalHandlerऔर यह जांचना चाहता हूं कि क्या कोई टाइल TileHandlerतब से चलने योग्य है , जिससे समस्या होती है या मुझे चलने योग्य टाइलों की एक सूची पास करनी होगी AnimalHandler, जो मैं नहीं करूंगा।

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

एक छोटे से खेल के लिए जिसे पैमाना बनाने की जरूरत नहीं है, यह एक समस्या नहीं होगी, प्रति se, लेकिन यह आपको एक बुरी आदत का रास्ता दिखा सकता है, इसलिए आप इसे नहीं करने पर विचार करना चाह सकते हैं। कम से कम अगले प्रोजेक्ट के लिए इसे ध्यान में रखें जिस पर आप काम करते हैं।


तथास्तु! आप एक महान बिंदु पर स्पर्श करते हैं जो मैंने वास्तव में मेरे उत्तर के बारे में बात नहीं की थी।
नैट

+1 निर्भरताएँ छुपाना और वैश्विक स्थिति का परिचय देना वास्तव में यहाँ मुद्दा है
ashes999

4

कारण यह है कि एक स्थिर संदर्भ में टाइलहैंडलर को कॉल करना सबसे अच्छा संभव डिज़ाइन नहीं है, यह है कि यह आपके डिजाइन के कुछ घटक है जो अन्यथा डिकॉउंड किया जा सकता है।

यदि आप भविष्य में एक से अधिक टाइलहैंडलर चुनते हैं, तो आपको इस परिवर्तन को समायोजित करने के लिए बहुत सारे काम करने होंगे।

यदि आप टाइलहैंडलर को हटाने का विकल्प चुनते हैं, तो आपको इस परिवर्तन को समायोजित करने के लिए बहुत काम करना होगा।

मान लीजिए कि आप भविष्य में एक अलग स्तर / क्षेत्र बनाते हैं, जो आपके वर्तमान टाइलहैंडलर से अलग तरीके से टाइलों को संभालता है। तब आपको या तो उपयोग करने के लिए टाइलहैंडलिंग की विधि को निर्दिष्ट करने का एक तरीका होना चाहिए, या आपको एक अलग हैंडलर को कॉल करना होगा।

यदि टाइलहैंडलर वस्तुओं के पैरामीटर के रूप में पारित किया गया था जो इसका उपयोग करते हैं, तो आप बस अगली बार एक अलग पास कर सकते हैं, या बाद में उपयोग करने वाली वस्तुओं पर एक अलग टाइल हैंडलर सेट कर सकते हैं।

व्यक्तिगत रूप से, मैं अपने XNA गेम्स में कई चीजें स्थिर संदर्भ से प्राप्त करता हूं, और यह मानता हूं कि मेरे पास उनमें से एक से अधिक कभी नहीं होगा।

यदि आप अपने गेम इंजन कोड को अपने अगले गेम में फिर से उपयोग करने में सक्षम होना चाहते हैं, तो आप संभवतः उस सामान को फिर से लिखने जा रहे हैं जिसे आपने वर्तमान में स्थिर लिखा है।

संक्षेप में:

स्थिर संदर्भ का उपयोग नहीं करने के पक्ष में:

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

स्थिर संदर्भ के पक्ष में:

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


2

मुझे नहीं लगता कि यह एक साधारण खेल के लिए एक सुपर बुरा विचार है, लेकिन आप http://www.nuclex.org/articles/4-altecture/6-game-compenders-and-game-services के लिए भी देख सकते हैं इंटरकम्प्युटिंग गेम घटकों का निर्माण करने के तरीके पर एक बेहतर विचार


आप के लिए किसी भी समस्या के बारे में सोच सकते हैं अगर यह सिर्फ एक साधारण खेल नहीं था?
हेरोल्ड

कोड पठनीयता, परीक्षणशीलता और अच्छी वास्तुकला प्रथाओं से बचने का सुझाव देंगे।
स्मार्ब्स

2

TileHandler और AnimalHandler जैसी चीजें मैं एक गेम स्क्रीन में उच्च स्तर पर रखूंगा। क्या आपके शीर्षक स्क्रीन को टाइलहैंडलर तक पहुंचने की आवश्यकता है और क्या यह प्रारंभिक है जब खेल पहले लोड किया जाता है? शायद ऩही।

की जाँच करें XNA राज्य प्रबंधन नमूना । इसमें बहुत सारे कोड हैं, लेकिन मूल रूप से बेस गेम सिर्फ गेम स्टेट्स (या स्क्रीन) के ढेर को इनिशियलाइज़ करता है। प्रत्येक स्क्रीन दूसरों से काफी स्वतंत्र है और गेम के एक सरलीकृत संस्करण के रूप में चलती है। आपके PlayScreen में स्थिर सदस्य हो सकते हैं इसलिए वे PlayScreen घटकों के लिए सुलभ हैं।

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


0

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

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

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


0

हाँ, यह हमेशा एक बुरा विचार है।

स्थैतिक कक्षाओं में डेटा (यानी कुछ भी लेकिन केवल स्थिरांक और देखने की मेज) बदलने वाली वस्तुओं को चालू करना, जहां अच्छा डिजाइन एक गोता लेता है।

  1. यह बहुत हद तक निर्भरता को बढ़ावा देता है जो प्रतिरूपता को मारता है और कोड के पुन: उपयोग के तरीके में मिलता है। मान लें कि आप अपने खेल के लिए एक संपादक लिखना चाहते थे - आपके पास अचानक बहुत सारी कक्षाएं होंगी, Game1जिनके लिए आप आसानी से साझा लाइब्रेरी में नहीं जा सकते।

  2. आपका कोड अप्राप्य हो जाता है। यूनिट परीक्षण अलग-अलग वर्गों को उनकी निर्भरता (जो संभव के रूप में कम से कम रखा जाना चाहिए) का मज़ाक उड़ाकर या अनुकरण करके बाकी से अलग करके काम करता है। कोई भी स्थिर वर्ग एक दायित्व है क्योंकि इसे किसी भी समय एक्सेस किया जा सकता है, कई परीक्षणों पर राज्य ले जा सकता है या परीक्षणों के सफल होने से पहले इसे आरंभ करने की आवश्यकता होती है।

  3. यह निर्भरता को छुपाता है। सेवा प्रदाता एंटी-पैटर्न (XNA, Game.Services द्वारा नियोजित) की तरह, आपकी कक्षाएं निर्भरताएं चुन सकती हैं, जिन्हें आप बाहर नहीं देखते हैं।

यह दृष्टिकोण विशेष रूप से जहरीला हो जाता है यदि कोई फ्रेट ट्रेन कॉल्स (चीजों को समान रूप से Game.Instance.ActorManager.Enemies.FindInRange(10)- तो ट्रेन कार की तरह जंजीर प्रतीकों के कारण) के साथ स्थिर वर्गों को जोड़ता है , जहां घटकों को न केवल एक Gameवर्ग की आवश्यकता होती है , लेकिन एक स्थिर Instanceसंपत्ति के साथ जो कुछ के साथ वापस आती है एक ActorManagerसंपत्ति जिसमें एक संपत्ति होती है जो Enemiesएक FindInRange()विधि के साथ एक वस्तु लौटाती है ।

केवल एक ही बहाना जिसे मैं म्यूट स्थिर वर्ग लिखने के लिए स्वीकार करता हूं वह होगा जो अभी भी सीख रहा है और इसमें अभी भी अच्छे डिजाइन लागू करने की क्षमता नहीं है और बुरे विकल्प चुनने के लिए एक प्रशिक्षित आंख है।

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