गेटर्स की अनुमति देने के साथ एक सटीक मुद्दा क्या है?


15

मैं शब्दार्थ के बारे में एक राय नहीं ढूंढ रहा हूं, लेकिन बस एक ऐसे मामले के लिए जहां संवेदक का उपयोग किया जाना वास्तविक बाधा है। हो सकता है कि यह मुझे उन पर भरोसा करने वाले कभी न खत्म होने वाले सर्पिल में फेंक देता है, हो सकता है कि वैकल्पिक क्लीनर हो और स्वचालित रूप से गेटर्स को संभालता है, आदि कुछ ठोस।

मैंने सभी तर्कों को सुना है, मैंने सुना है कि वे बुरे हैं क्योंकि वे आपको ऑब्जेक्ट्स को डेटा स्रोतों के रूप में व्यवहार करने के लिए मजबूर करते हैं, कि वे किसी वस्तु की "शुद्ध स्थिति" का उल्लंघन करते हैं "बहुत अधिक बाहर न दें" लेकिन तैयार रहें बहुत स्वीकार करो ”।

लेकिन पूरी तरह से कोई समझदार कारण क्यों एक getDataबुरी बात है, वास्तव में, कुछ लोगों ने तर्क दिया कि यह शब्दार्थ के बारे में बहुत कुछ है, ठीक-प्रति के रूप में गेटर्स, लेकिन बस उन्हें नाम न दें getX, मेरे लिए, यह कम से कम हास्यास्पद है ।

एक चीज क्या है, बिना राय के, जो टूट जाएगी अगर मैं समझदारी से डेटा का उपयोग करता हूं और डेटा के लिए जो स्पष्ट रूप से ऑब्जेक्ट की अखंडता को नहीं तोड़ता है अगर यह इसे बाहर रखता है?

बेशक, एक स्ट्रिंग के लिए एक गेटर की अनुमति देना जो किसी चीज़ को एन्क्रिप्ट करने के लिए उपयोग किया जाता है, गूंगा से परे है, लेकिन मैं डेटा के बारे में बात कर रहा हूं जो आपके सिस्टम को कार्य करने की आवश्यकता है। हो सकता है कि आपका डेटा Providerऑब्जेक्ट से खींच लिया गया हो, लेकिन, फिर भी, ऑब्जेक्ट को अभी भी Providerए करने की अनुमति देने की आवश्यकता है $provider[$object]->getData, इसके आसपास कोई रास्ता नहीं है।


मैं क्यों पूछ रहा हूं: मेरे लिए, गेटर्स, जब समझदारी से इस्तेमाल किए जाते हैं और डेटा पर जो "सुरक्षित" के रूप में व्यवहार किया जाता है, भगवान-भेजा जाता है, मेरे 99% गेटर्स का उपयोग ऑब्जेक्ट को पहचानने के लिए किया जाता है, जैसा कि, मैं कोड के माध्यम से पूछता हूं Object, what is your name? Object, what is your identifier?, किसी वस्तु के साथ काम करने वाले व्यक्ति को किसी वस्तु के बारे में इन बातों को जानना चाहिए, क्योंकि प्रोग्रामिंग के बारे में लगभग सब कुछ पहचान है और जो बेहतर जानता है वह वस्तु से क्या है? इसलिए मैं किसी भी वास्तविक मुद्दे को देखने में विफल रहता हूं जब तक कि आप एक शुद्धतावादी नहीं हैं।

मैंने "क्यों गेटर्स / सेटर्स" खराब हैं, इसके बारे में सभी स्टैकऑवरफ्लो सवालों पर गौर किया है और हालांकि मैं मानता हूं कि 99% मामलों में सेटर वास्तव में खराब होते हैं, गेटर्स का इलाज सिर्फ इसलिए नहीं होता क्योंकि वे तुकबंदी करते हैं।

एक सेटर आपकी वस्तु की पहचान से समझौता करेगा और यह डीबग करना कठिन होगा कि कौन डेटा बदल रहा है, लेकिन एक गेट्टर कुछ नहीं कर रहा है।


2
मेरी सलाह को ज्यादातर ओओ सिद्धांत भूल जाते हैं। अभ्यास। बहुत सारे कोड लिखें, और फिर इसे बनाए रखें। तुम दूर, दूर, और अधिक के बारे में और अधिक अच्छी तरह से काम करता है और क्या वास्तव में कुछ कर से नहीं करता है और फिर कुछ महीने बाद इसे करने के लिए सीखना होगा।
jpmc26

