2009-09-01 12 views
8

यह एक समस्या मैं कई बार बहुत का सामना जब मैं मैं समझाने के लिए एक नमूना समस्या का उपयोग करेंगे एक नई एप्लिकेशन डिजाइनिंग हूँ इसवैश्विक राज्य और एकमात्र निर्भरता इंजेक्शन

लगता है मैं साधारण game.so मैं चाहता हूँ लिख रहा हूँ है खिलाड़ियों की एक सूची पकड़ने के लिए। मैं कुछ विकल्प हैं ..

कुछ वर्ग

private static ArrayList<Player> players = new ArrayList<Integer>(); 
public Player getPlayer(int i){ 
    return players.get(i); 
} 

में एक स्थिर क्षेत्र 1.use

लेकिन यह एक वैश्विक राज्य

2.or मैं एक सिंगलटन का उपयोग कर सकते

class PlayerList{ 
    private PlayerList instance; 
    private PlayerList(){...} 
    public PlayerList getInstance() { 
     if(instance==null){ 
      ... 
     } 
     return instance; 
    } 
} 

लेकिन यह बुरा है, क्योंकि यह एक सिंगलटन है

3.Dependency इंजेक्शन

class Game { 
    private PlayerList playerList; 
    public Game(PlayerList list) { 
     this.list = list; 
    } 
    public PlayerList getPlayerList() { 
     return playerList; 
    } 
} 

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

इष्टतम समाधान क्या है? (वर्तमान में मैं सिंगलटन दृष्टिकोण का उपयोग करता हूं)

उत्तर

1

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

+0

के, लेकिन जब मैं प्लेयरलिस्ट उदाहरण का उपयोग कहीं और करना चाहता हूं तो क्या करना चाहिए? – Manu

+2

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

1

यदि आपको प्लेयर के बाहर प्लेयरलिस्ट की आवश्यकता है, तो शायद गेम इसके लिए गलत वर्ग है? यदि किसी अन्य ऑब्जेक्ट को प्लेयरलिस्ट की आवश्यकता है, या तो उन्हें सूची इंजेक्शन की आवश्यकता है, या शायद आपको गेम क्लास की बजाय सूची को इस श्रेणी में ले जाना चाहिए।

यदि आपके पास गेम, प्लेयरलिस्ट और अन्य कक्षाओं के लिए अलग-अलग जीवनकाल हैं, तो शायद उन्हें समूह बनाने के लिए फैक्ट्री का उपयोग करने पर भी विचार करें। विवरण के लिए यह Google Testing Blog article देखें।

+0

1) शायद गेम इसके लिए गलत वर्ग है, लेकिन फिर भी अगर मैं एक और कक्षा में डालता हूं, तो समस्या अभी भी है। क्योंकि अब मैं इसे गेम क्लास में उपयोग नहीं कर सकता। 2) सभी आवश्यक वर्गों में प्लेयरलिस्ट को पास करने का अर्थ नहीं है, साइन इन वे फैक्ट्री क्लास में बने हैं। – Manu

4

यही कारण है कि डी कंटेनर जीवन चक्र का प्रबंधन करते हैं। कंटेनर लाइफसाइक्ल के मामले में प्लेयरलिस्ट को सिंगलटन होने दें। आपको घटकों की पूरी टेस्टेबिलिटी देता है और चलो कंटेनर (आप नहीं) अपने हाथ गंदे हो जाते हैं।

+0

+1 - आपने सिर पर नाखून मारा! – TrueWill

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