क्या एक शब्द का उपयोग किया जाता है जब आंतरिक चर को सार्वजनिक और सुलभ घोषित किया जाता है?


10

यदि कोई कोड लिखता है ताकि एक आंतरिक चर $ _fields बिना गेट्टर / सेटर विधियों का उपयोग किए सुलभ हो, तो क्या इसका वर्णन करने के लिए एक उचित शब्द का उपयोग किया जाता है?

प्रबंधन के साथ उपयोग करने के लिए पर्याप्त विनम्र :)


9
इनकैप्सुलेशन की कमी?
Oded

@ मुझे लगता है कि आप सही हैं - / खराब
एनकैप्सुलेशन की

इस प्रश्न का उत्तर देने की कोशिश करते हुए मैंने जिन दो वाक्यांशों के बारे में सोचा, वे "लीक से हटकर" और "ढीले स्कूपिंग" थे - उनमें से प्रत्येक का क्या मतलब है (मेरे सिर के बाहर)?
पीटरबी

1
जब आप किसी अवधारणा को अमूर्त करने की कोशिश करते हैं, तो यह संक्षिप्त अमूर्तता होती है, लेकिन यह वास्तव में काम नहीं करता है - अंतर्निहित अवधारणाएं अभी भी लीक होती हैं (HTTP / HTML पर SQL और वेब फ्रेमवर्क पर लीक होते हैं)।
Oded

: - @PeterB Oded के विवरण में जोड़ने के लिए, यह देखने joelonsoftware.com/articles/LeakyAbstractions.html
जोरिस Timmermans

जवाबों:


30

निजी सदस्यों को उजागर करना विनम्र समाज में एक अच्छी बात नहीं है ...

यह अभ्यास / गरीब अतिक्रमण की कमी है।


6
+1, ठीक है, आप अपने निजीकरण को कार्यालय में नहीं निकालेंगे?
स्टुपरयूजर

6
-1: एनकैप्सुलेशन वास्तव में हुआ और अच्छी तरह से हुआ। लेकिन यह आमतौर पर स्वीकृत तरीके से स्रोत कोड के माध्यम से प्रलेखित नहीं किया गया था । कुछ भाषाओं (जैसे पायथन) में वास्तव में निजी चर का अभाव है, फिर भी अभी भी इनकैप्सुलेशन का अभ्यास करते हैं।
एस.लॉट

6
@Oded: एनकैप्सुलेशन एक डिजाइन अवधारणा है । विभिन्न भाषाओं में अवधारणा के विभिन्न कार्यान्वयन हैं। निजी घोषणा के साथ एक भाषा एक कार्यान्वयन की अनुमति देती है। स्टेटलेस वस्तुओं के साथ एक कार्यात्मक प्रोग्रामिंग भाषा का एक अलग कार्यान्वयन हो सकता है। अजगर (जिसमें कमी है private) अभी तक एनकैप्सुलेशन की अवधारणा का एक और कार्यान्वयन है।
S.Lott

1
@ स लोट; ओडेड - इनकैप्सुलेशन अच्छा है और कोड पर निर्भर है जहां निजी चर अक्सर अन्य वर्गों से सीधे एक्सेस किए जाते हैं, खराब इनकैप्सुलेशन है। अजगर में, आप ऐसा करते हैं कि किसी अन्य वर्ग के नाम-मंगलीकृत निजी चर तक पहुँचते हैं या एकल अंडरस्कोर उपसर्ग के सम्मेलनों को अनदेखा करते हैं (हालांकि यदि आपका गेट्टर अन्य व्यवहार कर रहा है, तो वास्तव में __नामकरण के लिए उपयोग करना चाहिए )। अन्य भाषाओं में खराब एनकैप्सुलेशन भी हो सकते हैं, उदाहरण के लिए, निजी चर में पाने के लिए जावा में प्रतिबिंब और सी ++ में सूचक अंकगणितीय। अजगर सिर्फ यह है कि बोझिल करने के लिए वाक्यविन्यास नहीं करता है।
दि जिंबोब

2
@drjimbob: पायथन कोड शायद ही कभी __नामकरण का उपयोग करता है । इसके बिना __, यह डिजाइन अभी भी अच्छे एनकैप्सुलेशन को दर्शाता है। यह दावा करते हुए कि "सार्वजनिक" का अर्थ है "अभाव / गरीब अतिक्रमण" गलत है। अवधारणा अभी भी मौजूद है। स्रोत कोड में उपयुक्त सजावट का अभाव है।
एस.लॉट

