2012-03-12 15 views
5

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

+4

जब भी आपको वास्तव में –

+2

@JimmyGustafsson: क्यों ?? अगर गेटर्स/सेटर्स वास्तव में कुछ और नहीं करते हैं लेकिन मूल्यों को प्राप्त/सेट करते हैं, तो उन्हें सार्वजनिक क्यों न करें? –

+0

बूलियन _about_ कुंजी का प्रतिनिधित्व करते हैं? – paislee

उत्तर

4

इसके बजाय प्रत्येक कुंजी के लिए एक boolean होने के लिए, यह अधिक पठनीय और आसान कोड करने के लिए यदि आप एक private Map<String, Boolean> keyStates था, के साथ सभी चाबियाँ false के लिए शुरू हो जाएगा।फिर अपने accessors हो सकता है:

public void setPressed(String keyName) { 
    keyStates.put(keyName, true); 
} 

public void setReleased(String keyName) { 
    keyStates.put(keyName, false); 
} 

public boolean isPressed(String keyName) { 
    return keyStates.get(keyName); 
} 

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

यह व्यक्तिगत वरीयता नहीं है। Encapsulation और Interfaces ओओ सॉफ्टवेयर इंजीनियरिंग के अभिन्न अंग हैं, और प्राथमिक डिजाइन कारण हैं कि इंटरनेट तकनीकी पीओवी से संभव है।

+0

धन्यवाद! यह वास्तव में एक अच्छी विधि की तरह दिखता है। – user1150769

0

मानक अभ्यास सदस्य चर या तो जावा बीन सम्मेलन का पालन करने वाले गेटर्स/सेटर्स के साथ संरक्षित या निजी बनाना है। यह कुछ हद तक वर्बोज़ होता है, लेकिन वहाँ एक बहुत अच्छी लाइब्रेरी (www.projectlombok.org) है जो गेटर्स/सेटर्स/कन्स्ट्रक्टर/टूस्ट्रिंग/हैशकोड/आपके लिए समान तरीकों को उत्पन्न करती है।

2

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

0

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

आप एक IDE का उपयोग कर रहे है, तो इसका बस एक क्लिक दूर वर्ग चर/सदस्य चर के लिए getters और setters उत्पन्न करने के लिए।

1

यह बुरा नहीं है, लेकिन आम तौर पर आप encapsulate को एक वस्तु का राज्य चाहता हूँ।

3

यह मुख्य रूप से एक व्यक्तिगत स्वाद की बात है - मुझे यकीन है कि आप दोनों पक्षों पर बहस कर लोगों मिल जाएगा हूँ, और मैं इसे काला या सफेद नहीं है, लेकिन कैसे "बड़ी" वर्ग है पर निर्भर करता है कहेंगे।

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

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

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

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

0

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

Getters and Setters are bad OO design?

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