GameManager भगवान वस्तु से कैसे बचें?


51

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

सबसे पहले, वहाँ प्रोटोटाइप है। कोई भी महान कोड लिखने की परवाह नहीं करता है, हम सिर्फ गेमप्ले को जोड़कर देखते हैं कि कुछ चल रहा है।

फिर एक ग्रीनलाइट है, और चीजों को साफ करने के प्रयास में, कोई व्यक्ति लिखता है GameManager। शायद का एक गुच्छा धारण करने के लिए GameStates, शायद कुछ स्टोर करने के लिए GameObjects, वास्तव में कुछ भी बड़ा नहीं है। एक प्यारा, थोड़ा, प्रबंधक।

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

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

उस बिंदु पर, आमतौर पर, GameManagerएक वास्तविक बड़ी गड़बड़ है (विनम्र रहने के लिए)।

उसका कारण सरल है। सब के बाद, जब एक खेल लिख रहा है, ठीक है ... सभी स्रोत कोड वास्तव में यहाँ खेल का प्रबंधन करने के लिए है । इस छोटी सी अतिरिक्त सुविधा या बगफिक्स को जोड़ना आसान है GameManager, जहां बाकी सब कुछ पहले से ही संग्रहीत है। जब समय एक मुद्दा बन जाता है, तो अलग वर्ग लिखने या इस विशाल प्रबंधक को उप-प्रबंधकों में विभाजित करने का कोई तरीका नहीं।

बेशक यह एक शास्त्रीय विरोधी पैटर्न है: देव वस्तु । यह एक बुरी बात है, विलय करने के लिए एक दर्द, बनाए रखने के लिए एक दर्द, समझने के लिए एक दर्द, बदलने के लिए एक दर्द।

ऐसा होने से रोकने के लिए आप क्या सुझाव देंगे?

संपादित करें

मुझे पता है कि यह नामकरण का दोष है। बेशक GameManagerइस तरह के एक महान विचार एक वर्ग नहीं बना रहा है। लेकिन एक ही बात एक साफ GameApplicationया GameStateMachineया हो सकती है GameSystemजो एक परियोजना के अंत तक डक्ट-टेप-पसंदीदा हो जाती है। नामकरण से कोई फर्क नहीं पड़ता, आपके खेल कोड में कहीं न कहीं यह वर्ग है, यह अभी के लिए एक भ्रूण है: आप अभी तक यह नहीं जानते कि यह किस राक्षस बन जाएगा। इसलिए मुझे "नामकरण को दोषी ठहराने" के जवाब की उम्मीद नहीं है। मैं ऐसा होने से रोकने का एक तरीका चाहता हूं, एक कोडिंग आर्काइव और / या एक प्रक्रिया जो एक टीम यह जानकर अनुसरण कर सकती है कि यह उत्पादन के कुछ बिंदु पर होगा। यह कहना बहुत बुरा है कि बगफिक्स के एक महीने और अंतिम मिनट की विशेषताएं, सिर्फ इसलिए कि वे सभी अब एक विशाल अप्राप्य प्रबंधक में हैं।


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

@brandon मुझे आपके लिए अपने प्रश्न को फिर से बताने दें: आप अपने GameManagerऊपर बताए गए -प्रश्न को उजागर किए बिना पूरे खेल के तर्क को कैसे नियंत्रित करते हैं ?
लॉरेंट कौविदौ

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

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

जवाबों:


23

तब एक हरियाली होती है, और चीजों को साफ करने के प्रयास में, कोई एक GameManager लिखता है। शायद GameStates का एक समूह रखने के लिए, शायद कुछ GameObjects को स्टोर करने के लिए, वास्तव में कुछ भी बड़ा नहीं है। एक प्यारा, थोड़ा, प्रबंधक।

तुम्हें पता है, जैसा कि मैं यह पढ़ रहा था, मेरे सिर में बहुत कम अलार्म थे। "GameManager" नाम की कोई वस्तु कभी भी प्यारा या छोटा नहीं होने वाला है। और किसी ने कोड को साफ करने के लिए ऐसा किया? यह पहले जैसा क्या दिखता था? ठीक है, एक तरफ मजाक करता है: एक वर्ग का नाम एक स्पष्ट संकेत होना चाहिए कि कक्षा क्या करती है, और यह एक बात होनी चाहिए (उर्फ: एकल जिम्मेदारी सिद्धांत )।

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

