मैं एक एक्सएनए इंजन लिख रहा हूं और मैं List
में सभी मॉडलों को संग्रहीत कर रहा हूं। पूरे इंजन में इसका उपयोग करने में सक्षम होने के लिए, मैंने इसे public static List<Model>
बना दिया है, इसलिए मैं इसे विकसित करने वाले किसी भी नए वर्ग से एक्सेस कर सकता हूं। यह निश्चित रूप से मॉडल की सूची प्राप्त करने में भी आसान बनाता है, लेकिन क्या यह सही उपयोग है? या क्या मैं वास्तव में एक विधि घोषणा के माध्यम से एक चर पारित करने से बेहतर होगा?क्या मैं सही तरीके से स्थिर का उपयोग कर रहा हूं?
उत्तर
ओओपी में आम तौर पर स्थिर तरीकों और गुणों का उपयोग करने से बचने के लिए सलाह दी जाती है, जब तक कि आपके पास ऐसा करने का बहुत अच्छा कारण न हो। इसके कारणों में से एक यह है कि भविष्य में आप किसी कारण से इस सूची के दो या दो से अधिक उदाहरण प्राप्त कर सकते हैं, और फिर आप स्थिर कॉल के साथ फंस जाएंगे।
स्थिर तरीके और गुण बहुत कठोर हैं। Stevey कहता है:
स्टेटिक विधियां ग्रेनाइट के रूप में लचीली हैं। हर बार जब आप एक का उपयोग करते हैं, आप कंक्रीट में अपने प्रोग्राम का हिस्सा कास्टिंग कर रहे हैं। बस सुनिश्चित करें कि आप नहीं हैं, तो के रूप में आपका पैर जाम हो गया है, आप इसे कठिन देख रहे हैं। किसी दिन आप आश्चर्य होगा कि, भगवान से, आप वास्तव में है कि डांग PrintSpooler वर्ग का एक और कार्यान्वयन की जरूरत है, और यह एक अंतरफलक, एक कारखाने, और कार्यान्वयन कक्षाओं का एक सेट किया जाना चाहिए था। डी 'ओह!
मैं एक सिंगल ऑब्जेक्ट को लागू करने का सुझाव दूंगा जो मॉडल सूची को समाहित करता है।
MSDN singleton implementation पर एक नज़र डालें।
सिंगलेट्स के अपने नुकसान हैं, और वास्तव में वे स्थिर तरीकों वाले वस्तुओं से बहुत अलग नहीं हैं। यहां इसके बारे में एक पोस्ट है: http://sites.google.com/site/steveyegge2/singleton-cononsidered-stupid आम तौर पर केवल एक ऑब्जेक्ट बनाना बेहतर होता है और इसे किसी भी पैरामीटर के रूप में पास करने के लिए इसे किसी भी व्यक्ति के पास पास करना बेहतर होता है। –
यह संतुलन और व्यापार-बंद का मामला है।
बेशक, ओओपी शुद्धवादियों का कहना है कि इस तरह के वैश्विक चर से बचें, क्योंकि यह किसी भी मॉड्यूल के लिए "बॉक्स से बाहर" जाने वाली किसी चीज को शुरू करके कोड डिब्बेकरण को तोड़ता है, और इस प्रकार इसे बनाए रखने, बदलने, डीबग इत्यादि
हालांकि, मेरा व्यक्तिगत अनुभव यह रहा है कि अगर आप बहुत बड़ी एंटरप्राइज़ समाधान टीम का हिस्सा हैं, तो एक बहुत बड़ा एंटरप्राइज़-क्लास एप्लिकेशन बनाए रखने के लिए इसे केवल टालना चाहिए।
अन्य मामलों के लिए, वैश्विक रूप से सुलभ डेटा को "वैश्विक" ऑब्जेक्ट (या एक स्थिर वस्तु, एक ही चीज़) में समाहित करना ओओपी कोडिंग को काफी हद तक सरल बनाता है।
आप वैश्विक GetModels() फ़ंक्शन लिखकर मध्यम-जमीन प्राप्त कर सकते हैं जो मॉडलों की सूची देता है। या मॉडल की सूची को स्वचालित रूप से इंजेक्ट करने के लिए DI का उपयोग करें।
छोटी परियोजनाएं बाद में बड़ी हो सकती हैं। और यहां तक कि सबसे छोटी परियोजनाओं को भी टेस्टेबल होना चाहिए। सांख्यिकी यूनिट परीक्षण के दुश्मन हैं। –
@ František Žiačik, अच्छा बिंदु! +1 यही कारण है कि मैं उल्लेख करता हूं कि उसे GetModels() फ़ंक्शन प्राप्त करने की आवश्यकता हो सकती है ताकि आप इकाई परीक्षणों में एक डमी इंजेक्ट कर सकें ... –
@ František Žiačik, हालांकि, खेल के विकास में, आमतौर पर वैश्विक डेटा की एक बड़ी मात्रा होती है (उदाहरण के लिए बोर्ड डेटा, इलाके डेटा, खिलाड़ियों डेटा आदि) कोड धाराओं के बीच सिंक करने के लिए। असल में, वैश्विक डेटा आमतौर पर गैर-वैश्विक डेटा से अधिक है। तो संतुलन का कुछ रूप होना चाहिए। –
मैं जितना संभव हो सके स्थिर का उपयोग करने से बचूंगा, समय के साथ आप spaghetti code के साथ समाप्त हो जाएंगे।
यदि आप इसे निर्माता में पास करते हैं तो आप एक अनावश्यक निर्भरता को समाप्त कर रहे हैं, low coupling is good। वहां कम निर्भरताएं हैं, बेहतर।
खेल के विकास के लिए मैं "सबसे सरल चीज करना संभवतः काम कर सकता हूं" का समर्थन करता हूं। इसमें वैश्विक चर का उपयोग करना शामिल है (public static
सी # में), यदि यह एक आसान समाधान है। आप इसे बाद में कुछ औपचारिक रूप से बदल सकते हैं। विजुअल स्टूडियो में "सभी संदर्भ ढूंढें" टूल यह वास्तव में आसान बनाता है।
कहा जा रहा है कि, बहुत कम मामले हैं जहां वैश्विक चर वास्तव में कुछ करने का "सही" तरीका है। तो यदि आप इसका उपयोग करने जा रहे हैं, तो आपको और से अवगत होना चाहिए सही समाधान को समझें। तो आप "आलसी होने" और "अच्छे कोड लिखने" के बीच सबसे अच्छा व्यापार कर सकते हैं।
यदि आप कुछ वैश्विक बनाने जा रहे हैं, तो आपको क्यों पूरी तरह से समझना होगा आप ऐसा क्यों कर रहे हैं।
इस विशेष मामले में, ऐसा लगता है कि आप सामग्री पर जाने का प्रयास करने की कोशिश कर रहे हैं। आपको अवगत होना चाहिए कि ContentManager
स्वचालित रूप से उसी सामग्री ऑब्जेक्ट को वापस कर देगा यदि आप इसे कई बार पूछते हैं। मॉडल को वैश्विक सूची में लोड करने के बजाय, अपने Game
कक्षा के अंतर्निर्मित ContentManager
को public static
संपत्ति के माध्यम से Game
कक्षा पर उपलब्ध कराने पर विचार करें।
या, बेहतर अभी भी, एक तरीका है जो मैं पसंद करता हूं, मुझे लगता है कि थोड़ा बेहतर है: I explain it in the answer to another question। मूल रूप से आप उन वर्गों में सामग्री संदर्भ private static
बनाते हैं जो ConentManager
public static LoadContent
फ़ंक्शंस में पास करते हैं। यह आपके पूरे कार्यक्रम से उपयोग की जाने वाली वैश्विक का उपयोग करने के बजाय, अलग-अलग वर्गों के लिए स्थैतिक उपयोग का उपयोग करता है (जिसे बाद में निकालना मुश्किल होगा)। यह सही समय पर लोडिंग सामग्री को सही तरीके से संभालता है।
- 1. क्या मैं ऑटोकैक का उपयोग कर ऑब्जेक्ट कॉन्टेक्स्ट को सही तरीके से पंजीकृत कर रहा हूं?
- 2. क्या मैं यहां सही तरीके से यूनिट का उपयोग कर रहा हूं? (एंटीटी फ्रेमवर्क 4 पीओसीओ)
- 3. क्या मैं फूरियर रूपांतरण का सही तरीके से उपयोग कर रहा हूं?
- 4. क्या मैं सेवा परत का सही उपयोग कर रहा हूं?
- 5. क्या मैं CNCopyCurrentNetworkInfo का सही उपयोग कर रहा हूं?
- 6. क्या मैं फ़ंक्शन संरचना का सही उपयोग कर रहा हूं?
- 7. क्या मैं सूचियों का सही उपयोग कर रहा हूं?
- 8. क्या मैं इस उदाहरण में jQueryUI प्रोग्रेसबार सही तरीके से बंद कर रहा हूं?
- 9. मैं जावा में अस्थिर कीवर्ड का सही तरीके से उपयोग कैसे कर सकता हूं?
- 10. यूनिट परीक्षण - क्या मैं इसे सही कर रहा हूं?
- 11. मैं सी में राउंड() फ़ंक्शन का गलत तरीके से उपयोग कैसे कर रहा हूं?
- 12. एंड्रॉइड: Location.distance सही तरीके से काम नहीं कर रहा है?
- 13. यूनिट परीक्षण डीएओ, क्या मैं इसे सही कर रहा हूं?
- 14. क्या मैं PHP के क्रिप्ट() फ़ंक्शन का सही उपयोग कर रहा हूं?
- 15. MySQL प्रश्न - अनन्य कुंजी सही तरीके से काम नहीं कर रही है, या क्या मैं गलतफहमी कर रहा हूं?
- 16. क्या मैं ऑटोमैपर 2.0 की कार्यक्षमता को सही ढंग से उपयोग कर रहा हूं?
- 17. क्या मैं जेडीबीसी कनेक्शन पूलिंग का उपयोग कर रहा हूं?
- 18. मैं पाइथन रेगेक्स को अपराधी रूप से अक्षम तरीके से उपयोग कर रहा हूं
- 19. मैं सही प्रकार के सामान को सही तरीके से कैसे कर सकता हूं?
- 20. क्या मैं सही ढंग से IDISposable लागू कर रहा हूँ?
- 21. क्या मैं इसे अपने कारखाने के तरीके से अधिक कर रहा हूं?
- 22. setProgressDrawable() सही तरीके से उपयोग कैसे करें?
- 23. मैं कैसे साबित कर सकता हूं कि __udelay() मेरे एआरएम एम्बेडेड सिस्टम पर सही तरीके से काम कर रहा है?
- 24. insertRowsAtIndexPaths का सही तरीके से उपयोग कैसे करें?
- 25. memcpy का सही तरीके से उपयोग कैसे करें?
- 26. ManagedObjectID का सही तरीके से उपयोग कैसे करें?
- 27. पिडफ़ाइल लाइब्रेरी का सही तरीके से उपयोग कैसे करें?
- 28. डाटा जागरूकता नियंत्रण "सही तरीके से" का उपयोग कैसे करें?
- 29. क्या मैं इस सरल अनुबंध को गलत तरीके से कार्यान्वित कर रहा हूं?
- 30. xargs - मैं गलत क्या कर रहा हूं?
क्या आप किसी भी प्रकार के थ्रेडिंग का उपयोग कर रहे हैं? यदि ऐसा है, तो आप वास्तव में एक स्थिर सूची से बचने के लिए वास्तव में चाहते हैं। – Marthin
@ मार्थिन: कोई थ्रेडिंग का उपयोग नहीं किया जा रहा है। –
फिर मेरे प्रयोग से मुझे लगता है कि आप अपनी स्थिर सूची के साथ आगे बढ़ सकते हैं जब तक आप जानते हैं कि यह एक काफी छोटी परियोजना है। हालांकि, अगर आपको लगता है कि यह बढ़ सकता है तो मैं एक कारखाने के साथ जाने का सुझाव दूंगा। कारखाने इन सभी प्रकार के कार्यान्वयन के लिए इष्टतम नहीं हैं, लेकिन मेरे लिए, वे उपयोगिता को थोड़ा आसान बनाते हैं और बहुत आसान हो जाते हैं। Finaly एक युक्ति: जोशुआ ब्लोच द्वारा प्रभावी जावा पढ़ें। सभी प्रोग्रामर जावा, .NET और अन्य के लिए सर्वश्रेष्ठ अभ्यास =) जीएल! – Marthin