पहले सेमेस्टर में हमें OOP अवधारणाओं जैसे कि एनकैप्सुलेशन, डेटा छिपाना, प्रतिरूपकता, विरासत और जावा और यूएमएल के माध्यम से शुरू किया गया था। (जावा मेरी पहली प्रोग्रामिंग भाषा है)
उनमें से कोई भी OOP अवधारणाएं नहीं हैं। वे सभी OO से बाहर मौजूद हैं, OO से स्वतंत्र हैं और कई का आविष्कार OO से पहले भी हुआ था।
इसलिए, यदि आप सोचते हैं कि यही OO है, तो आपका निष्कर्ष सही है: आप उन सभी को प्रक्रियात्मक भाषाओं में कर सकते हैं, क्योंकि उनका OO से कोई लेना-देना नहीं है ।
उदाहरण के लिए, मोड्यूलरिटी पर सेमिनल पेपर में से एक मॉड्यूल में डिकम्पोजिंग सिस्टम में उपयोग किए जाने वाले मानदंड पर है । इसमें ऊ का कोई जिक्र नहीं है। (यह 1972 में लिखा गया था, तब तक OO अभी भी एक अस्पष्ट आला था, पहले से ही एक दशक से अधिक पुराना होने के बावजूद)।
जबकि OO में Data Abstraction महत्वपूर्ण है, यह OO (मैसेजिंग) की प्राथमिक विशेषता का एक परिणाम है , क्योंकि यह एक परिभाषित विशेषता है। इसके अलावा, यह याद रखना बहुत महत्वपूर्ण है कि विभिन्न प्रकार के डेटा अमूर्त हैं। आज उपयोग में आने वाले दो सबसे आम प्रकार के डेटा एब्स्ट्रैक्शन (यदि हम "नो एब्सट्रैक्शन जो भी हो" को अनदेखा करते हैं, जो कि शायद अभी भी अन्य दो संयुक्त की तुलना में अधिक उपयोग किया जाता है), एब्सट्रैक्ट डेटा प्रकार और ऑब्जेक्ट हैं । इसलिए, "सूचना छुपाना", "एनकैप्सुलेशन", और "डेटा एब्स्ट्रक्शन" कहकर, आपने OO के बारे में कुछ नहीं कहा है, क्योंकि OO डेटा एब्सट्रैक्शन का केवल एक रूप है, और दोनों वास्तव में मौलिक रूप से भिन्न हैं:
- सार डेटा प्रकारों के साथ, अमूर्त के लिए तंत्र प्रकार प्रणाली है ; यह एक प्रकार की प्रणाली है जो कार्यान्वयन को छुपाती है। (टाइप सिस्टम को जरूरी नहीं कि स्थिर होना चाहिए।) ऑब्जेक्ट्स के साथ, कार्यान्वयन एक प्रक्रियात्मक इंटरफ़ेस के पीछे छिपा होता है, जिसमें टाइप्स की आवश्यकता नहीं होती है। (उदाहरण के लिए, इसे क्लोजर के साथ लागू किया जा सकता है, जैसा कि ECMAScript में किया गया है।)
- सार डेटा प्रकारों के साथ, विभिन्न एडीटी के उदाहरण एक-दूसरे से अलग हो जाते हैं, लेकिन एक ही एडीटी के उदाहरण एक -दूसरे के प्रतिनिधित्व और निजी कार्यान्वयन का निरीक्षण और उपयोग कर सकते हैं। वस्तुओं को हमेशा हर चीज से अलग किया जाता है । केवल वस्तु ही अपने स्वयं के प्रतिनिधित्व का निरीक्षण कर सकती है और अपने स्वयं के निजी कार्यान्वयन तक पहुंच सकती है। कोई अन्य वस्तु नहीं, एक ही प्रकार की अन्य वस्तुएं भी नहीं, एक ही वर्ग की अन्य वृत्तियाँ, एक ही प्रोटोटाइप वाली अन्य वस्तुएं, वस्तु के क्लोन या जो कुछ भी कर सकते हैं। कोई नहीं ।
इसका मतलब है, वैसे, जावा में, कक्षाएं ऑब्जेक्ट-ओरिएंटेड नहीं हैं। एक ही वर्ग के दो उदाहरण एक दूसरे के प्रतिनिधित्व और निजी कार्यान्वयन तक पहुंच सकते हैं । इसलिए, वर्गों के उदाहरण ऑब्जेक्ट नहीं हैं, वे वास्तव में एडीटी उदाहरण हैं। जावा interface
रों है, तथापि, है वस्तु उन्मुख डेटा अमूर्त प्रदान करते हैं। तो, दूसरे शब्दों में: केवल इंटरफेस के उदाहरण जावा में ऑब्जेक्ट हैं, वर्गों के उदाहरण नहीं हैं।
मूल रूप से, प्रकारों के लिए, आप केवल इंटरफेस का उपयोग कर सकते हैं। इसका मतलब है कि पैरामीटर प्रकार और विधियाँ, रिटर्न प्रकार के तरीके, उदाहरण के प्रकार फ़ील्ड, स्थिर फ़ील्ड और स्थानीय फ़ील्ड, instanceof
ऑपरेटर या कास्ट ऑपरेटर के लिए तर्क, और सामान्य प्रकार के निर्माता के लिए प्रकार तर्क हमेशा इंटरफेस होना चाहिए। एक वर्ग केवल new
ऑपरेटर के बाद सीधे इस्तेमाल किया जा सकता है , कहीं और नहीं।
उदाहरण के लिए, प्रतिरूपकता के लिए हम कार्यक्रम को कई छोटे कार्यक्रमों में विभाजित कर सकते हैं जो अच्छी तरह से परिभाषित कार्य करते हैं जिनका कोड अलग-अलग फाइलों में समाहित है। ये कार्यक्रम एक-दूसरे के साथ उनके सुव्यवस्थित इनपुट और आउटपुट के माध्यम से बातचीत करेंगे। इनकैप्सुलेशन प्राप्त करने के लिए फ़ाइलों को संरक्षित (एन्क्रिप्टेड?) किया जा सकता है। कोड री-यूज़ के लिए हम केवल उन फ़ाइलों को कॉल कर सकते हैं, जब भी उन्हें नए कार्यक्रमों में आवश्यकता होती है। क्या यह सब OOP पर कब्जा नहीं है या मैं कुछ बहुत स्पष्ट याद कर रहा हूँ?
आप जो वर्णन करते हैं वह OO है।
यह वास्तव में OO के बारे में सोचने का एक अच्छा तरीका है। वास्तव में, यह वास्तव में ओओ के मूल आविष्कारों के बारे में बहुत कुछ है। (एलन के एक कदम आगे बढ़ गया: उन्होंने नेटवर्क पर एक दूसरे को संदेश भेजने वाले बहुत से छोटे कंप्यूटरों की कल्पना की।) जिसे आप "प्रोग्राम" कहते हैं, उसे आमतौर पर "ऑब्जेक्ट" कहा जाता है और "कॉल" के बजाय हम आमतौर पर कहते हैं "एक संदेश भेजें। "।
ऑब्जेक्ट ओरिएंटेशन मैसेजिंग (उर्फ डायनामिक डिस्पैच ) के बारे में है। "ऑब्जेक्ट ओरिएंटेड" शब्द स्मॉलटाक के प्रमुख डिजाइनर डॉ। एलन के द्वारा गढ़ा गया था, और वह इसे इस तरह परिभाषित करते हैं :
ओओपी टू मी का मतलब केवल मैसेजिंग, स्थानीय अवधारण और संरक्षण और राज्य-प्रक्रिया का छिपाना, और सभी चीजों का चरम देर-बंधन है।
चलो कि नीचे तोड़:
- मैसेजिंग ("वर्चुअल मेथड डिस्पैच", यदि आप स्मॉलटाकल से परिचित नहीं हैं)
- राज्य-प्रक्रिया होनी चाहिए
- स्थानीय रूप से बनाए रखा
- संरक्षित
- छिपा हुआ
- सभी चीजों की चरम देर से बाध्यकारी
कार्यान्वयन-वार, मैसेजिंग एक लेट-बाउंड प्रक्रिया कॉल है, और यदि प्रक्रिया कॉल लेट-बाउंड हैं, तो आप डिज़ाइन समय पर यह नहीं जान सकते हैं कि आप क्या कॉल करने जा रहे हैं, इसलिए आप राज्य के ठोस प्रतिनिधित्व के बारे में कोई धारणा नहीं बना सकते हैं। इसलिए, वास्तव में यह संदेश देने के बारे में है, देर-बाध्यकारी संदेश का कार्यान्वयन है और इसके परिणामस्वरूप एनकैप्सुलेशन होता है।
बाद में उन्होंने स्पष्ट किया कि " बड़ा विचार 'संदेश' है , और पछतावा होने के कारण इसे" संदेश-उन्मुख "के बजाय" ऑब्जेक्ट-ओरिएंटेड "कहा जाता है, क्योंकि" ऑब्जेक्ट-ओरिएंटेड "शब्द का महत्व महत्वहीन चीजों (वस्तुओं) पर केंद्रित है ) और जो वास्तव में महत्वपूर्ण है (संदेश) से विचलित:
बस एक सौम्य अनुस्मारक जो मैंने पिछले OOPSLA में कुछ दर्द उठाकर सभी को यह याद दिलाने की कोशिश की कि स्मॉलटाक न केवल इसका सिंटैक्स या क्लास लाइब्रेरी है, यह कक्षाओं के बारे में भी नहीं है। मुझे खेद है कि मैंने बहुत पहले इस विषय के लिए "ऑब्जेक्ट" शब्द गढ़ा था क्योंकि यह बहुत से लोगों को कम विचार पर ध्यान केंद्रित करने के लिए मिलता है।
बड़ा विचार "मैसेजिंग" है - यही है कि स्मॉलटॉक / स्क्वीक की गुठली सभी के बारे में है (और यह कुछ ऐसा है जो हमारे ज़ेरॉक्स PARC चरण में कभी पूरा नहीं हुआ था)। जापानी के पास एक छोटा शब्द है - मा - "जो कि बीच में है" - शायद निकटतम अंग्रेजी समकक्ष "इंटरस्टिशियल" है। महान और विकसित करने की प्रणाली बनाने में महत्वपूर्ण यह है कि इसके आंतरिक गुणों और व्यवहारों के बजाय इसके मॉड्यूल कैसे संवाद करते हैं। इंटरनेट के बारे में सोचो - जीने के लिए, इस (ए) को कई अलग-अलग प्रकार के विचारों और अहसासों की अनुमति देना है जो किसी भी एकल मानक से परे हैं और (बी) इन विचारों के बीच अलग-अलग सुरक्षित अंतर की डिग्री की अनुमति देता है।
(बेशक, आज, ज्यादातर लोग वस्तुओं पर नहीं बल्कि कक्षाओं पर भी ध्यान केंद्रित करते हैं, जो और भी गलत है।)
संदेश OO के लिए मौलिक है, दोनों रूपक और एक तंत्र के रूप में।
यदि आप किसी को संदेश भेजते हैं, तो आप नहीं जानते कि वे इसके साथ क्या करते हैं। केवल बात यह है कि आप देख सकते हैं, उनकी प्रतिक्रिया है। आप नहीं जानते कि क्या उन्होंने स्वयं संदेश को संसाधित किया है (अर्थात यदि वस्तु में कोई विधि है), यदि उन्होंने संदेश किसी और (प्रतिनिधि / समीपता) को भेज दिया, यदि वे इसे समझ भी गए। यही सब कुछ है, यही OO है। आप किसी प्रॉक्सी को वास्तविक चीज़ से अलग भी नहीं कर सकते हैं, जब तक कि यह जवाब नहीं देता कि आप उससे कैसे उम्मीद करते हैं।
"मैसेजिंग" के लिए एक अधिक "आधुनिक" शब्द "डायनेमिक विधि प्रेषण" या "वर्चुअल मेथड कॉल" है, लेकिन यह रूपक खो देता है और तंत्र पर ध्यान केंद्रित करता है।
इसलिए, एलन के की परिभाषा को देखने के दो तरीके हैं: यदि आप इसे अपने दम पर खड़े देखते हैं, तो आप देख सकते हैं कि संदेश मूल रूप से एक देर से बाध्य प्रक्रिया कॉल है और देर-बाइंडिंग का तात्पर्य है, ताकि हम यह निष्कर्ष निकाल सकें कि # 1 और # 2 वास्तव में बेमानी हैं, और OO सभी देर से बाध्यकारी है।
हालांकि, उन्होंने बाद में स्पष्ट किया कि महत्वपूर्ण चीज संदेश है, और इसलिए हम इसे एक अलग कोण से देख सकते हैं: संदेश देर से बाध्य है। अब, यदि मैसेजिंग केवल एक ही चीज संभव थी, तो # 3 तुच्छ रूप से सच होगी: यदि केवल एक ही चीज है, और वह चीज देर से-बाध्य है, तो सभी चीजें देर से बाध्य हैं। और एक बार फिर, संदेश से एनकैप्सुलेशन निम्नानुसार है।
इसी तरह के अंक ऑन अंडरस्टैंडिंग डेटा एब्सट्रैक्शन, विलियम आर। कुक द्वारा पुनरीक्षित और "ऑब्जेक्ट" और "ऑब्जेक्ट ओरिएंटेड" के सरलीकृत, आधुनिक परिभाषाओं के लिए उनके प्रस्ताव में भी किए गए हैं :
संचालन का गतिशील प्रेषण वस्तुओं की अनिवार्य विशेषता है। इसका मतलब यह है कि लागू किया जाने वाला ऑपरेशन वस्तु का एक गतिशील गुण है। संचालन को सांख्यिकीय रूप से पहचाना नहीं जा सकता है, और सामान्य तौर पर [पता] करने का कोई तरीका नहीं है कि किसी दिए गए अनुरोध के जवाब में वास्तव में क्या संचालन निष्पादित किया जाएगा, इसे छोड़कर। यह बिल्कुल प्रथम श्रेणी के कार्यों के समान है, जो हमेशा गतिशील रूप से भेजे जाते हैं।
स्मालटाक -72 में, कोई वस्तु भी नहीं थी! केवल संदेश धाराएँ थीं , जिन्हें लिखा गया, फिर से लिखा गया और पुन: प्रकाशित किया गया। पहले विधियाँ आईं (संदेश धाराओं को पार्स करने और पुन: व्यवस्थित करने के मानक तरीके), बाद में ऑब्जेक्ट्स (कुछ निजी राज्य को साझा करने वाले तरीकों के समूह) आए। वंशानुक्रम बहुत बाद में आया, और वर्गों को केवल विरासत के समर्थन के तरीके के रूप में पेश किया गया था। अगर Kay के अनुसंधान समूह को पहले से ही प्रोटोटाइप के बारे में पता था, तो उन्होंने शायद पहली बार में कक्षाएं शुरू नहीं की होंगी।
प्रकार और प्रोग्रामिंग भाषाओं में बेंजामिन पियर्स का तर्क है कि ऑब्जेक्ट-ओरिएंटेशन की परिभाषित विशेषता ओपन रिकर्सन है ।
तो: एलन Kay के अनुसार, OO मैसेजिंग के बारे में है। विलियम कुक के अनुसार, ओओ गतिशील पद्धति प्रेषण के बारे में है (जो वास्तव में एक ही बात है)। बेंजामिन पियर्स के अनुसार, OO सभी ओपन रिकर्सियन के बारे में है, जिसका मूल अर्थ है कि स्व-संदर्भों को गतिशील रूप से हल किया जाता है (या कम से कम यह सोचने का एक तरीका है), या, दूसरे शब्दों में, संदेश।
जैसा कि आप देख सकते हैं, "ओओ" शब्द का इस्तेमाल करने वाले व्यक्ति की वस्तुओं पर एक बहुत ही व्यापक विचार है, कुक के पास एक व्यावहारिक दृष्टिकोण है, और एक बहुत ही कठोर गणितीय दृष्टिकोण पियर्स। लेकिन महत्वपूर्ण बात यह है: दार्शनिक, व्यावहारिक और सैद्धांतिक सभी सहमत हैं! मैसेजिंग OO का एक स्तंभ है। अवधि।
ध्यान दें कि यहाँ विरासत का कोई उल्लेख नहीं है! OO के लिए वंशानुक्रम आवश्यक नहीं है। सामान्य तौर पर, अधिकांश OO भाषाओं में कार्यान्वयन के कुछ तरीके पुन: उपयोग होते हैं, लेकिन जरूरी नहीं कि उनका उत्तराधिकार होना चाहिए। उदाहरण के लिए, यह प्रतिनिधिमंडल का कुछ रूप भी हो सकता है। वास्तव में, ऑरलैंडो की संधि , प्रतिनिधिमंडल की विरासत के विकल्प के रूप में चर्चा करती है और प्रतिनिधिमंडल और विरासत के विभिन्न रूपों से ऑब्जेक्ट-ऑयंटेड भाषाओं के डिज़ाइन स्पेस के भीतर अलग-अलग डिज़ाइन बिंदुओं की ओर कैसे जाता है। (ध्यान दें कि वास्तव में जावा की तरह विरासत का समर्थन करने वाली भाषाओं में भी, लोगों को वास्तव में इससे बचने के लिए सिखाया जाता है, फिर से संकेत मिलता है कि यह OO के लिए आवश्यक नहीं है।)