1
@ jpmc26 .... माँ में क्या है .... मुझे वास्तव में कभी भी यह एहसास नहीं हुआ कि हम में से कोई भी वास्तव में OOP सही ढंग से नहीं करता है, मैंने हमेशा इस बात की धारणा की है कि किसी वस्तु के क्षेत्रों से सख्ती से संबंधित है, लेकिन वस्तु स्वयं एक अवस्था है और हो रही है स्वतंत्र रूप से साझा किया गया वास्तव में, हर कोई OOP गलत कर रहा है, तब, या यों कहें कि प्रतिमान ऑब्जेक्ट्स है, तो OOP संभव नहीं है। मैं OOP का उपयोग कड़ाई से यह व्यक्त करने के लिए करता हूं कि एक प्रणाली कैसे काम करती है और इसे कभी भी पवित्र कब्र के रूप में नहीं माना जाता है, न ही SOLID। वे सिर्फ ऐसे उपकरण हैं जिनका उपयोग मैं ज्यादातर अपनी अवधारणा के एक बहुत अच्छी तरह से निष्कासित (कार्यान्वयन के माध्यम से) करने के लिए करता हूं। कोई भी इस पर पढ़ता है कि क्या यह सही है?
कूलपस्टा

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

2
यह मुझे एक स्ट्रोमैन की तरह लगता है। मुझे विश्वास नहीं है कि कोई भी गंभीर डेवलपर जो वास्तव में प्रयोग करने योग्य कोड लिखता है वह तर्क देगा कि गेटर्स का उपयोग समझदारी से करना एक समस्या है। प्रश्न का तात्पर्य है गेटर्स का उपयोग समझदारी से किया जा सकता है जिसका अर्थ है कि गेटर्स समझदार हो सकते हैं। क्या आप किसी को यह कहना चाह रहे हैं कि गेटर्स का कोई समझदार उपयोग नहीं है? आप थोड़ी देर प्रतीक्षा करेंगे।
जिम्मीजम्स

2
@coolpasta आप सही कह रहे हैं। मैं वास्तव में परवाह नहीं है अगर यह शुद्ध OOP है। बस बेहतर है। मुझे टूटे हुए कोड के बीच एक विकल्प दें जिसे मनुष्य बनाम निर्दोष सीपीयू प्यार कोड के द्वारा समझा जा सकता है जो कि अविवेकी है और बीमार हर बार मानव अनुकूल कोड लेते हैं। ओओपी मेरे लिए केवल तभी उपयोगी है जब यह किसी एक समय में मेरे बारे में सोचने वाली चीजों की संख्या को कम करता है। यही कारण है कि मैं इसे सीधे प्रक्रियात्मक पर पसंद करता हूं। इसके बिना आप सिर्फ मुझे बिना किसी कारण के कई स्रोत कोड फ़ाइलों के माध्यम से कूद रहे हैं।
कैंडिड_ऑरेंज

जवाबों:


22

आप गेटर्स के बिना अच्छा कोड नहीं लिख सकते।

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

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

यह वास्तव में इतना आसान है। यदि आप कोई वास्तविक वस्तु नहीं होने पर कोई सीमा नहीं होने पर गेटर्स का उपयोग करते हैं। सब कुछ प्रक्रियात्मक होने लगता है। जो काम करता है और साथ ही कभी करता है।

सच्चा OOP कुछ ऐसा नहीं है जिसे आप हर जगह फैला सकते हैं। यह केवल उन सीमाओं के भीतर काम करता है।

वे सीमाएं पतली नहीं हैं। उनमें कोड है। वह कोड OOP नहीं हो सकता। यह कार्यात्मक भी नहीं हो सकता। इस कोड से हमारे आदर्शों को छीन नहीं लिया गया है ताकि यह कठोर वास्तविकता से निपट सके।

माइकल फ़ेटर्स ने इस कोड प्रावरणी को उस सफेद संयोजी ऊतक के बाद कहा जो एक नारंगी के वर्गों को एक साथ रखता है।

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

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

सीमा का एक सरल उदाहरण एक संग्रह है। यह कुछ रखता है और पता नहीं है कि यह क्या है। एक संग्रह डिजाइनर संभवतः आयोजित वस्तु की व्यवहारिक कार्यक्षमता को संग्रह में कैसे स्थानांतरित कर सकता है जब उन्हें पता नहीं होता कि यह क्या होने जा रहा है? आप नहीं कर सकते। आप एक सीमा के खिलाफ हैं। यही कारण है कि संग्रह में गेटर्स हैं।

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