कक्षा के आकार पर अंगूठे का एक त्वरित नियम: यदि आप प्रति वर्ग कोड की कई सौ पंक्तियों में चल रहे हैं, तो कुछ गलत हो रहा है। अति उत्साही होने के बिना, कुछ भी कहना, 300 LOC मेरे लिए एक कोड गंध है, और यदि आप 1000 से अधिक जा रहे हैं, तो चेतावनी की घंटी बंद होनी चाहिए। यह मानते हुए कि कोड की 1000 पंक्तियाँ 250 प्रत्येक के 4 अच्छी तरह से संरचित वर्गों की तुलना में समझने में सरल हैं, आप खुद को बहका रहे हैं।

जब समय एक मुद्दा बन जाता है, तो अलग वर्ग लिखने या इस विशाल प्रबंधक को उप-प्रबंधकों में विभाजित करने का कोई तरीका नहीं।

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

ऐसा होने से रोकने के लिए आप क्या सुझाव देंगे?

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

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

मुश्किल हिस्सा यह है कि बुरे कोड (और जल्दी से बेहतर डिजाइन के साथ आने के लिए एक प्रतिभा) के विकास के लिए विकास को सीखने के लिए अधिक कठिन कौशल में से एक है। मेरा सुझाव इस आशा के इर्द-गिर्द टिका है कि आपके पास टीम में कोई वरिष्ठ है जो ऐसा कर सकता है - इस तरह से लोगों को समझाना बहुत आसान है।

संपादित करें - थोड़ी अधिक जानकारी:

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

खेल के विकास के लिए विशेष रूप से, "विशेष रूप से खेल वास्तुकला" युक्तियों के बारे में स्टैकऑवरफ्लो पर इस प्रश्न का स्वीकृत उत्तर , कहते हैं:

ऑब्जेक्ट ओरिएंटेड डिज़ाइन के ठोस सिद्धांतों का पालन ​​करें ...।

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

  • उसी दिन चीजों को ठीक करें जिस दिन आप उन्हें कोड करते हैं।
  • आपको खुशी होगी कि आपने घंटों के भीतर किया।

वास्तव में विश्वास करना ऊपर वाला मुश्किल है; मैं इसे केवल अपने काम के लिए करने में कामयाब रहा हूं क्योंकि मैंने अनुभव किया है, बार-बार, प्रभाव। फिर भी, मेरे लिए कोड फिक्सिंग को सही ठहराना मेरे लिए अभी भी मुश्किल है जब मैं अधिक मंथन कर सकता हूं ... तो मैं निश्चित रूप से समझता हूं कि मैं कहां से आ रहा हूं। दुर्भाग्य से, यह सलाह शायद बहुत सामान्य है, और करना आसान नहीं है। मैं दृढ़ता से इसमें विश्वास करता हूँ, हालाँकि! :)

अपने विशिष्ट उदाहरण का उत्तर देने के लिए:

अंकल बॉब का क्लीन कोड यह बताने का एक अद्भुत काम करता है कि अच्छी गुणवत्ता कोड क्या है। मैं इसकी लगभग सभी सामग्रियों से सहमत हूं। इसलिए, जब मैं 30 000 LOC प्रबंधक वर्ग के आपके उदाहरण के बारे में सोचता हूं, तो मैं वास्तव में "अच्छे कारण" भाग से सहमत नहीं हो सकता। मैं आक्रामक ध्वनि नहीं करना चाहता, लेकिन इस तरह सोचने से समस्या पैदा होगी। एक ही फ़ाइल में इतना कोड होने का कोई अच्छा कारण नहीं है - यह लगभग 1000 पृष्ठों का पाठ है! स्थानीयता (निष्पादन की गति, या "सरलता") के किसी भी लाभ को डेवलपर्स द्वारा तुरंत उस राक्षसी को नेविगेट करने की कोशिश करते हुए पूरी तरह से बंद कर दिया जाएगा, और इससे पहले कि हम विलय पर चर्चा करें, आदि।

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


