“OOP राज्य को छुपाता है” से क्या अभिप्राय है? [बन्द है]


11

Cat-v.org पर कई एंटी-ओओपी रेंट में से एक में मुझे जो आर्मस्ट्रांग ने OOP मॉडल के खिलाफ कई आपत्तियां उठाईं , जिनमें से एक निम्नलिखित था:

आपत्ति 4 - वस्तुओं में निजी स्थिति होती है

राज्य सभी बुराई की जड़ है। विशेष रूप से साइड इफेक्ट्स वाले कार्यों से बचा जाना चाहिए।

जबकि प्रोग्रामिंग भाषाओं में राज्य अवांछनीय है, वास्तविक दुनिया के राज्य में। मुझे अपने बैंक खाते की स्थिति में बहुत दिलचस्पी है, और जब मैं अपने बैंक से पैसे जमा करता हूं या निकालता हूं तो मुझे उम्मीद है कि मेरे बैंक खाते की स्थिति सही ढंग से अपडेट हो जाएगी।

यह देखते हुए कि राज्य वास्तविक दुनिया में मौजूद है, राज्य से निपटने के लिए प्रोग्रामिंग भाषा को क्या सुविधाएं प्रदान करनी चाहिए?

ओओपीएल का कहना है कि "प्रोग्रामर से राज्य छिपाएं"। राज्य केवल पहुंच कार्यों के माध्यम से छिपे और दिखाई देते हैं। पारंपरिक प्रोग्रामिंग भाषाओं (सी, पास्कल) का कहना है कि राज्य चर की दृश्यता भाषा के दायरे नियमों द्वारा नियंत्रित होती है। शुद्ध घोषणात्मक भाषाओं का कहना है कि कोई राज्य नहीं है। सिस्टम की वैश्विक स्थिति को सभी कार्यों में ले जाया जाता है और सभी कार्यों से निकलता है। प्रोग्रामर से राज्य को छिपाने के लिए मोनाड्स (FPLs के लिए) और DCG (तर्क भाषाओं) जैसे तंत्रों का उपयोग किया जाता है ताकि वे "जैसे कि राज्य में कोई फर्क नहीं पड़ता" कार्यक्रम कर सकें, लेकिन सिस्टम की स्थिति तक पूर्ण पहुंच आवश्यक हो।

OOPLs द्वारा चुना गया "प्रोग्रामर से राज्य छिपाएं" विकल्प सबसे बुरा संभव विकल्प है। राज्य का खुलासा करने और राज्य के उपद्रव को कम करने के तरीके खोजने के बजाय, वे इसे छिपाते हैं।

वास्तव में इसका क्या मतलब है? मेरे पास बहुत कम स्तर या प्रक्रियात्मक अनुभव है, ज्यादातर ओओपी है, इसलिए शायद यह बताता है कि मैं इससे कितना अपरिचित हूं। और एक अधिक आधुनिक दृष्टिकोण से, अब जब कि अधिकांश ऑब्जेक्ट-ओरिएंटेड हिस्टीरिया पारित हो गया है (कम से कम जहां तक ​​मैं बता सकता हूं), तो आप कितना सटीक / प्रासंगिक मानते हैं कि लोग उस मार्ग को मानते हैं?

आपकी सहायता के लिए धन्यवाद।



1
यदि आप मुझसे पूछते हैं, तो आप जिस लेख से जुड़े हैं वह कुछ बहुत खराब तर्क देता है (लेखन की गुणवत्ता का उल्लेख नहीं करने के लिए)। मैं यह कहने के लिए बहुत अधिक स्टॉक नहीं रखूंगा।
बेंजामिन हॉजसन

1
बाह। अधिक से अधिक मैं यह पूरी तरह से "अपरिवर्तनीय" बात सोच रहा हूं, यह एक अच्छा विचार है जो धर्म की बदबू आ रही है।
रोब

