ऑब्जेक्ट ओरिएंटेशन के लिए क्या विशेषताएं आवश्यक हैं?


9

मैं बस सोच रहा हूँ, कि वास्तव में एक भाषा या एक पुस्तकालय के लिए क्या सुविधाएँ होनी चाहिए ताकि इसे 'ऑब्जेक्ट ओरिएंटेड' के रूप में परिभाषित किया जा सके। क्या ऑब्जेक्ट ओरिएंटेशन कुछ ऐसा है, जो कम या ज्यादा हो सकता है, सभ्य सुविधाओं के साथ किसी भी सामान्य प्रयोजन प्रोग्रामिंग भाषा में प्राप्त किया जा सकता है? या यह कुछ ऐसा है जो केवल उन भाषाओं में प्राप्त किया जा सकता है जो विशेष रूप से विज्ञापन करते हैं कि वे ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग का समर्थन करते हैं?

उदाहरण के लिए, निम्नलिखित C कोड को देखें:

SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE);
SDL_FreeSurface( screen );

या यहां चर्चा की गई कोड ।

अब उपरोक्त कोड वंशानुक्रम, रनटाइम-पोलिमोर्फ़िज्म (?), वर्चुअल फ़ंक्शंस आदि का उपयोग नहीं करता है, लेकिन यह मुझे बहुत अधिक OOP लगता है।

क्या ऑब्जेक्ट-ओरिएंटेशन केवल कोड लिखना है जो ऑब्जेक्ट्स, क्लासेस, स्ट्रक्चर्स आदि जैसे क्रिएबल और डिस्ट्रक्टेबल डेटा स्ट्रक्चर्स पर आधारित है, जिसे प्रोग्रामिंग लैंग्वेज या लाइब्रेरी द्वारा प्रदान किए गए किसी विशेष पैटर्न या फीचर्स की आवश्यकता नहीं है ?