कुछ लोग इसे व्यावहारिक बताते हैं। और यह है। लेकिन यह जानना अच्छा है कि हमें व्यावहारिक क्यों होना चाहिए।


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

यदि आप चाहते हैं कि हर जगह पायथन को देखें। कोई निजी कीवर्ड नहीं है फिर भी पायथन ओओपी को ठीक करता है। कैसे? वे सिमेंटिक ट्रिक का इस्तेमाल करते हैं। वे एक प्रमुख अंडरस्कोर के साथ निजी होने का मतलब कुछ भी नाम देते हैं। आपको इसे पढ़ने की अनुमति भी है बशर्ते आप ऐसा करने की जिम्मेदारी लें। "हम सभी वयस्क हैं", वे अक्सर कहते हैं।

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

तो हमारे पास जो कुछ बचा है वह यह तय करने का काम है कि "कर्मचारियों को केवल" कैसे लटकाएं। क्या निजी माना जाना चाहिए? आप कहते हैं कि "समझदार गेटर्स"। जैसा कि मैंने कहा है, एक गटर के लिए सबसे अच्छा औचित्य एक सीमा है जो हमें अपने आदर्शों से दूर करती है। यह सब कुछ पाने पर परिणाम नहीं होना चाहिए। जब यह एक गटर में परिणाम करता है तो आपको व्यवहार को रसदार बिट में आगे बढ़ने पर विचार करना चाहिए जहां आप इसे संरक्षित कर सकते हैं।

इस अलगाव ने कुछ शर्तों को जन्म दिया है। डेटा ट्रांसफर ऑब्जेक्ट या DTO, कोई व्यवहार नहीं रखता है। केवल विधियाँ हैं और कभी-कभी बसने वाले, कभी-कभी निर्माण करने वाले। यह नाम दुर्भाग्यपूर्ण है क्योंकि यह एक सच्ची वस्तु नहीं है। गेटर्स और सेटर वास्तव में सिर्फ डिबगिंग कोड हैं जो आपको ब्रेकपॉइंट सेट करने के लिए जगह देते हैं। अगर यह उस जरूरत के लिए नहीं था, तो वे सिर्फ सार्वजनिक क्षेत्रों के ढेर होंगे। C ++ में हम उन्हें स्ट्रक्चर्स कहते थे। सी ++ वर्ग से एकमात्र अंतर वे सार्वजनिक रूप से चूक गए थे।

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

लेकिन आप ऐसे गेटर्स प्रदान करना चाहते हैं जो पहचान व्यक्त करें। खैर आप एक सीमा मिल गया है बधाई। संस्थाओं की एक पहचान है जो उनके संदर्भ से परे है। यानी उनके मेमोरी एड्रेस से परे। इसलिए इसे कहीं स्टोर करना होगा। और किसी चीज को पहचान के द्वारा इस चीज को संदर्भित करने में सक्षम होना चाहिए। पहचान प्राप्त करने वाला एक गेटटर पूरी तरह से उचित है। कोड का एक ढेर जो उस गेटवे का उपयोग करता है जो निर्णय लेने के लिए होता है जो एंटिटी खुद बना सकती थी।

अंत में यह गेटर्स का अस्तित्व नहीं है जो गलत है। वे सार्वजनिक क्षेत्रों से कहीं बेहतर हैं। क्या बुरा है जब वे बहाना करने के लिए उपयोग किए जाते हैं आप ऑब्जेक्ट ओरिएंटेड हो जब आप नहीं हैं। गेटर्स अच्छे हैं। ऑब्जेक्ट ओरिएंटेड होना अच्छा है। गेट्स ऑब्जेक्ट ओरिएंटेड नहीं हैं। ऑब्जेक्ट ओरिएंटेड होने के लिए एक सुरक्षित स्थान को बाहर निकालने के लिए गेटर्स का उपयोग करें।


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

1
@coolpasta आप डेटा स्वामी ऑब्जेक्ट बना सकते हैं। डेटा स्वामी ऑब्जेक्ट डेटा ऑब्जेक्ट हैं, लेकिन उन्हें डिज़ाइन और नाम दिया गया है ताकि वे (स्पष्ट रूप से) डेटा के स्वामी हों। बेशक इन वस्तुओं में गेटर्स होंगे।
rwong