यह एक दोष नहीं है जिसे मैंने एक बार देखा है। मैंने इसे कई टीमों में, कई परियोजनाओं के लिए देखा है। मैंने कई प्रतिभाशाली, संरचित लोगों को इससे जूझते देखा है। जब दबाव की 300 सीमाएँ कोड की सीमा होती हैं, तो ऐसा कुछ नहीं होता है, जिसकी आपके निर्माता को परवाह है। और न ही खिलाड़ी btw। यकीन है कि यह अच्छा और मीठा है, लेकिन शैतान विवरण में है। GameManagerमैंने अब तक देखी गई सबसे बुरी स्थिति कोड की 30.000 पंक्तियों के आसपास थी, और मुझे पूरा यकीन है कि इसमें से अधिकांश एक बहुत अच्छे कारण के लिए यहां था। यह निश्चित रूप से चरम है, लेकिन वास्तविक दुनिया में वे चीजें होती हैं। मैं इस GameManager-प्रत्यक्षता को सीमित करने का तरीका पूछ रहा हूं ।
लॉरेंट कौविदो

@lorancou - मैंने पोस्ट के लिए बहुत अधिक अतिरिक्त जानकारी जोड़ी है, यह एक टिप्पणी के लिए बहुत अधिक था, उम्मीद है कि यह आपको एक विचार का थोड़ा और अधिक देता है, भले ही मैं आपको किसी भी ठोस वास्तुशिल्प की ओर इशारा न कर पाऊं उदाहरण।
डैनियल बी

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

@lorancou Hehe, यह अच्छा है ... इस तरह से पागलपन निहित है :)
डैनियल बी

"रिफैक्टिंग का अभ्यास वास्तव में वही है जो आप ढूंढ रहे हैं - आपको छोटे वेतन वृद्धि में कोड के डिजाइन में लगातार सुधार करने की आवश्यकता है।" मुझे लगता है कि आपको वहां बहुत मजबूत बिंदु मिल गया है। मेस मेस को आकर्षित करता है, इसके पीछे असली कारण है, इसलिए मेस को लंबे समय तक लड़ना पड़ता है। मैं इस उत्तर को स्वीकार करने जा रहा हूं, लेकिन इसका मतलब यह नहीं है कि दूसरों में इसका कोई मूल्य नहीं है!
लॉरेंट कौविदो

7

यह वास्तव में गेम प्रोग्रामिंग के साथ एक मुद्दा नहीं है, लेकिन सामान्य रूप से प्रोग्रामिंग के साथ है।

खेल का प्रबंधन करने के लिए सभी स्रोत कोड वास्तव में यहां हैं।

यही कारण है कि आपको किसी भी ऑब्जेक्ट ओरिएंटेड कोडर पर फेंकना चाहिए जो नाम में "प्रबंधक" के साथ कक्षाएं सुझाएगा। निष्पक्ष होने के लिए, मुझे लगता है कि खेल में "सेमिगॉड" वस्तुओं से बचना लगभग असंभव है, लेकिन हम उन्हें "सिस्टम" कहते हैं।

कोई भी सॉफ्टवेयर डेडलाइन नजदीक आने पर गंदा हो जाता है। वह नौकरी का हिस्सा है। और " डक्ट टाइप प्रोग्रामिंग " के साथ स्वाभाविक रूप से कुछ भी गलत नहीं है , खासकर जब आपको कुछ घंटों में अपने उत्पाद को शिप करना होगा। आप इस समस्या से पूरी तरह से छुटकारा नहीं पा सकते हैं, आप इसे कम कर सकते हैं।

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

  • आपका कोड बहुत जटिल है। बहुत सारे पैटर्न, समय से पहले अनुकूलन, कोई भी अब प्रवाह को नहीं समझता है। यदि आप कर सकते हैं तो अधिक TDD का उपयोग करने का प्रयास करें, क्योंकि यह जटिलता से लड़ने के लिए एक बहुत अच्छा समाधान है।

  • आपका कोड अच्छी तरह से संरचित नहीं है। आप ग्लोबल्स वैरिएबल का उपयोग कर रहे हैं (एब), कक्षाएं शिथिल युग्मित नहीं हैं, कोई इंटरफ़ेस नहीं है, कोई घटना प्रणाली नहीं है, और इसी तरह।