2
ओओपी में आमतौर पर वस्तुओं की आवश्यकता होती है । हालांकि यह कोड लिखना संभव है जो ओओपी को अधिकांश भाषाओं में देखता है (मुझे संदेह है कि आप "यह असेंबली
ओओपी दिखते

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

लिंक भी शामिल किया गया है इसके बाद के संस्करण कोड जो मैं पर आंका। यह भी ध्यान दें कि यह एक निर्णय नहीं है , मैं आपसे पूछ रहा हूं कि क्या इसे OOP माना जा सकता है।
अपरेंटिसहैकर

तुच्छ उत्तर हाँ है । मेरा कहना यह है आप कोड के उदाहरणों से - OOP के बारे में निर्णय नहीं कर सकते। यह परिभाषा का एक तुच्छ मामला है। या तो भाषा को एक OOP भाषा के रूप में परिभाषित किया गया है या यह नहीं है। किसी भी दिए गए कोड नमूने को सभी OOP सुविधाओं की आवश्यकता नहीं हो सकती है। दरअसल, OOP कोड बहुत कम सुविधाओं का उपयोग कर सकता है। उदाहरण के लिए, पायथन में, 1+2वास्तव में ऑब्जेक्ट ओरिएंटेड है। यह एक निर्माता है जो दो मौजूदा वस्तुओं से एक नई वस्तु बनाता है। कोड के नमूनों का उपयोग करने से कुछ नहीं पता चलता है।
एस.लॉट

इस परिभाषा का उपयोग करने और भाषा (दो कोड नमूने नहीं) के साथ तुलना करने में क्या गलत है ? en.wikipedia.org/wiki/…
S.Lott

जवाबों:


11

एलन के अनुसार, जिन्होंने "ऑब्जेक्ट ओरिएंटेड" शब्द का आविष्कार किया था,

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

मैसेजिंग (जैसा कि स्मॉलटाक में लागू किया गया है) बहुरूपता के लिए एक तुलनात्मक अवधारणा है, बल्कि अधिक शक्तिशाली (कम से कम उस तरह के बहुरूपता से अधिक है जो C ++ या जावा द्वारा समर्थित है)। यह सभी भाषाओं में किया जा सकता है, लेकिन यदि भाषा द्वारा सीधे समर्थित नहीं है, तो यह दर्दनाक है। मूल रूप से इसका मतलब है कि वस्तुएं एक दूसरे को कुछ भी संदेश भेज सकती हैं, amd प्रतिक्रिया कर सकते हैं हालांकि वे उन संदेशों को प्राप्त करना चाहते हैं जो वे प्राप्त करते हैं। मैसेजिंग को पूरी तरह से सपोर्ट करने के लिए, सोर्स कोड में उन्हें एन्यूमरेट किए बिना संदेशों पर लचीले ढंग से प्रतिक्रिया करने के लिए ऑब्जेक्ट के लिए एक तरीका होना चाहिए (जो मूल रूप से विधि / फ़ंक्शन की परिभाषा क्या करता है)।

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

सभी चीजों के देर से बंधन - एक स्लाइडिंग स्केल जिस पर सी वास्तव में Kay की दृष्टि से बहुत दूर है (जैसा कि C ++ है, जबकि जावा बहुत करीब है)। नकली हो सकता है (COM देखें), लेकिन इसका उपयोग करने के लिए एक दर्द होगा।

ध्यान दें कि कैसे Kay वंशानुक्रम का उल्लेख नहीं करता है । उसी ईमेल में उन्होंने लिखा था

मुझे यह पसंद नहीं आया कि जिस तरह से सिमुला I या सिमूला 67 ने वंशानुक्रम किया (हालांकि मुझे लगा कि न्यागार्ड और डाहल सिर्फ जबरदस्त विचारक और डिजाइनर थे)। इसलिए मैंने अंतर्निहित विशेषता के रूप में विरासत को छोड़ने का फैसला किया, जब तक कि मैंने इसे बेहतर नहीं समझा


4
वास्तव में C ++ की तुलना में जावा और C # देर से बाध्यकारी के करीब कैसे हैं?
fredoverflow

@FredOverflow: जावा लाज़िली रनटाइम पर कक्षा की परिभाषाओं को लोड करता है जब वे पहली बार उपयोग किए जाते हैं, और एक बहुत ही लचीले तंत्र के माध्यम से ऐसा करते हैं जो आसानी से नई कक्षाओं को जोड़ने या यहां तक ​​कि मक्खी पर उन्हें उत्पन्न करने की अनुमति देता है। C ++ के लिए आपको अपने निष्पादन योग्य या स्पष्ट रूप से लोड पुस्तकालयों को त्यागना होगा। सी # के साथ स्थिति मेरे विचार से कम स्पष्ट प्रतीत होती है, इसलिए मैंने ती के संदर्भ को हटा दिया।
माइकल बोर्गवर्ड

5

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

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

व्यावहारिक रूप से, हालांकि, एक भाषा को 'ऑब्जेक्ट-ओरिएंटेड' कहा जा सकता है, अगर यह स्पष्ट ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के लिए सिंटैक्स सुविधाओं का एक पूरा सेट प्रदान करता है। आमतौर पर, इसका मतलब है कि इस तरह की भाषा होनी चाहिए: * किसी वस्तु की एक धारणा * विधि कॉलिंग या संदेश पास करने की एक धारणा * वस्तु सदस्यों तक पहुंच को नियंत्रित करने का एक सहज और सरल तरीका * इंटरफेस को परिभाषित करने का एक सहज और सीधा तरीका

यदि यह OOP सिद्धांतों का पालन करता है और उपलब्ध OOP सिंटैक्स का उपयोग करता है तो नतीजतन, मैं कोड ऑब्जेक्ट-ओरिएंटेड का एक टुकड़ा कहूंगा।

BTW।, आपका कोड उदाहरण शायद बहुरूपता और आभासी कार्यों का उपयोग करता है , हालांकि सी सिंटैक्स इसे स्पष्ट नहीं करता है। मैं SDL का विशेषज्ञ नहीं हूं, लेकिन मैं उम्मीद करूंगा कि SDL_surfaceविभिन्न प्रकार की सतहों का प्रतिनिधित्व करने में सक्षम होने के लिए, प्रत्येक अपने स्वयं के कार्यान्वयन के विशिष्ट सेट के साथ - एक मेमोरी बिटमैप पर कुछ ब्लिटिंग और स्क्रीन की सतह पर ब्लिटिंग के लिए मौलिक रूप से अलग होना आवश्यक है। कोड, लेकिन इंटरफ़ेस ( SDL_surface*एक तर्क के रूप में कार्य करने वाले ) समान रहता है। ठीक उसी तरह, यह एनकैप्सुलेशन को भी लागू करता है: आप किसी सतह के अंतर्निहित प्रतिनिधित्व को सीधे एक्सेस नहीं कर सकते हैं, आपको फ़ंक्शंस से गुजरना होगा जो जानते हैं कि कैसे संभालना है SDL_surface, क्योंकि यह सब आपके पास है। यह एक अच्छा उदाहरण है कि आप C में OOP कैसे करेंगे।


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

4

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

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


2

जब मैं एक छात्र था तो मुझे सिखाया गया था कि ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग तीन स्तंभों पर खड़ा है:

  • एनकैप्सुलेशन ,
  • बहुरूपता , और
  • वंशानुक्रम

एक भाषा को एक वस्तु-उन्मुख भाषा माना जाने के लिए उन विशेषताओं का समर्थन करना होगा।

ध्यान दें कि यह सिंटैक्स के बजाय सुविधाओं का एक सेट बताता है । इसलिए, आपको लिखना है या नहीं

type obj; // or type obj = new type;
obj.func(arg);

या

type* ptr = create_type();
func(ptr, arg); 

कोई बात नहीं।

तो आप वास्तव में सी में ऑब्जेक्ट-ओरिएंटेड प्रतिमान के अनुसार कार्यक्रम कर सकते हैं, लेकिन भाषा इसके लिए कोई समर्थन नहीं देती है, जो इसे एक बल्कि दर्दनाक व्यायाम बनाती है। यही कारण है कि सी को एक वस्तु-उन्मुख भाषा नहीं माना जाता है।


2
इन "खंभों" को पढ़ाने से शायद दुनिया की भलाई से ज्यादा नुकसान हुआ है। एनकैप्सुलेशन अच्छा है, लेकिन यह इसके बारे में है।
तदमर्स

1
वे इस सूची में हैं, इसलिए वे व्यापक रूप से स्वीकार किए जाते हैं: en.wikipedia.org/wiki/…
S.Lott

क्या आप बता सकते हैं कि बहुरूपता और वंशानुक्रम खराब क्यों हैं?
मैथअटैक

@ मैथअटैक: क्या आप मुझसे बात कर रहे हैं ? क्योंकि मैंने निश्चित रूप से ऐसा नहीं कहा था।
sbi

1
@ मिस्सिंगो: प्रतिमान को अलग करने के लिए कुछ को कुछ प्रतिमान के लिए अद्वितीय होना महत्वपूर्ण नहीं माना जाता है। एनकैप्सुलेशन को OOP के लिए अद्वितीय होना आवश्यक नहीं है क्योंकि फ़ंक्शन को संरचित प्रोग्रामिंग के लिए अद्वितीय होना चाहिए।
sbi

2

आप किसी भी सामान्य सामान्य प्रयोजन की भाषा में OO कर सकते हैं।

इसे "ओओ" भाषा में करना आसान है, क्योंकि आपके पास मुहावरेदार निर्माण उपलब्ध हैं और सी में ओओ जैसी चीज़ का सहारा नहीं लेना है - जो संभव है, लेकिन भयानक है।

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


2

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

OO भाषाओं से जुड़ी दो प्रमुख विशेषताओं को गैर OO भाषाओं द्वारा प्रदान किया गया है:

  • Ada83 द्वारा एनकैप्सुलेशन काफी अच्छी तरह से प्रदान किया गया है;
  • ओबरन द्वारा विरासत प्रदान की जाती है (ओबेरॉन दिलचस्प है, Wirth एक OO भाषा प्रदान करना चाहता था जितना संभव हो उतना कम cruft के साथ, लेकिन एक - Oberon-2 OO है) प्राप्त करने के लिए अपनी गर्भाधान को फिर से करना पड़ा।

1

ऑब्जेक्ट ओरिएंटेशन के रूप में परिभाषित किया गया है

विकिपीडिया प्रविष्टियों को भी देखें। वे विशेषताएं हैं जिन्हें एक भाषा को प्रदान करना चाहिए ताकि इसे वस्तु उन्मुख के रूप में परिभाषित किया जा सके।

अपने कोड ऑब्जेक्ट ओरिएंटेड पर विचार करें यदि यह ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग लैंग्वेज में है। यहां तक ​​कि अगर आप कुछ ऐसा लिखते हैं जो प्रक्रियात्मक प्रतीत होता है तो यह क्लासमेट से पॉलिमॉर्फिज़्म का उपयोग करते हुए कक्षाओं में वस्तुओं पर काम कर रहा होगा [शायद] :)

आपके अंतिम प्रश्न के बारे में उत्तर शायद है। हाँ। ऑब्जेक्ट ओरिएंटेड मूल रूप से ऑब्जेक्ट्स पर विधियों पर कार्य कर रहा है और उन ऑब्जेक्ट्स को मापदंडों के रूप में चारों ओर से गुजर रहा है।


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