1
@rwong तुम क्या मतलब है clearly? यदि डेटा मुझे किसी चीज़ से, मूल्य से , स्पष्ट रूप से पास किया जाता है, तो मेरी वस्तु अब डेटा का स्वामी है, लेकिन शब्दार्थ द्वारा, यह अभी तक नहीं है, इस बिंदु पर, यह बस किसी और से डेटा प्राप्त करता है। इसके बाद उस डेटा को रूपांतरित करने के लिए ऑपरेशन करना होगा, इसे अपना बनाना होगा, जिस क्षण डेटा को छुआ जाएगा, आपको सिमेंटिक परिवर्तन करना होगा: आपको नाम दिया गया डेटा मिल गया है $data_from_requestऔर अब आपने इसे संचालित किया है? नाम बताइए $changed_data। आप इस डेटा को दूसरों के सामने उजागर करना चाहते हैं? एक गेट्टर बनाएं getChangedRequestData, फिर, स्वामित्व स्पष्ट रूप से सेट किया गया है। या यह है?
शीतलाष्टक

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

2
बहुत बढ़िया जवाब!
सेमीस्टर - मोनिका

10

गेटर्स हॉलीवुड सिद्धांत का उल्लंघन करते हैं ("हमें कॉल न करें, हम आपको कॉल करेंगे")

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

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

एक गेटर का उपयोग करने का अर्थ है कि आपको उस मूल्य की आवश्यकता है, जब आप वास्तव में नहीं होते हैं।

आपको वास्तव में उस प्रदर्शन सुधार की आवश्यकता हो सकती है

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


1
मैं समझता हूं और मैं आपके सत्य के साथ उड़ूंगा, मुझे जानने की आवश्यकता नहीं है। । लेकिन मैं एक ऐसे स्थान पर पहुँच गया हूँ जहाँ मुझे ज़रूरत है। मेरे पास एक Generatorवस्तु है जो मेरी सभी Itemsवस्तुओं से गुजरती है , फिर getNameप्रत्येक Itemसे आगे कुछ करने के लिए कहता है । इसके साथ क्या मुद्दा है? फिर, बदले में, Generatorस्वरूपित स्ट्रिंग्स को थूकता है। यह मेरे ढांचे के भीतर है, जिसके लिए मेरे पास फिर से एक एपीआई है, जिसका उपयोग उपयोगकर्ता जो भी प्रदान करते हैं उसे चलाने के लिए कर सकते हैं लेकिन फ्रेमवर्क को छूने के बिना।
शीतलाष्टमी

3
What is the issue with this?कोई भी ऐसा नहीं जिसे मैं देख सकूं। यह अनिवार्य रूप से एक mapकार्य करता है। लेकिन यह सवाल आपने नहीं पूछा है। आपने अनिवार्य रूप से पूछा था "क्या कोई स्थिति है जिसके तहत एक गेटवे अनजाने में हो सकता है।" मैंने दो के साथ उत्तर दिया, लेकिन इसका मतलब यह नहीं है कि आप पूरी तरह से बसने वालों को छोड़ देते हैं।
रॉबर्ट हार्वे

1
आप गलत आदमी से सवाल पूछ रहे हैं। मैं एक व्यावहारिक हूँ; जब तक वे मेरे उद्देश्यों की सेवा नहीं करते हैं, मैं अपने विशिष्ट कार्यक्रमों के लिए सबसे अच्छा सूट करता हूं, और "सिद्धांतों" में बहुत स्टॉक नहीं रखता।
रॉबर्ट हार्वे

2
@ jpmc26: चौखटे। पुस्तकालय नहीं।
रॉबर्ट हार्वे

2
एक फ्रेमवर्क एक सामान्य उद्देश्य भाषा को एक डोमेन विशिष्ट में बदलने का प्रयास है। एक पुस्तकालय पुन: प्रयोज्य एल्गोरिदम का एक संग्रह है। या तो आप उस पर निर्भर रहने के लिए कहेंगे। यह आप पर निर्भर है कि आप हार्ड कोड या तो निर्भरता चाहते हैं या निर्भरता को आसानी से प्रतिस्थापित कर सकते हैं।
कैंडिड_ऑरेंज

2

गेटर्स लीक इम्प्लीमेंटेशन डिटेल्स एंड ब्रेक एब्सट्रैक्शन