10

प्रोग्रामिंग भाषा और उसके प्रतिमानों के आधार पर, ओड द्वारा पहले ही उल्लेख किए गए एनकैप्सुलेशन की कमी के अलावा, यह "सादा पुराना डेटा" भी हो सकता है (जहां यह आवश्यक रूप से एक एंटीपार्टर्न या कोड गंध नहीं है)।



2

इसे प्रॉपर्टी बैग कहा जाता है।

आमतौर पर इसका उपयोग संभवतः संबंधित गुणों का एक सेट रखने के लिए किया जाता है (प्रत्येक संभावित रूप से एक क्लास ऑब्जेक्ट हो सकता है जिसमें उपयुक्त एक्सेस स्पेसर हैं या नहीं)। लेकिन आस-पास की संरचना गुणों का एक बैग है।


2

इसे "एक विशिष्ट कोडिंग मानक का पालन नहीं करना" कहा जाता है।

ओपी ने लिखा:

एक आंतरिक चर $ _fields गौटर / सेटर विधियों का उपयोग किए बिना सुलभ है

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

सवाल यह है: $_fieldsबाहरी दुनिया के लिए सुलभ होना चाहिए ?

यदि हां, तो हमारे पास एक मामला है जहां आप गेट्टर / सेटर के तरीके जोड़ेंगे। ये विधियां किसी भी चीज को एनकैप नहीं करती हैं लेकिन यह तथ्य है कि $_fieldsकिसी प्रकार का एक परिवर्तनशील है (जैसा कि कुछ गणना / भ्रूण / आदि के विपरीत है)। भाषा के आधार पर, आप शायद अब भी टाइप (aka एक कार्यान्वयन विवरण) को बाहर तक लीक करेंगे। आप हमेशा गेटर्स / सेटर चाहते हैं, या केवल जब "जरूरत" एक कोडिंग मानक मुद्दा है।

यदि सुलभ नहीं होना $_fieldsचाहिए , तो, ठीक है, इसे एक्सेस न करें। आपको भाषा स्तर (निजी और दोस्तों) पर दूसरों को एक्सेस करने से बचना चाहिए या नहीं (जो कुछ परिस्थितियों में डिबगिंग को कम कर सकता है) - फिर से - एक कोडिंग मानक मुद्दा है।

इनकैप्सुलेशन का मुद्दा पूरी तरह से ऑर्थोगोनल है। गेटर्स और सेटर्स के साथ उल्लंघन का उल्लंघन पूरी तरह से संभव है। इसमें फिसलना और भी आसान है, क्योंकि अधिकांश लोगों के अलार्म की घंटी नहीं बजती है जब वे गेटर्स और बस्तियों का एक गुच्छा देखते हैं - कोड जो कि सर्वोत्तम प्रथाओं का अनुसरण कर रहा है। कोड, जो बहुत अच्छी तरह से आंतरिक कार्यान्वयन विवरण पर बहुत अधिक निर्भरता का परिचय दे सकता है, जिसे एक चर कहा जाता $_fieldsहै, जैसा कि निर्दिष्ट नहीं किया जाना चाहिए private

मैं बुरी उपमाओं का प्रशंसक हूं: उस खराब एनकैप्सुलेशन को कॉल करना किसी ऐसे व्यक्ति को बुलाने जैसा है जो बंदूक को कातिल मानता है।



-2

अगर आपके सेटर / गेट्टर मेथड से ज्यादा कुछ नहीं है

void setfoo(bar){foo=bar;}
foo getfoo{return foo;}

तब केवल एक जघन चर बनाने से कुछ धार मामलों के बाहर कुछ टाइपिंग बचती है जहां अंतर मायने रखता है।


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

@ प्लॉटर: यदि वह सारी वस्तु कभी भी हो जाएगी (जैसे, क्योंकि यह किसी अन्य प्रक्रिया या डेटाबेस में रिकॉर्ड किए गए संदेश का प्रतिनिधित्व करता है) तो यह ठीक है; वे चीजें हैं जिन्हें अत्यधिक संरक्षित किया जाना चाहिए
डोनाल्ड फेलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.