यदि कोड ठीक लगता है, तो आपको प्रत्येक प्रोजेक्ट के लिए, "क्या गलत हुआ" याद रखना होगा और अगली बार इससे बचना होगा।

अंत में, यह टीम प्रबंधन का मुद्दा भी हो सकता है: क्या पर्याप्त समय था? क्या हर कोई उस वास्तुकला के बारे में जानता है जो आप के लिए जा रहे थे? किस व्यक्ति ने इसमें "प्रबंधक" शब्द के साथ एक वर्ग के साथ प्रतिबद्ध होने की अनुमति दी?


डक्ट टेप प्रोग्रामिंग में कुछ भी गलत नहीं है, मैं आपको देता हूं। लेकिन मुझे पूरा यकीन है -मैनेजर क्लासेस गेम इंजन में चारों ओर हैं, कम से कम मैंने उन्हें बहुत देखा है। वे तब तक उपयोगी होते हैं जब तक वे बहुत बड़े नहीं हो जाते ... क्या गलत SceneManagerहै NetworkManager? मैं यह नहीं देखता कि हम उन्हें क्यों रोकें, या उनकी जगह कैसे लें -समैन बाय-सिस्टम मदद करता है। मैं आमतौर पर एक GameManager, कुछ कम कोड-ब्लोट-प्रोन में जाने के लिए एक प्रतिस्थापन वास्तुकला के लिए सुझावों की तलाश कर रहा हूं ।
लॉरेंट कौविदो

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

ठीक है, इसलिए -मनगर बात को भूल जाओ। मान लीजिए कि आपको एक क्लास मिली है जो आपके गेम स्टेट्स को हैंडल करती है, इसे कॉल करने देती है GameStatesCollection। शुरुआत में आपके पास बस कुछ गेम स्टेट्स और उनके बीच स्विच करने के तरीके होंगे। फिर लोडिंग स्क्रीन है जो आते हैं और यह सब जटिल करते हैं। तब कुछ प्रोग्रामर को एक बग से निपटना पड़ता है जब आप Level_A से Level_B पर स्विच करते समय उपयोगकर्ता डिस्क को हटा देता है, और आधे दिन के रिफैक्टरिंग में खर्च किए बिना इसे ठीक करने का एकमात्र तरीका है GameStatesCollection। बूम, एक ईश्वर वस्तु।
लॉरेंट कौविदो

5

इसलिए, अधिक एंटरप्राइज़-वाई दुनिया से एक संभव समाधान लाना: क्या आपने नियंत्रण / निर्भरता इंजेक्शन के व्युत्क्रम की जांच की है?

मूल रूप से, आपको यह ढांचा मिलता है जो आपके खेल में बाकी सभी चीजों के लिए एक कंटेनर है। यह, और केवल यह जानता है कि सब कुछ एक साथ तार कैसे करें और आपकी वस्तुओं के बीच क्या संबंध हैं। आपकी कोई भी वस्तु अपने स्वयं के कंस्ट्रक्टरों के अंदर किसी भी चीज को तुरंत नहीं देती है। बल्कि बनाने के लिए वे क्या जरूरत है, वे से पूछना वे क्या आईओसी ढांचे से जरूरत के लिए; निर्माण पर, IoC फ्रेमवर्क "जानता है" कि निर्भरता को संतुष्ट करने और उसे भरने के लिए किस वस्तु की आवश्यकता है। ढीला युग्मन FTW।

जब आपका EnemyTreasure वर्ग कंटेनर से GameLevel ऑब्जेक्ट के लिए पूछता है, तो फ्रेमवर्क जानता है कि इसे किस उदाहरण को देना है। यह कैसे पता चलता है? हो सकता है कि यह पहले इसे तुरंत कर दिया हो, हो सकता है कि यह कुछ आस-पास के GameLevelFactory पूछता हो। प्वाइंट है, EnemyTreasure नहीं जानता कि GameLevel उदाहरण कहाँ से आया है। यह केवल यह जानता है कि इसकी निर्भरता अब संतुष्ट है और यह अपने जीवन के साथ आगे बढ़ सकता है।