विचार करें public int millisecondsSince1970()

आपके ग्राहक सोचेंगे कि "ओह, यह एक इंट" है और यह मानते हुए एक गज़िलियन कॉल होगा कि यह एक इंट है , डेट्स की तुलना करते हुए पूर्णांक गणित कर रहा है, आदि ... जब आपको पता चलता है कि आपको लंबे समय की आवश्यकता है , तो बहुत कुछ होगा समस्याओं के साथ विरासत कोड। एक जावा दुनिया में, आप @deprecatedएपीआई में जोड़ देंगे, हर कोई इसे अनदेखा करेगा, और आप अशिष्ट, छोटी गाड़ी कोड को बनाए रखने में फंस गए हैं। :-( मेरा मानना ​​है कि अन्य भाषाएँ समान हैं!)

इस विशेष मामले में, मुझे यकीन नहीं है कि एक बेहतर विकल्प क्या हो सकता है, और @candiedorange उत्तर पूरी तरह से बिंदु पर है, कई बार जब आपको गेटर्स की आवश्यकता होती है, लेकिन यह उदाहरण नीचे की ओर दिखाता है। प्रत्येक सार्वजनिक गटर आपको एक निश्चित कार्यान्वयन में "लॉक" करता है। उनका उपयोग करें यदि आपको वास्तव में "सीमाओं को पार करने" की आवश्यकता है, लेकिन जितना संभव हो उतना कम उपयोग करें और देखभाल और पूर्वाभास के साथ।


यह सच है, लेकिन किसी वस्तु के चर के लिए डेटा प्रकार / संरचना को लागू करने के लिए पैटर्न समाधान क्या है, साथ ही साथ उस चर के लिए प्राप्तकर्ता का उपयोग करने वाली किसी भी चीज़ के लिए?
शीतलाष्टक

1
यह उदाहरण एक अलग घटना, आदिम जुनून को दर्शाता है। आजकल अधिकांश पुस्तकालयों और चौखटे क्लासेस का प्रतिनिधित्व करते हैं timepointऔर timespanक्रमशः। ( epochकी एक विशेष मूल्य है timepoint।) इन कक्षाओं पर, वे इस तरह के रूप टिककर खेल प्रदान करते हैं getIntया getLongया getDouble। यदि समय में हेरफेर करने वाली कक्षाएं लिखी जाती हैं ताकि वे (1) इन वस्तुओं और विधियों के लिए समय से संबंधित अंकगणित को प्रस्तुत करें, और (2) गेटर्स के माध्यम से इन समय वस्तुओं तक पहुंच प्रदान करें, तो समस्या को हल किया जाता है, बिना गेटर्स से छुटकारा पाने के लिए। ।
1919

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

1
जनवरी 1970 के अंत से पहले "मिलीसेकंडसइन 1970" ने 32 बिट इनट के लिए काम करना बंद कर दिया था, इसलिए मुझे संदेह है कि इसका उपयोग करने पर बहुत कोड होगा :-)
gnasher729

1
@rwong कुछ हद तक सही है, लेकिन आप मानते हैं कि पसंदीदा लाइब्रेरी जो टाइमपॉइंट्स का प्रतिनिधित्व करती हैं, स्थिर हैं। जो वे नहीं कर रहे हैं। उदा क्षण.जस
user949300

1

मुझे लगता है कि पहली कुंजी यह याद रखना है कि निरपेक्षता हमेशा गलत होती है।

एक पता पुस्तिका कार्यक्रम पर विचार करें, जो बस लोगों की संपर्क जानकारी संग्रहीत करता है। लेकिन, चलिए इसे सही करते हैं और इसे कंट्रोलर / सर्विस / रिपॉजिटरी लेयर में तोड़ते हैं।

एक ऐसा Personवर्ग बनने जा रहा है जो वास्तविक डेटा रखता है: नाम, पता, फ़ोन नंबर, आदि .. Addressऔर Phoneवर्ग भी हैं, इसलिए हम गैर-अमेरिकी योजनाओं का समर्थन करने के लिए बाद में बहुरूपता का उपयोग कर सकते हैं। उन सभी वर्गों के तीन डेटा ट्रांसफर ऑब्जेक्ट हैं , इसलिए वे गेटर्स और सेटर के अलावा कुछ भी नहीं होने जा रहे हैं। और, यह समझ में आता है: वे किसी भी तर्क में उन पर हावी होने से परे नहीं जा रहे हैं equalsऔर getHashcode; उन्हें आपसे एक पूर्ण व्यक्ति की जानकारी का प्रतिनिधित्व करने के लिए कहने का कोई मतलब नहीं है: क्या यह HTML प्रस्तुति, एक कस्टम GUI ऐप, एक कंसोल ऐप, एक HTTP समापन बिंदु, आदि के लिए है?

