2012-09-19 17 views
9

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

public class Combatant { 

    ArtificialIntelligence ai = null; 

    public Combatant() 
    { 
     // Set other fields here. 

     this.ai = new ArtificialIntelligence(this); 
    } 

} 

यहाँ मुझे पसंद नहीं है क्या करना है: भीतरी क्षेत्र क्योंकि यह आदेश उचित कार्रवाई हुक्म करने के लिए योद्धा क्षेत्रों में से कुछ की जरूरत है (ArtificialIntelligence), निर्माण के दौरान एक योद्धा ले जाता है। तो, सुविधा के लिए, मैं लड़ाके ArtificialIntelligence वस्तु के लिए एक आर्ग के रूप में पारित करने के लिए एक संदर्भ के रखने के लिए, लेकिन यह है कि वस्तु ai वस्तु ही का संदर्भ होता है! यह इस अजीब रिकर्सन बनाता है, लेकिन मुझे नहीं पता कि इसके आसपास कैसे काम करना है। ऐ वस्तु क्षेत्रों कि लड़ाके के लिए विशिष्ट हैं की एक अच्छा सौदा की जरूरत है, ताकि कारण है कि मैं संपूर्ण वस्तु में पारित कर दिया है, लेकिन मुझे पसंद नहीं है कैसे वस्तु तो ऐ क्षेत्र है जो overlying लड़ाके में निहित है के लिए संदर्भ शामिल हैं क्षेत्र, जो अतिव्यापी एआई कक्षा में निहित है। क्या यह बुरा अभ्यास है, या मैं बस इसे सोचने पर हूं?

+6

क्या आपको स्टैक ओवरफ्लो त्रुटि मिल रही है? मुझे संदेह है, और यदि नहीं, तो यहां कोई संदर्भ नहीं है, बस संदर्भ पास हो रहा है। मुझे लगता है कि आपके यहां कोई समस्या नहीं है। –

+1

वूप्स, मैं व्यापार द्वारा गणितज्ञ हूं, इसलिए मेरी कुछ शब्दावली की कमी है। आप सही हैं, यह सिर्फ संदर्भ पास है। क्या वह अभी भी एक गैर मुद्दा माना जाएगा? क्या इस रूप में घोंसला संदर्भों के लिए यह बुरा अभ्यास नहीं है? और अपने प्रश्न का उत्तर देने के लिए, मुझे कोई त्रुटि नहीं मिल रही है। मैंने सोचा कि यह बुरा लग रहा था, और राय प्राप्त करना चाहता था। – Sal

उत्तर

9

हालांकि इसका कोई "डिजाइन" समस्या यहाँ है - यह सिर्फ एक संदर्भ आप गुजर रहे हैं - एक महत्वपूर्ण विचार है कि आप अन्य वर्ग के लिए this पारित करने के लिए अपने खेतों पहले के सभी को प्रारंभ करना चाहिए। अन्यथा, अन्य वर्ग एक संभवतः असंगत स्थिति में this के लिए उपयोग होगा। इसे कभी-कभी कन्स्ट्रक्टर से this "भागने" कहा जाता है।

ऐसा मत करो ...

public class BadCombatant { 

    ArtificialIntelligence ai = null; 
    String someField; 

    public BadCombatant() { 
     this.ai = new ArtificialIntelligence(this); 
     // Don't do this - ArtificialIntelligence constructor saw someField as null 
     someField = "something"; 
    } 
+1

+1 कुछ आईडीई कन्स्ट्रक्टरों में "इसे लीक करने" के बारे में चेतावनी देंगे। –

+1

स्पष्ट होना चाहिए, 'आर्टिफिशियल इंटेलिजेंस' * कन्स्ट्रक्टर * (और इसे कॉल करने वाली किसी भी विधि) को 'कुछ फ़ील्ड' को 'शून्य' के रूप में दिखाई देगा। –

+1

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

4

मैं निश्चित रूप से चक्रीय निर्भरता से बच जाएंगे। बचाव के लिए एक जिम्मेदारी सिद्धांत आता है। आप कृत्रिम इंटेलिजेंस को एक लड़ाकू पर संचालित करके लड़ाकू में एक आर्टिफिशियल इंटेलिजेंस का संदर्भ रखने की आवश्यकता को खत्म कर सकते हैं। सभी कोड को लड़ाकू से ले जाएं जो कृत्रिम इंटेलिजेंस पर कृत्रिम इंटेलिजेंस पर निर्भर करता है। CombatEngine निम्नलिखित करेगा:

  1. एक स्वतंत्र लड़ाकू उदाहरण बनाएं जिसका आर्टिफिशियल इंटेलिजेंस के साथ कुछ लेना देना नहीं है।

  2. Artificalintelligence की उचित उदाहरण बना सकते हैं और यह पूर्व में बने योद्धा गुजरती हैं।

वैकल्पिक रूप से, आप एक नई कक्षा बना सकते हैं जिसे कॉम्बैटकंट्रोलर कहा जाता है जिसे एक लड़ाकू और एक कृत्रिम इंटेलिजेंस पास किया जाता है। CombatEngine निम्न करेगा: किसी अन्य वर्ग

  • पर कोई निर्भरता के साथ

    1. बनाएँ योद्धा किसी अन्य वर्ग पर कोई निर्भरता के साथ एक Artificialntelligence बनाएं

    2. एक CombatController बनाएँ और इसे पारित उपयोग करने के लिए लड़ाकू और कृत्रिम इंटेलिजेंस वस्तुओं। CombatController को लड़ाकू को नियंत्रित करने के साथ-साथ एआई व्यवहार को संभालने के तरीकों का खुलासा करना चाहिए।

    बावजूद ऊपर दृष्टिकोण आपके द्वारा उपयोग की जिनमें से, आप चक्रीय निर्भरता जो आपको परेशान खत्म करने।

    मुझे खेद है कि मैं एक कोड उदाहरण प्रदान नहीं कर सकता क्योंकि मैं अपने मोबाइल फोन से यह जवाब लिख रहा हूं और स्वरूपण एक दर्द है।

  • +0

    +1 निश्चित रूप से और भी विकल्प हैं; आप उदाहरण के लिए लड़ाकू क्षेत्र से निकाले जा सकते हैं, जिसे कृत्रिम इंटेलिजेंस को एक नई कक्षा की आवश्यकता होती है, कम्बाटेंटस्टेट कहें। CombatantState Combatant में एक क्षेत्र होगा, और ArtificialIntelligence एक CombatantState स्वीकार कर सकता है। सबसे अच्छा समाधान आपके कोड की आवश्यकता पर निर्भर करता है। – sleske

    +0

    मैं पूरी तरह से सहमत हूं। उपयोग करने के लिए क्या दृष्टिकोण केवल तभी स्पष्ट हो सकता है जब आपके पास पूरी तस्वीर हो और न केवल समस्या का एक हिस्सा हो। किसी भी तरह से, चक्रीय निर्भरता आसानी से बचा जा सकता है! – CKing

    संबंधित मुद्दे