ओह, मुझे आपके प्लेयरसपीट वर्ग के उपकरण IUpdateable दिखाई देते हैं। खैर यह बहुत अच्छा है, क्योंकि फ्रेमवर्क टाइमर के लिए हर IUpdateable ऑब्जेक्ट को स्वचालित रूप से सब्सक्राइब करता है, जो कि मुख्य गेम लूप है। प्रत्येक टाइमर :: टिक () स्वचालित रूप से सभी IUpdatedable :: अद्यतन () विधियों को कॉल करता है। आसान है, है ना?

वास्तविक रूप से, आपको यह करने के लिए इस bighugeohmygod ढांचे की आवश्यकता नहीं है: आप इसके महत्वपूर्ण बिट्स स्वयं कर सकते हैं। मुद्दा यह है कि यदि आप अपने आप को बनाने वाली वस्तुओं को खोजते हैं, तो संभावना है, आप अपनी कक्षाओं के बीच अपनी जिम्मेदारियों को सही ढंग से वितरित नहीं कर रहे हैं या कहीं न कहीं कुछ कक्षाएं याद कर रहे हैं।


दिलचस्प है, पहली बार मैंने IoC के बारे में सुना है। यह गेम प्रोग्रामिंग के लिए बहुत bighugeohmygod हो सकता है, लेकिन मैं इसकी जांच करूंगा!
लॉरेंट कौविदो

IoC, क्या हम इसे सामान्य ज्ञान कहने के लिए उपयोग नहीं करते हैं?
ब्राइस

आधे मौके को देखते हुए, एक अभियंता किसी भी चीज़ से बाहर एक रूपरेखा बनाते हैं। (= इसके अलावा, मैं ढांचे का उपयोग करने की वकालत नहीं कर रहा हूं, मैं वास्तुशिल्प पैटर्न की वकालत कर रहा हूं।
drhayes

3

यदि मैं निम्नलिखित कार्य करता हूं, तो अतीत में, मैं आमतौर पर एक देव वर्ग के साथ समाप्त होता हूं:

  • इससे पहले कि मैं एक वर्ग आरेख (या मुख्य वस्तुओं का सिर्फ एक रेखाचित्र) लिखकर खेल संपादक / आईडीई / नोटपैड पर बैठ जाऊं
  • खेल के एक बहुत अस्पष्ट विचार के साथ शुरू करें और तुरंत इसे कोड करें, फिर जैसे ही वे आते हैं नए विचारों पर पुनरावृत्ति शुरू करें
  • GameManager नामक एक वर्ग फ़ाइल बनाएँ, जब मैं एक बारी आधारित रणनीति की तरह एक राज्यव्यापी खेल नहीं बना रहा हूँ, जहाँ GameManager वास्तव में एक डोमेन ऑब्जेक्ट है
  • कोड संगठन के बारे में जल्द परवाह न करें

यह विवादास्पद हो सकता है, जो कि अगर यह है तो मैं हंसूँगा, लेकिन मैं एक बार भी प्रोटोटाइप में नहीं सोच सकता कि आप एक खेलने योग्य प्रोटोटाइप लिखने से पहले एक बहुत ही बुनियादी वर्ग आरेख नहीं लिखना चाहिए। मैं योजना बनाने से पहले तकनीकी विचारों का परीक्षण करता हूं, लेकिन यह इसके बारे में है। इसलिए अगर मैं पोर्टल बनाना चाहता हूं, तो पोर्टलों को काम करने के लिए मैं बहुत ही बुनियादी कोड लिखूंगा, फिर कुछ छोटी योजनाओं के लिए ठीक समय कहूंगा, फिर मैं खेलने योग्य प्रोटोटाइप पर काम कर सकता हूं।


1

मुझे पता है कि यह सवाल अब पुराना है, लेकिन मुझे लगा कि मैं अपने 2 सेंट जोड़ूंगा।

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

उदाहरण के लिए, यह ग्राफिक्स वर्ग को रेंडर को बताता है, लेकिन रेंडरिंग प्रक्रिया से इसका कोई लेना-देना नहीं है। यह LevelManager को एक नए स्तर को लोड करने के लिए कह सकता है, लेकिन इसका लोडिंग प्रक्रिया से कोई लेना-देना नहीं है।

संक्षेप में, मैं अन्य वर्गों के उपयोग को ऑर्केस्ट्रेट करने के लिए एक अर्ध-देवता की वस्तु का उपयोग करता हूं।


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