यहीं कंट्रोलर, सर्विस और रिपॉजिटरी आती है। उन सभी वर्गों के तर्क-भारी और गटर-लाइट होने जा रहे हैं, यह निर्भरता इंजेक्शन के लिए है।

नियंत्रक को एक इंजेक्शन प्राप्त करने जा रहा है, जो इस तरह के तरीकों को उजागर करेगा getऔर saveदोनों, कुछ उचित तर्क लेंगे (उदाहरण के लिए, getनाम से खोज करने के लिए ओवरराइड हो सकते हैं, ज़िप कोड द्वारा खोज सकते हैं, या बस सब कुछ प्राप्त कर सकते हैं; saveशायद ले जाएगा एक एकल Personऔर इसे बचाने के लिए)। नियंत्रक को क्या मिलेगा? ठोस वर्ग का नाम प्राप्त करने में सक्षम होना लॉगिंग के लिए उपयोगी हो सकता है, लेकिन यह उस राज्य के अलावा कौन सा राज्य होगा जो इसमें इंजेक्ट किया गया है?

इसी तरह, सर्विस लेयर को एक रिपॉजिटरी इंजेक्ट मिलेगा, इसलिए यह वास्तव में प्राप्त कर सकता है और Personएस को बनाए रख सकता है, और इसमें कुछ "व्यावसायिक तर्क" हो सकते हैं (उदाहरण के लिए, शायद हम यह चाहते हैं कि सभी Personऑब्जेक्ट्स में कम से कम एक पता या फोन हो। संख्या)। लेकिन, फिर से: उस वस्तु का क्या राज्य है जो इंजेक्शन के अलावा है? फिर से, कोई नहीं।

रिपॉजिटरी लेयर वह जगह है जहाँ चीजें थोड़ी और दिलचस्प हो जाती हैं: यह स्टोरेज लोकेशन के लिए कनेक्शन स्थापित करने वाला है, जैसे। एक फ़ाइल, एक SQL डेटाबेस या एक मेमोरी स्टोर। फ़ाइल नाम या SQL कनेक्शन स्ट्रिंग प्राप्त करने के लिए एक योजक जोड़ने के लिए यह यहां लुभावना है, लेकिन यह वह स्थिति है जिसे कक्षा में अंतःक्षिप्त किया गया है। क्या रिपॉजिटरी के पास यह बताने के लिए एक गेट्टर होना चाहिए कि वह अपने डेटा स्टोर से सफलतापूर्वक जुड़ा हुआ है या नहीं? ठीक है, हो सकता है, लेकिन रिपॉजिटरी क्लास के बाहर उस जानकारी का क्या उपयोग है? जरूरत पड़ने पर रिपॉजिटरी क्लास को अपने डेटा स्टोर को फिर से कनेक्ट करने का प्रयास करना चाहिए, जो बताता है कि isConnectedसंपत्ति पहले से ही संदिग्ध है। इसके अलावा, एक isConnectedसंपत्ति शायद गलत होने जा रही है जब इसे सही होने की आवश्यकता होगी: जाँचisConnectedडेटा प्राप्त / संग्रह करने का प्रयास करने से पहले यह गारंटी नहीं दी जाती है कि रिपॉजिटरी तब भी कनेक्ट होगी जब "वास्तविक" कॉल किया जाता है, इसलिए यह कहीं अपवाद हैंडलिंग की आवश्यकता को दूर नहीं करता है (इसके लिए तर्क हैं कि जहां जाना चाहिए, उससे परे इस सवाल का दायरा)।

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

टी एल; डॉ

निष्कर्ष में: उन वर्गों से अलग जिनका एकमात्र उद्देश्य डेटा ले जाना है, स्टैक में और कुछ भी नहीं है एक जगह पर एक गेट्टर लगाने के लिए: राज्य या तो श्रमिक वर्ग के बाहर इंजेक्शन या अप्रासंगिक है।


