2011-12-07 10 views
6

उदाहरण चर स्काला में डिफ़ॉल्ट रूप से सार्वजनिक करने के पीछे के दर्शन क्या है। उन्हें डिफ़ॉल्ट रूप से निजी नहीं बनाना चाहिए डेवलपर्स कम गलतियां करते हैं और रचना को प्रोत्साहित करते हैं?स्कैला में डिफ़ॉल्ट रूप से इंस्टेंस चर को सार्वजनिक करने के पीछे दर्शन क्या है?

उत्तर

11

सबसे पहले, आपको पता होना चाहिए कि जब आप लिखते हैं:

class Person(val name: String, val age: Int) { 
    ... 
} 

name और age उदाहरण चर लेकिन विधियों (getters) पहुंचकर्ता, जो डिफ़ॉल्ट रूप से सार्वजनिक कर रहे हैं नहीं कर रहे हैं।

आप के बजाय लिखते हैं:

class Person(name: String, age: Int) { 
    ... 
} 

name और age केवल उदाहरण चर, जो निजी के रूप में आप उम्मीद कर सकते हैं कर रहे हैं।

स्काला के दर्शन अपरिवर्तनीय उदाहरण चर को पसंद करते हैं, तो हो रही सार्वजनिक accessors तरीकों है और नहीं एक समस्या है।

+3

अपने दूसरे उदाहरण में, 'name' और' age' भी सिर्फ निर्माता मापदंडों और नहीं उदाहरण चर, हो सकता है कि वे किस तरह 'Person' के शरीर में उपयोग किया जाता है पर निर्भर करता है। –

+0

हाँ आप सही हैं, मैं जवाब को जटिल नहीं करना चाहता था। – paradigmatic

5

निजी monoliths प्रोत्साहित करती है। जैसे ही किसी वर्ग में असंबंधित कार्यक्षमता डालना आसान हो जाता है क्योंकि इसे निजी होने के कुछ चर पढ़ने की आवश्यकता होती है, कक्षाएं बढ़ने लगती हैं।

यह सिर्फ एक बुरा डिफ़ॉल्ट और जावा में 1000 से अधिक लाइनों के साथ कक्षाओं के लिए बड़ा कारणों में से एक है।

स्कैला अपरिवर्तनीय रूप से चूक जाता है, जो लोगों को अक्सर प्रतिबंधित करने के लिए निजी का उपयोग करता है (लेकिन हटा नहीं जाता है, क्योंकि क्लास की विधियां अभी भी चर को बदल सकती हैं) जावा में।

3
    immutables जो कई स्थानों में पसंद किया जाता है के साथ
  1. , सार्वजनिक एक समस्या
  2. का इतना नहीं है आप, ग्राहक कोड बदले बिना getters और setters के साथ एक सार्वजनिक वैल जगह ले सकता है इसलिए आप की जरूरत नहीं है अगर आपको इसकी आवश्यकता हो तो गेटर्स और सेटर्स की अतिरिक्त परत। (वास्तव में आप उस परत मिलता है लेकिन आप इसे समय के सबसे अधिक ध्यान नहीं देते।)
  3. निजी क्षेत्र + सार्वजनिक setters और getters के जावा विरोधी पैटर्न बहुत वैसे भी
3

(एक अतिरिक्त संपुटित नहीं है अन्य उत्तरों को पूरक बनाने के लिए देखें :)

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

जावा में, यह आवश्यक है कि सब कुछ क्रम वाक्यात्मक लचीलेपन यदि आवश्यक हो तो एक मूल्य की गणना करने के प्रदान करने के लिए एक विधि के माध्यम से एक्सेस किया गया था।

स्कैला में, विधियों और फ़ील्ड को समकक्ष वाक्यविन्यास के माध्यम से पहुंचा जा सकता है - इसलिए यदि आपके पास अब एक साधारण संपत्ति है, तो इसे सीधे बेनकाब करने के लिए encapsulation में कोई हानि नहीं है, क्योंकि आप इसे बाद में नो-Arg विधि के रूप में बेनकाब करना चुन सकते हैं आपके कॉलर्स को परिवर्तन के बारे में कुछ भी जानने की आवश्यकता है।

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