विरासत, एनकैप्सुलेशन और बहुरूपता ओओपी के स्तंभ क्यों नहीं हैं? [बन्द है]


16

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

इसके अलावा, एक ऐसा ही सवाल है, कि मुझे कॉलेज की परीक्षा और नौकरी के साक्षात्कार पर बहुत बार पूछा गया है, और सही उत्तर हमेशा कथन के शीर्षक में दिया गया था ("हां, विरासत, इनकैप्सुलेशन और बहुरूपता ओओपी के स्तंभ हैं) )।

लेकिन स्टैक ओवरफ्लो चैट में मुझे काफी मजाक उड़ाया गया था, प्रतिभागियों ने इस तरह के बयान से दृढ़ता से असहमत थे। तो, इस कथन में गलत क्या है?

क्या प्रोग्रामर सोवियत और संयुक्त राज्य अमेरिका के कॉलेजों में विभिन्न चीजों में प्रशिक्षित होते हैं?

क्या विरासत, एनकैप्सुलेशन और बहुरूपता को यूएस / यूके प्रोग्रामर द्वारा OOP के स्तंभ नहीं माना जाता है?


7
आपके प्रश्न का कोई संदर्भ नहीं है; हम नहीं जानते हैं कि SO चैट के लोग क्या सोच रहे थे, या वे क्या जवाब दे रहे थे। हो सकता है कि आप चैट रूम में बातचीत से लिंक कर सकते हैं, इसलिए हम इस पर एक नज़र डाल सकते हैं? मैंने कहा, मुझे लगता है कि यह यहाँ के बजाय चैट रूम में सबसे अच्छा हल है।
रॉबर्ट हार्वे

1
@ रॉबर्ट, बहुत बार अतीत। मुझे संदेह है कि अगर मुझे भी बातचीत का लिंक मिल जाए। लेकिन मैं मानता हूं कि संदर्भ महत्वपूर्ण है। यह किसी को दोषी ठहराना या खुद को किसी चैट आक्रामकता के निर्दोष शिकार के रूप में प्रस्तुत करना नहीं है, मैं सिर्फ सच्चाई जानना चाहता हूं।
पॉलड

5
बैठक। क्या आपने पहले अपना लौ प्रूफ सूट पहन रखा था?
रॉबर्ट हार्वे

1
केवल एक ही अर्थ जो मैं सजा दे सकता हूं, वह है "आप उनमें से किसी के बिना OOP हो सकते हैं" (सच है, लेकिन कम से कम encapsulation के लिए कोई मतलब नहीं है) या "आप उन्हें OOP के बाहर भी उपयोग कर सकते हैं", या ऐसा ही कुछ।
SJuan76

2
Imo OO का केवल एक स्तंभ है और वह है: "State"। एक बार जब आपका दिमाग राज्य में सोचता है तो आपको ओ.ओ.
पीटर बी

जवाबों:


40

क्या विरासत, एनकैप्सुलेशन और बहुरूपता को यूएस / यूके प्रोग्रामर द्वारा OOP के स्तंभ नहीं माना जाता है?

उन्हें कई प्रोग्रामरों द्वारा स्तंभ माना जाता है, और कई कॉलेज उस तरह से ओओ सिखाते हैं।

दुर्भाग्य से, यह एक अदूरदर्शी दृश्य भी है।

  • वंशानुक्रम है, लेकिन OOP को लागू करने के लिए एक तंत्र का उपयोग किया जाता है और OOP नहीं करने के लिए दुरुपयोग किया जा सकता है।
  • एनकैप्सुलेशन एक अवधारणा है, सभी प्रकार की प्रोग्रामिंग के लिए उपयोगी है, ओओपी और नहीं।
  • पॉलिमोर्फ़िज्म एक ... विशेषता है (?) का वर्णन कैसे अभिकलन व्यवहार करता है। बहुरूपता को प्राप्त करने के कई तरीके हैं, जिनमें से सभी ओओ विशिष्ट नहीं हैं।

ओओपी की बहुत कम नींव है, क्योंकि वास्तविकता में, यह बहुत ही वैचारिक है: "वस्तुओं और डेटा और कार्यक्षमता के गठनात्मक बंडलों के रूप में चीजों के बारे में सोचकर अपने कार्यक्रम के डिजाइन को दृष्टिकोण दें।"

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


10
अनिवार्य रूप से अचूक प्रश्न का उत्तर दें।
रॉबर्ट हार्वे

3
क्या OOP मौजूद है?
ट्यूलेंस कोरडोवा

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

3
@Snowman इनकैप्सुलेशन OOP तक ही सीमित नहीं है। लोग हर समय सी और कार्यात्मक भाषाओं में अमूर्त डेटा प्रकारों को लागू करते हैं।
डोभाल

2
और @ JörgWMittag के पास मैसेजिंग के संबंध में एक अच्छा जवाब था। मैसेजिंग के विचार के लिए एनकैप्सुलेशन की आवश्यकता होती है । संदेश आम तौर पर किसी फ़ंक्शन या विधि पर किसी ऑब्जेक्ट पर भेजे जाते हैं, जो तब उस स्थिति पर कार्य करता है जो उसमें संलग्न है। यह कहना नहीं है कि गैर-ओओ भाषाओं में संदेश पास या इनकैप्सुलेशन नहीं हो सकता है, केवल यह कि ये ओओपी के मूलभूत विचार हैं।

23

tl; dr: आप OO के बिना वंशानुक्रम कर सकते हैं, आप OO के बिना इनकैप्सुलेशन हो सकते हैं, आप OO के बिना बहुरूपता हो सकते हैं, आप भी बिना OO के तीनों एक साथ हो सकते हैं। फ्लिपसाइड पर, आप विरासत के बिना OO रख सकते हैं। साथ ही, विभिन्न प्रकार के एनकैप्सुलेशन (ADT- ओरिएंटेड और OO) हैं, IOW नहीं सभी एनकैप्सुलेशन OO हैं।

दीर्घ संस्करण:

शब्द "ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग" का आविष्कार एलन के द्वारा किया गया था, इसलिए उन्हें यह तय करना है कि इसका क्या मतलब है। और वह इसे इस तरह परिभाषित करता है :

ओओपी टू का मतलब केवल मैसेजिंग, लोकल रिटेंशन और प्रोटेक्शन और स्टेट-प्रोसेस को छुपाना, और सभी चीजों की एक्सट्रीम लेट-बाइंडिंग है।

कार्यान्वयन-वार, मैसेजिंग एक लेट-बाउंड प्रक्रिया कॉल है, और यदि प्रक्रिया कॉल लेट-बाउंड हैं, तो आप डिज़ाइन समय पर यह नहीं जान सकते हैं कि आप क्या कॉल करने जा रहे हैं, इसलिए आप राज्य के ठोस प्रतिनिधित्व के बारे में कोई धारणा नहीं बना सकते हैं। इसलिए, यह वास्तव में संदेश देने के बारे में है, देर-बाध्यकारी संदेश का कार्यान्वयन है और इसके परिणामस्वरूप एनकैप्सुलेशन होता है।

बाद में उन्होंने स्पष्ट किया कि " बड़ा विचार 'संदेश' है , और पछतावा होने के कारण इसे" संदेश-उन्मुख "के बजाय" ऑब्जेक्ट-ओरिएंटेड "कहा जाता है, क्योंकि" ऑब्जेक्ट-ओरिएंटेड "शब्द का महत्व महत्वहीन वस्तुओं (वस्तुओं) पर केंद्रित है ) और जो वास्तव में महत्वपूर्ण है (संदेश) से विचलित:

बस एक सौम्य अनुस्मारक जो मैंने पिछले OOPSLA में कुछ दर्द उठाकर सभी को यह याद दिलाने की कोशिश की कि स्मॉलटाक न केवल इसका सिंटैक्स या क्लास लाइब्रेरी है, यह कक्षाओं के बारे में भी नहीं है। मुझे खेद है कि मैंने बहुत पहले इस विषय के लिए "ऑब्जेक्ट" शब्द गढ़ा था क्योंकि यह बहुत से लोगों को कम विचार पर ध्यान केंद्रित करने के लिए मिलता है।

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

(बेशक, आज, ज्यादातर लोग वस्तुओं पर नहीं बल्कि कक्षाओं पर ध्यान केंद्रित करते हैं, जो और भी गलत है।)

संदेश OO के लिए मौलिक है, दोनों रूपक और एक तंत्र के रूप में।

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

"मैसेजिंग" के लिए एक अधिक "आधुनिक" शब्द "डायनेमिक विधि प्रेषण" या "वर्चुअल मेथड कॉल" है, लेकिन यह रूपक खो देता है और तंत्र पर ध्यान केंद्रित करता है।

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

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

स्मालटाक -72 में, कोई वस्तु भी नहीं थी! केवल संदेश धाराएँ थीं , जिन्हें लिखा गया, फिर से लिखा गया और पुन: प्रकाशित किया गया। पहले तरीके आए (संदेश धाराओं को पार्स करने और पुन: व्यवस्थित करने के मानक तरीके), बाद में ऑब्जेक्ट्स (कुछ निजी राज्य को साझा करने वाले तरीकों के समूह) आए। वंशानुक्रम बहुत बाद में आया, और वर्गों को केवल विरासत के समर्थन के तरीके के रूप में पेश किया गया था। अगर Kay के अनुसंधान समूह को पहले से ही प्रोटोटाइप के बारे में पता था, तो उन्होंने शायद पहली बार में कक्षाएं शुरू नहीं की होंगी।

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

दूसरी ओर, आप विरासत के बिना OO हो सकते हैं। जैसे मैंने ऊपर संकेत दिया था: स्मॉलटॉक के मूल संस्करण (एलन कय द्वारा डिजाइन की गई भाषा, "ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग" शब्द के आविष्कारक के पास विरासत नहीं थी।

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


आपके पास "विरासत", "बहुरूपता" और "विरासत" हो सकता है ...
मेथिंक्स

1
यह उत्तर मुझे इच्छा देता है कि हम 'पसंदीदा' उत्तर भी दे सकें।
चान-हो सुह

एलन के की परिभाषा पुरानी है। OO को इनहेरिटेंस की आवश्यकता होती है, और यदि आप C ++ की तरह रन-टाइम और कम्पाइल-टाइम बाइंडिंग दोनों कर सकते हैं, तो आपको C के साथ बराबर परफॉर्मेंस मिलती है।
एरिक अलापा

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