मुझे C # गुणों के उचित उपयोग के बारे में बहस के समान सोच की यह रेखा मिलती है। संक्षेप में, संपत्तियों (जो गेटटर-ओनली या गेट्टर-सेटर-जोड़ी हो सकती है) से एक निश्चित अनुबंध को बरकरार रखने की उम्मीद की जाती है, जैसे "आप जो सेट करते हैं वह आपको मिलता है", "गेट्टर को ज्यादातर साइड-इफेक्ट-फ्री होना चाहिए", "गेट्टर को त्रुटियों को फेंकने से बचना चाहिए", आदि आपके निष्कर्ष के विपरीत, कई ऑब्जेक्ट स्टेट्स हैं जो गुण (या गेटर्स) के रूप में उजागर होने के लिए फायदेमंद हैं। उदाहरण यहाँ उद्धृत करने के लिए बहुत सारे हैं।
1919

2
@rwong मुझे कुछ उदाहरणों को जानने में दिलचस्पी होगी, चलो एक टीम द्वारा लागू "सामान्य" "उद्यम" आवेदन के लिए कहें। चलो यह भी मानते हैं कि सादगी के लिए कोई तीसरा पक्ष शामिल नहीं है। आप जानते हैं, एक स्व-निहित प्रणाली, जैसे कि कैलेंडर, पालतू जानवर की दुकान, जो आप चाहते हैं।
रॉबर्ट ब्रुटिगम

1

एक बात क्या है, बिना राय के, अगर मैं समझदारी से और डेटा का उपयोग करता हूं तो वह टूट जाएगा यदि स्पष्ट रूप से ऑब्जेक्ट की अखंडता नहीं टूटती है अगर इसे बाहर रखता है?

म्यूटेबल सदस्य।

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

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

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

यह ज्यादातर परिवर्तनशील वस्तुओं को उजागर करने के साथ एक मुद्दा है। संरचना या अपरिवर्तनीय वस्तुओं का प्रदर्शन करना कोई समस्या नहीं है, क्योंकि उन परिवर्तनों में से कोई भी एक प्रति बदलेगा (आमतौर पर या तो किसी संरचना के मामले में एक अंतर्निहित प्रतिलिपि द्वारा या किसी अपरिवर्तनीय वस्तु के मामले में एक स्पष्ट प्रति द्वारा)।

एक रूपक का उपयोग करने के लिए जो अंतर को देखना आसान बना सकता है।

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

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

कभी-कभी (कम अक्सर, लेकिन अभी भी अक्सर पर्याप्त है कि यह ध्यान देने योग्य है) बसने वाले काफी वैध ओओ डिजाइन हैं। यदि मेरे पास ग्राहक वस्तु है, तो उनके पते के लिए एक सेटर को उजागर करना काफी वैध है। चाहे आप वह कॉल करेंsetAddress(string address) या ChangeMyAddressBecauseIMoved(string newAddress)या बस string Address { get; set; }शब्दार्थ की बात करें। उस वस्तु की आंतरिक स्थिति को बदलने की आवश्यकता है और उस वस्तु की आंतरिक स्थिति को निर्धारित करने के लिए उपयुक्त तरीका है। यहां तक ​​कि अगर मुझे उन पते के ऐतिहासिक रिकॉर्ड की आवश्यकता होती है, जो अंदर Customerरहते हैं, तो मैं ऐसा करने के लिए उचित रूप से अपनी आंतरिक स्थिति को बदलने के लिए सेटर का उपयोग कर सकता हूं। इस मामले में यह Customerअपरिवर्तनीय होने का कोई मतलब नहीं है और ऐसा करने के लिए एक सेटर प्रदान करने की तुलना में एक पते को बदलने का कोई बेहतर तरीका नहीं है।

मुझे यकीन नहीं है कि कौन सुझाव दे रहा है कि गेटर्स और सेटर खराब हैं या ऑब्जेक्ट ओरिएंटेड प्रतिमानों को तोड़ते हैं, लेकिन यदि वे ऐसा करते हैं, तो वे संभवतः भाषा की एक विशिष्ट भाषा सुविधा के जवाब में ऐसा कर रहे हैं जिसका वे उपयोग करते हैं। मुझे लगता है कि यह जावा से बाहर हो गया "सब कुछ एक वस्तु है" संस्कृति (और संभवतः कुछ अन्य भाषाओं में ही विस्तारित)। .NET दुनिया में यह चर्चा बिल्कुल नहीं है। गेटर्स एंड सेटर्स एक प्रथम श्रेणी की भाषा की विशेषता है जिसका उपयोग न केवल भाषा में आवेदन लिखने वाले लोगों द्वारा किया जाता है, बल्कि स्वयं भाषा एपीआई द्वारा भी किया जाता है।

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