3
जो आर्मस्ट्रांग ने सार्वजनिक रूप से स्वीकार किया है कि OO के खिलाफ उनकी आपत्तियाँ OO वास्तव में क्या है की गंभीर गलतफहमियों पर आधारित थीं। उन्होंने अब महसूस किया है कि एर्लैंग वास्तव में एक गहन वस्तु-उन्मुख भाषा है (वास्तव में, यह मुख्यधारा के उपयोग में सबसे अधिक वस्तु-उन्मुख भाषा हो सकती है)।
जोर्ग डब्ल्यू मित्तग

9
उस पर विस्तार करने के लिए: जो आर्मस्ट्रांग के शेख़ी के आर्कियो.ऑर्ग का पहला कब्जा अप्रैल 2001 से है। जो ने 2003 में अपनी थीसिस लिखी थी। अपनी थीसिस लिखने के दौरान, उन्होंने OO के बारे में बहुत कुछ सीखा, और उन्हें एहसास हुआ कि वे इसके शिकार हो गए हैं आम गलतफहमी है कि OO किसी तरह से उत्परिवर्तनीय स्थिति से संबंधित था (यह ऐसा नहीं है, उत्परिवर्तित अवस्था पूरी तरह से ऑर्थोगोनल है)। तब से, उन्होंने स्वीकार किया है कि ओओ की उनकी आलोचना गलत थी और विडंबना यह है कि एरलांग वास्तव में एक वस्तु-उन्मुख भाषा है (इसमें संदेश हैं, इसमें ऐसी वस्तुएँ हैं जिन्हें यह प्रक्रिया कहता है, इसका इनकैप्सुलेशन है)।
जोर्ग डब्ल्यू मित्तग

जवाबों:


32

वास्तव में इसका क्या मतलब है?

इस संदर्भ में, इसका मतलब है कि OOP प्रोग्रामर से इसे छिपाकर एक कार्यक्रम की स्थिति को अस्पष्ट करता है लेकिन फिर भी इसे (लीक) एक्सेसर विधियों के माध्यम से दृश्यमान बनाता है। तर्क यह है कि राज्य को अस्पष्ट करके, इसके साथ काम करना अधिक कठिन हो जाता है, और विस्तार से अधिक कीड़े हो जाते हैं।

कितना सही / प्रासंगिक है आप लोग सोचते हैं कि मार्ग क्या है?

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

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

क्या OOP लोगों के लिए इस सर्वोत्तम मामलों को प्राप्त करना कठिन बनाता है? संभवतः। "जावा स्कूल" और पूरे शेप / सर्कल / आयत या कार में ओओ को पढ़ाने के व्हील्स स्कूल हैं जो संभवतः दृष्टिकोण से अधिक दोषी हैं। आधुनिक ओओपी कार्यात्मक प्रोग्रामिंग से काफी थोड़ा लेता है, अपरिवर्तनीय वस्तुओं और शुद्ध कार्यों को प्रोत्साहित करते हुए वंशानुक्रम को हतोत्साहित करने में मदद करता है ताकि कक्षाएं अच्छी तरह से काम करने में आसान हो सकें।


3
पूरे "जावा स्कूलों" पर पूरी ईमानदारी से सहमत हों, ऐसा बिल्कुल भी नहीं है। बहुत बहुत धन्यवाद, अगर मैं कर सकता था तो मैं वोट करूंगा।
जेक

2
बस सटीक होने के लिए: सामान्य रूप से भिक्षु राज्य नहीं छिपाते हैं, कुछ भिक्षु (जैसे IO) करते हैं। दूसरों के बीच देखें stackoverflow.com/questions/2488646/…
thSoft

2
+1। यह उस लेख की तुलना में कहीं अधिक संतुलित और बारीक विश्लेषण है जिससे जुड़ा हुआ प्रश्न है
बेंजामिन हॉजसन

2
जो आर्मस्ट्रांग ने सार्वजनिक रूप से स्वीकार किया है कि OO के खिलाफ उनकी आपत्तियाँ OO वास्तव में क्या है की गंभीर गलतफहमियों पर आधारित थीं। उन्होंने अब महसूस किया है कि एर्लैंग वास्तव में एक गहन वस्तु-उन्मुख भाषा है (वास्तव में, यह मुख्यधारा के उपयोग में सबसे अधिक वस्तु-उन्मुख भाषा हो सकती है)।
जोर्ग डब्ल्यू मित्तग

