2014-06-08 9 views
6

में डेटा encapsulation मैंने पूरे Swift book पढ़ा है, और सभी WWDC videos (जिसमें से मैं दिल से अनुशंसा करता हूं) देखता हूं। एक चीज जिसे मैं चिंतित करता हूं वह डेटा encapsulation है।स्विफ्ट

class Stack<T> 
{ 
    var items : T[] = [] 

    func push(newItem: T) { 
     items.insert(newItem, atIndex: 0) 
    } 

    func pop() -> T? { 
     if items.count == 0 { 
      return nil; 
     } 

     return items.removeAtIndex(0); 
    } 
} 

इस वर्ग के एक ढेर को लागू करता है, और किसी सरणी का उपयोग कर इसे लागू करता है:

निम्नलिखित (पूरी तरह से काल्पनिक) उदाहरण पर विचार करें। समस्या यह है कि items (स्विफ्ट में सभी गुणों की तरह) सार्वजनिक है, इसलिए किसी को भी सार्वजनिक एपीआई से अलग पहुंचने (या यहां तक ​​कि उत्परिवर्तन) से किसी को भी रोक नहीं रहा है। एक curmudgeonly पुराने सी ++ लड़के के रूप में, यह मुझे बहुत अजीब बनाता है।

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

क्या मुझे कुछ याद आया है, या क्या यह भाषा में बस एक चूक है?

+0

संभावित डुप्लिकेट: - प्रोटोकॉल http://stackoverflow.com/q/24003918/1639670 – nathan

+0

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

+0

"इसलिए किसी को भी सार्वजनिक एपीआई से अलग पहुंचने (या यहां तक ​​कि उत्परिवर्तन) से कुछ भी नहीं रोक रहा है" - एक "curmudgeonly पुराना सी ++ लड़का" होने के अलावा :-) आप क्या नुकसान पहुंचाते हैं ऐसा लगता है कि अगर आप जबरन लोगों को अपने कोड का उपयोग करने से जरूरी नहीं रोकते हैं तो वे क्या करेंगे? उदाहरण के लिए, पाइथन ने कहा है, "हम यहां सभी वयस्क हैं।" सार्वजनिक/निजी दस्तावेज और सम्मेलन पर आधारित है। अगर कोई कक्षा में आंतरिक, कैविट एम्प्टर के साथ कुछ बेकार करना चाहता है। कोई भी नाटक करता है कि वे अनंत काल के लिए जान सकते हैं कि किसी भी व्यक्ति के पास आंतरिक वस्तु तक पहुंचने का कोई अच्छा कारण नहीं होगा। – alcalde

उत्तर

6

इस समय बस यह गायब है। ग्रेग पार्कर ने स्पष्ट रूप से कहा है (in this dev forums thread) कि दृश्यता संशोधक आ रहे हैं।

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

इस सुविधा के बाद से उज्ज्वल तरफ फ्लक्स में है, अब file a radar पर एक अच्छा समय है और यह कैसे प्रभावित हो जाता है पर प्रभाव डालता है।

0

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

4

भविष्य के संदर्भ के लिए अद्यतन उत्तर।

एप्पल के documentation से:

पहुँच स्तर

स्विफ्ट अपने कोड के भीतर संस्थाओं के लिए तीन विभिन्न पहुँच स्तर प्रदान करता है। ये एक्सेस स्तर स्रोत फ़ाइल के सापेक्ष हैं जिसमें एक इकाई परिभाषित की जाती है, और मॉड्यूल से संबंधित स्रोत स्रोत से संबंधित है।

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

आंतरिक पहुंच सक्षम बनाता संस्थाओं उनके परिभाषित करने मॉड्यूल से किसी भी स्रोत फ़ाइल के भीतर इस्तेमाल किया जा रहा है, लेकिन उस मॉड्यूल के किसी भी स्रोत फ़ाइल बाहर में नहीं। ऐप या फ्रेमवर्क की आंतरिक संरचना को परिभाषित करते समय आप आम तौर पर आंतरिक पहुंच का उपयोग करते हैं।

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