सारांशित करने के लिए: गेटर्स और सेटर्स ऑब्जेक्ट ऑब्जेक्ट-ओरिएंटेड डिज़ाइन टूल हैं। उनका उपयोग इतनी उदारता से नहीं किया जा सकता है कि हर क्रियान्वयन का विवरण सामने आए लेकिन न ही आप उनका उपयोग इतनी सहजता से करना चाहते हैं कि किसी वस्तु के उपभोक्ता वस्तु का कुशलता से उपयोग न कर सकें।


-1

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

स्थिरता टूट जाएगी।

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

चलिए @ candied_orange के Collectionउदाहरण के साथ चलते हैं । वह जो लिखता है, उसके विपरीत एक पाने वाला Collection नहीं होना चाहिए । बहुत विशिष्ट कारणों के लिए संग्रह मौजूद हैं, विशेष रूप से सभी वस्तुओं पर पुनरावृति करने के लिए । यह कार्यक्षमता किसी के लिए आश्चर्य की बात नहीं है, इसलिए इसे उपयोगकर्ता पर इस स्पष्ट उपयोग-मामले को आगे बढ़ाने के बजाय, साइकिल और गेटर्स या व्हाट्सएप का उपयोग करके लागू किया जाना चाहिएCollection

निष्पक्ष होने के लिए, कुछ सीमाओं को गेटर्स की आवश्यकता होती है। ऐसा तब होता है जब आप वास्तव में नहीं जानते कि उनका उपयोग किस लिए किया जाएगा। उदाहरण के लिए, आप प्रोग्राम को Exceptionआजकल जावा की कक्षा से स्टैकट्रेस प्राप्त कर सकते हैं, क्योंकि लोग इसका उपयोग सभी प्रकार के उत्सुक कारणों से करना चाहते थे जो लेखक ने कल्पना नहीं की थी या नहीं कर सकते थे।


1
Counterexample। एक फ़ंक्शन पर विचार करें, जिसमें दो Collectionएस को एक साथ पुनरावृत्त करने की आवश्यकता है , जैसे कि (A1, B1), (A2, B2), ...। इसके लिए "ज़िप" के कार्यान्वयन की आवश्यकता है। आप "ज़िप" को कैसे लागू करते हैं यदि दो में से एक पर इट्रेट-ओवर फ़ंक्शन लागू किया जाता है Collection- आप दूसरे में संबंधित आइटम का उपयोग कैसे करते हैं?
1919

@rwong को खुद के साथ Collectionलागू zipकरना होगा, यह निर्भर करता है कि पुस्तकालय कैसे लिखा जाता है। यदि ऐसा नहीं होता है, तो आप इसे लागू करते हैं और लाइब्रेरी निर्माता को पुल अनुरोध सबमिट करते हैं। ध्यान दें कि मैं सहमत था कि कुछ सीमाओं को कभी-कभी गेटर्स की आवश्यकता होती है, मेरी असली समस्या आजकल हर जगह है।
रॉबर्ट ब्राटिगाम

उस स्थिति में, इसका अर्थ है कि पुस्तकालय में Collectionवस्तु पर गेटर्स होना आवश्यक है, कम से कम इसके स्वयं के कार्यान्वयन के लिए zip। (यही है, गेटर के पास कम से कम पैकेज विजिबिलिटी है।) और अब आप लाइब्रेरी के निर्माता पर निर्भर हैं कि वह आपके अनुरोध को स्वीकार करे ...
rwong

मैं आपको बहुत नहीं समझता। Collectionस्पष्ट रूप से अपने स्वयं के आंतरिक राज्य तक पहुँच सकते हैं, या किसी भी अधिक स्पष्ट होने के Collectionउदाहरण के किसी भी अन्य आंतरिक स्थिति तक पहुँच सकते हैं। यह एक ही प्रकार है, कोई गेटर्स की जरूरत नहीं है।
रॉबर्ट ब्रुटिगम 18

मैं आपको भी सुनता हूं, लेकिन फिर, क्या वास्तव में गेटर्स का बेहतर समाधान है? मुझे पता है कि यह सवाल के दायरे से बाहर है।
शीतलाष्टक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.