2
Jorg - क्या आप जो के फॉलोअप के लिए एक लिंक पोस्ट कर सकते हैं? मैं इसे पढ़ने के लिए वास्तविक दिलचस्पी लूंगा। और @ श्रंगार, सही पर!
user949300

2

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

व्यवहार में, कुशल प्रोग्रामिंग में अक्सर आवश्यकता होती है कि कुछ वस्तुओं में परस्पर स्थिति हो; हालांकि, ऐसी स्थिति को, हालांकि, श्रमिक ऑब्जेक्ट्स को अनसेंड कर दिया जाना चाहिए । .NET में IEnumerable/ IEnumeratorइंटरफेस पर विचार करें : यदि कोई संग्रह लागू होता है IEnumerable, तो यह आइटमों को एक बार में पढ़ने की अनुमति देगा। एक संग्रह को पढ़ने की वास्तविक प्रक्रिया में अक्सर इस बात का ध्यान रखना होगा कि किन वस्तुओं को पढ़ा गया है (परस्पर स्थिति का एक टुकड़ा), लेकिन ऐसा राज्य कार्यान्वयन के भीतर निहित नहीं है IEnumerable। इसके बजाय, IEnumerableएक विधि प्रदान करता है , जो एक GetEnumeratorऐसी वस्तु को लौटाता है जो लागू करता है IEnumeratorऔर संग्रह से बाहर पढ़ने के लिए आइटम को अनुमति देने के लिए पर्याप्त राज्य होता है। तथ्य यह है कि वस्तु में ऐसी स्थिति होती है, जिससे कोई समस्या नहीं होगी, हालांकि,यदि वस्तु कार्यान्वयन IEnumeratorसाझा नहीं है

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


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

@ माइक: मुझे लगता है कि वास्तविक समस्या यह है कि जावा और .NET में सभी ऑब्जेक्ट संदर्भ पूरी तरह से विश्वसनीय हैं; कोई भी कोड जो किसी वस्तु का संदर्भ प्राप्त करता है या प्राप्त करता है, उसे किसी अन्य कोड के साथ, बिना किसी प्रतिबंध के साझा कर सकता है। न तो रूपरेखा में गैर-गैर-संदर्भ संदर्भ क्षेत्र की कोई अवधारणा है; .NET में संरचनाएं और byrefs करीब आते हैं, लेकिन वे इस बात पर सीमित होते हैं कि वे क्या कर सकते हैं या वे बाहरी कोड को करने से रोक सकते हैं। किसी भी स्थिति में, मैं एक मौलिक कहावत को प्रस्तुत करना चाहूंगा: 12:57 बजे, एक वस्तु एक साथ प्रतिनिधित्व कर सकती है ...
Supercat

... एक वास्तविक दुनिया की वस्तु की वर्तमान स्थिति, और वस्तु की स्थिति 12:57 बजे थी। यदि वस्तु की वास्तविक-विश्व स्थिति में परिवर्तन होता है, तो किसी वस्तु के लिए दोनों का प्रतिनिधित्व करना संभव नहीं होगा। कभी-कभी यह आवश्यक होगा कि वस्तु 12:57 am राज्य का प्रतिनिधित्व करती रहे, और कभी-कभी वर्तमान स्थिति। 12:57 am राज्य और वर्तमान स्थिति के बीच संबंध नहीं रह सकता है, हालांकि, अगर वर्तमान स्थिति बदल जाती है।
सुपरकैट

0

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

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

ओओपी बैंडवागन के बारे में मेरी व्यक्तिगत भावना यह है कि यह सॉफ्टवेयर इंजीनियरिंग / कंप्यूटर विज्ञान में लोगों की शिक्षा के एक स्टंट का प्रतिनिधित्व करता है। वे एक स्तर पर मंचित होते हैं जहां उन्हें लगता है कि यह सभी डेटा संरचना के बारे में है। कक्षाएं, विरासत, कंटेनर, पुनरावृत्तियाँ, हैश मैप्स, गुण, राज्य छिपाना , आदि - सभी डेटा संरचना के बारे में - जितना अधिक मेरियर।

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

