यदि कोई कोड लिखता है ताकि एक आंतरिक चर $ _fields बिना गेट्टर / सेटर विधियों का उपयोग किए सुलभ हो, तो क्या इसका वर्णन करने के लिए एक उचित शब्द का उपयोग किया जाता है?
प्रबंधन के साथ उपयोग करने के लिए पर्याप्त विनम्र :)
यदि कोई कोड लिखता है ताकि एक आंतरिक चर $ _fields बिना गेट्टर / सेटर विधियों का उपयोग किए सुलभ हो, तो क्या इसका वर्णन करने के लिए एक उचित शब्द का उपयोग किया जाता है?
प्रबंधन के साथ उपयोग करने के लिए पर्याप्त विनम्र :)
जवाबों:
निजी सदस्यों को उजागर करना विनम्र समाज में एक अच्छी बात नहीं है ...
यह अभ्यास / गरीब अतिक्रमण की कमी है।
private
) अभी तक एनकैप्सुलेशन की अवधारणा का एक और कार्यान्वयन है।
__
नामकरण के लिए उपयोग करना चाहिए )। अन्य भाषाओं में खराब एनकैप्सुलेशन भी हो सकते हैं, उदाहरण के लिए, निजी चर में पाने के लिए जावा में प्रतिबिंब और सी ++ में सूचक अंकगणितीय। अजगर सिर्फ यह है कि बोझिल करने के लिए वाक्यविन्यास नहीं करता है।
__
नामकरण का उपयोग करता है । इसके बिना __
, यह डिजाइन अभी भी अच्छे एनकैप्सुलेशन को दर्शाता है। यह दावा करते हुए कि "सार्वजनिक" का अर्थ है "अभाव / गरीब अतिक्रमण" गलत है। अवधारणा अभी भी मौजूद है। स्रोत कोड में उपयुक्त सजावट का अभाव है।
प्रोग्रामिंग भाषा और उसके प्रतिमानों के आधार पर, ओड द्वारा पहले ही उल्लेख किए गए एनकैप्सुलेशन की कमी के अलावा, यह "सादा पुराना डेटा" भी हो सकता है (जहां यह आवश्यक रूप से एक एंटीपार्टर्न या कोड गंध नहीं है)।
मैंने पहले "नग्न वस्तु" शब्द सुना है।
इसे प्रॉपर्टी बैग कहा जाता है।
आमतौर पर इसका उपयोग संभवतः संबंधित गुणों का एक सेट रखने के लिए किया जाता है (प्रत्येक संभावित रूप से एक क्लास ऑब्जेक्ट हो सकता है जिसमें उपयुक्त एक्सेस स्पेसर हैं या नहीं)। लेकिन आस-पास की संरचना गुणों का एक बैग है।
इसे "एक विशिष्ट कोडिंग मानक का पालन नहीं करना" कहा जाता है।
ओपी ने लिखा:
एक आंतरिक चर $ _fields गौटर / सेटर विधियों का उपयोग किए बिना सुलभ है
यह आपके मानक के विरुद्ध हो सकता है, और (इस प्रकार) यह कोड गंध हो सकता है। लेकिन जरूरी नहीं कि यह खराब एनकैप्सुलेशन हो। एक आंतरिक ("केवल आंतरिक उपयोग के रूप में") एक्सपोजर को गेट्टर पर चर और बाहरी दुनिया में बसने से भी बदतर होगा।
सवाल यह है: $_fields
बाहरी दुनिया के लिए सुलभ होना चाहिए ?
यदि हां, तो हमारे पास एक मामला है जहां आप गेट्टर / सेटर के तरीके जोड़ेंगे। ये विधियां किसी भी चीज को एनकैप नहीं करती हैं लेकिन यह तथ्य है कि $_fields
किसी प्रकार का एक परिवर्तनशील है (जैसा कि कुछ गणना / भ्रूण / आदि के विपरीत है)। भाषा के आधार पर, आप शायद अब भी टाइप (aka एक कार्यान्वयन विवरण) को बाहर तक लीक करेंगे। आप हमेशा गेटर्स / सेटर चाहते हैं, या केवल जब "जरूरत" एक कोडिंग मानक मुद्दा है।
यदि सुलभ नहीं होना $_fields
चाहिए , तो, ठीक है, इसे एक्सेस न करें। आपको भाषा स्तर (निजी और दोस्तों) पर दूसरों को एक्सेस करने से बचना चाहिए या नहीं (जो कुछ परिस्थितियों में डिबगिंग को कम कर सकता है) - फिर से - एक कोडिंग मानक मुद्दा है।
इनकैप्सुलेशन का मुद्दा पूरी तरह से ऑर्थोगोनल है। गेटर्स और सेटर्स के साथ उल्लंघन का उल्लंघन पूरी तरह से संभव है। इसमें फिसलना और भी आसान है, क्योंकि अधिकांश लोगों के अलार्म की घंटी नहीं बजती है जब वे गेटर्स और बस्तियों का एक गुच्छा देखते हैं - कोड जो कि सर्वोत्तम प्रथाओं का अनुसरण कर रहा है। कोड, जो बहुत अच्छी तरह से आंतरिक कार्यान्वयन विवरण पर बहुत अधिक निर्भरता का परिचय दे सकता है, जिसे एक चर कहा जाता $_fields
है, जैसा कि निर्दिष्ट नहीं किया जाना चाहिए private
।
मैं बुरी उपमाओं का प्रशंसक हूं: उस खराब एनकैप्सुलेशन को कॉल करना किसी ऐसे व्यक्ति को बुलाने जैसा है जो बंदूक को कातिल मानता है।
मैं ऐसे चर को सार्वजनिक सदस्य चर कहूंगा ।
अगर आपके सेटर / गेट्टर मेथड से ज्यादा कुछ नहीं है
void setfoo(bar){foo=bar;}
foo getfoo{return foo;}
तब केवल एक जघन चर बनाने से कुछ धार मामलों के बाहर कुछ टाइपिंग बचती है जहां अंतर मायने रखता है।