फिर अगले स्तर के रूप में, मैं कृत्रिम बुद्धिमत्ता को प्रबलित देखना चाहूंगा। मैं प्रोग्रामर्स को बाइट्स और थ्रेड्स और वर्चुअल फंक्शन टेबल और CUDAs से आगे बढ़ते देखना चाहता हूं और मशीनों को तर्क, सीखना और बनाने के तरीके में आगे बढ़ना चाहता हूं। मुझे पता है कि यह क्षेत्र के छोटे कोनों में बहुत आगे बढ़ चुका है, लेकिन कहीं-कहीं मोटे तौर पर पर्याप्त है।


1
"अगर यह वास्तव में शक्तिशाली है तो यह विधानसभा भाषा का अनुकरण कर सकता है" - आप वहीं की परिभाषा को स्वैप करते हैं powerful। जब अन्य कहते हैं powerful, तो वे इस बारे में बात करते हैं कि यह प्रोग्रामर को कितनी अच्छी तरह से अमूर्त करने की अनुमति देता है , जो कम्प्यूटेशनल पावर की तुलना में एक अलग कहानी है ।
फिल

@Phil: अमूर्त उन शब्दों में से एक है :)
माइक डनलेवी

नाह। आप शब्दों के बारे में बात कर रहे थे। मैं विचारों की बात कर रहा था। शब्द के आपके दूसरे और तीसरे उपयोग का powerमतलब अलग-अलग चीजों से है। कृपया गुमराह न करें।
फिल

Btw, यदि आप रुचि रखते हैं, तो रैकेट देखें , जो आपके 4 वें पैराग्राफ में कह रहे दृष्टिकोण के कुछ हद तक करीब है (प्रोग्रामर्स को भाषा को उनकी समस्या के स्तर पर लाने के बजाय उन्हें उनकी समस्या को नीचे लाने में सक्षम बनाता है। भाषा का निर्धारित सेट)। यह क्लासिक लिस्प / स्कीम से परे है, अगर किसी को पहली बार देखने पर यह आभास होता है।
फिल

0

एक्सेसिबिलिटी OOP की विशेषता नहीं है, यह जावा और माइक्रोसॉफ्ट डॉटनेट जैसे कार्यान्वयन के लिए विशिष्ट है। OOP को परिभाषित करने वाली मुख्य विशेषता बहुरूपता है।

वैसे भी, वस्तु स्थिति को छिपाकर, एक सार्थक एपीआई बनाने का कोई तरीका नहीं है। प्रस्तुति वास्तविक दुनिया OOP का एक महत्वपूर्ण घटक है। जो लोग असहमति जताते हैं, उनमें सॉफ्टवेयर उद्योग के प्रति एक तर्कहीन शत्रुता होती है, जो मेरे दृष्टिकोण से उनकी राय को अप्रासंगिक बना देती है।

आपके द्वारा लिंक की गई वेबसाइटें अत्यंत कठोर विचारों और नई तकनीक पर आलोचना के लिए कुख्यात हैं। कुछ लोगों को यह नहीं मिलता है।


एक वस्तु का अस्तित्व मॉडल की अवधारणा के आक्रमणकारियों की रक्षा के लिए होना चाहिए। प्रस्तुति एक पूरी तरह से अलग चिंता का विषय है और इसे कुशलता से और एक ही वस्तु द्वारा नियंत्रित नहीं किया जा सकता है, क्योंकि एक वस्तु सभी विभिन्न तरीकों को समझ नहीं सकती है जो इसे समय और स्थान पर प्रस्तुत किया जा सकता है। प्रस्तुति को किसी अन्य तंत्र के माध्यम से नियंत्रित किया जाना चाहिए जैसे कि घटना स्ट्रीमिंग और भौतिक विचार यदि आपका लक्ष्य बहुमुखी, बनाए रखने योग्य वस्तुएं हैं। किसी वस्तु के बदलने का समय केवल तभी होता है जब उसकी अवधारणा को संशोधित किया जाता है या उसके आक्रमणकारियों को बदल दिया जाता है।
एंड्रयू लार्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.