ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के लाभ [बंद]


35

नोट : यह प्रश्न एक ब्लॉग पोस्टिंग का एक संपादित अंश है जो मैंने कुछ महीने पहले लिखा था। प्रोग्रामर्स पर एक टिप्पणी में ब्लॉग का लिंक रखने के बाद। किसी ने अनुरोध किया कि मैं यहां एक प्रश्न पोस्ट करूं ताकि वे इसका जवाब दे सकें। के रूप में लोगों लिखने के लिए Google में "मैं ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग नहीं मिलता है" लगता है यह पोस्टिंग, मेरी सबसे लोकप्रिय है एक बहुत । यहाँ, या Wordpress पर एक टिप्पणी में जवाब देने के लिए स्वतंत्र महसूस करें।

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग क्या है? किसी ने भी मुझे संतोषजनक जवाब नहीं दिया। मुझे ऐसा लगता है कि आपको किसी ऐसे व्यक्ति से अच्छी परिभाषा नहीं मिलेगी, जो हवा में अपनी नाक के साथ "ऑब्जेक्ट" और "ऑब्जेक्ट-ओरिएंटेड" कहता है। न ही आपको किसी ऐसे व्यक्ति से अच्छी परिभाषा मिलेगी जिसने ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के अलावा कुछ नहीं किया हो। कोई भी जो प्रक्रियात्मक और ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग दोनों को नहीं समझता है, उसने मुझे कभी भी एक सुसंगत विचार नहीं दिया है कि वास्तव में ऑब्जेक्ट-ओरिएंटेड प्रोग्राम क्या करता है।

क्या कोई मुझे ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के फायदों के बारे में बता सकता है?


2
ऊह, एक अच्छा - यह एक परिभाषा के साथ आने के लिए मुश्किल है कि हर कोई जो कहता है कि वे ओओपी के साथ सहमत होंगे! (यहां तक ​​कि उन लोगों की उपेक्षा करना जो वास्तव में सिर्फ
ओओपी

10
यह वास्तव में लगता है जैसे "मुझे C प्रोग्रामिंग नहीं मिलती। क्या हम सिर्फ असेंबली भाषा का उपयोग नहीं कर सकते?" मेरे लिए।
टिया

2
@ जॉयल: मुझे जरूरी नहीं कि आप जैसा करते हैं, उसी तरह के अनपिनेंट प्रपोजर्स को भी नहीं जानते, लेकिन मुझे लगता है कि इसका एक अच्छा हिस्सा यह हो सकता है कि ओओ लैंग्वेजेज में क्लासेस द्वारा उन्हें प्रोग्रामिंग के लिए पेश किया जाए। यदि यह आपकी आधार रेखा है, तो आपको समझ में नहीं आता कि यह एक कदम कैसे है। मेरी पहली भाषा Applesoft BASIC थी, और मैंने डेल्फी और C ++ द्वारा OOP के सामने पेश किए जाने से पहले मुट्ठी भर बुनियादी बोलियों, प्लस C, पास्कल और थोड़ी सी x86 असेंबली सीखी थी। जिन लोगों ने अंतर का अनुभव किया है, वे इसे समझाने में सक्षम हैं।
मेसन व्हीलर

3
OOP के बारे में और अधिक नकारात्मक टिप्पणियाँ यहाँ: हानिकारक . cat-v.org/software/OO_programming , जिसमें दिक्जस्त्र और रोब पाइक के उद्धरण शामिल हैं।
imgx64

3
@ जॉयल: आपने ओओपी के लिए मेरी आपत्ति को सिर पर मारा। जो लोग ओओपी एक-सच्चे-सच्चे हैं वे आमतौर पर प्रक्रियात्मक प्रोग्रामिंग के बारे में पुआल-आदमी का दृष्टिकोण रखते हैं और किसी भी अन्य प्रतिमान में कोई अनुभव नहीं है। फ़ंक्शनल प्रोग्रामिंग उनके लिए पूरी तरह से अलग दिखेगी (सबूत: हाल ही में लोगों से पूछें कि किसी विचित्र कारण से एर्लांग में कक्षाएं और ऑब्जेक्ट्स कैसे करना है) और लॉजिक प्रोग्रामिंग उनके सिर को विस्फोट कर देगा, मैं आश्वस्त हूं। मैं केवल कल्पना कर सकता हूं कि वास्तव में कुछ विचित्र प्रतिमान उनके लिए क्या करेंगे ....
JUST MY correct OPINION

जवाबों:


7

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

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

यही प्रक्रियात्मक प्रोग्रामिंग जैसा है।

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

गैर-ऑब्जेक्ट-उन्मुख सॉफ़्टवेयर पर ऑब्जेक्ट-ओरिएंटेशन के लाभों के रूप में:

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

3
आपके द्वारा कहा गया सब कुछ कार्यात्मक प्रोग्रामिंग पर समान रूप से लागू होता है, यहां समस्या को उजागर करता है।
जेसी मिलिकैन

1
ओपी को छोड़कर कार्यात्मक प्रोग्रामिंग के बारे में नहीं पूछा, इसलिए आपकी टिप्पणी में योग्यता का अभाव है। विशेष रूप से इसलिए कि मेरा उत्तर स्वीकार है।
Huperniketes

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

46

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

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

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

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

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

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

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

EDIT: टिप्पणियों में जोएल के सवाल के जवाब में,

क्या आप बता सकते हैं कि एक "ऑब्जेक्ट-ओरिएंटेड प्रोग्राम" में क्या है (इन फैंसी डिफ्रैंट्स के अलावा जो आपने रेखांकित किया है) जो मूल रूप से एक अनिवार्य प्रोग्राम से अलग है? आप "गेंद को कैसे लुढ़काते हैं?"

यहाँ एक छोटा सा अस्वीकरण। "ऑब्जेक्ट-ओरिएंटेड प्रोग्राम" का मेरा मॉडल मूल रूप से डेल्फी मॉडल है, जो कि पूर्व डेल्फी टीम के सदस्यों द्वारा बनाए जाने के बाद से सी # / NET मॉडल के समान है। मैं जो यहां कह रहा हूं वह अन्य OO भाषाओं में लागू नहीं हो सकता है, या उतना लागू नहीं हो सकता है।

ऑब्जेक्ट-ओरिएंटेड प्रोग्राम वह है जिसमें सभी लॉजिक को ऑब्जेक्ट के आसपास संरचित किया जाता है। बेशक यह कहीं बूटस्ट्रैप होना है। आपके विशिष्ट डेल्फी कार्यक्रम में आरंभीकरण कोड होता है जो एक सिंगलटन ऑब्जेक्ट बनाता है जिसे कहा जाता है Application। कार्यक्रम की शुरुआत में, यह कॉल करता है Application.Initialize, फिर Application.CreateFormहर फॉर्म के लिए एक कॉल जिसे आप शुरुआत से मेमोरी में लोड करना चाहते हैं, और फिर Application.Run,जो स्क्रीन पर मुख्य फॉर्म प्रदर्शित करता है और इनपुट / ईवेंट लूप शुरू करता है जो किसी का मूल बनाता है इंटरैक्टिव कंप्यूटर प्रोग्राम।

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

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


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

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

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

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

2
OOP के वास्तविक लाभ की ओर इशारा करते हुए +1। "इसके मूल में, OOP समस्या डोमेन को मॉडल बनाने वाले" स्मार्ट "डेटा स्ट्रक्चर्स को बनाकर जटिलता के उच्च डिग्री का बेहतर प्रबंधन करने के लिए अनिवार्य प्रतिमान का उपयोग करने का एक तरीका है।"
कार्तिक श्रीनिवासन

6

मुझे लगता है कि ओओपी मूल रूप से सिर्फ एक नाम है जिसे आप जिस तरह से पसंद कर रहे हैं, वैसा ही कुछ करने के लिए आपको लुभाया जा सकता है।

जिस तरह से जब मैं एक बच्चा प्रोग्रामर था, यहां तक ​​कि फोरट्रान में भी, एक सबरूटीन के लिए एक संकेतक के रूप में ऐसा कुछ था। किसी अन्य उपराष्ट्रपति के तर्क के रूप में एक उपविजेता के पास सूचक को पास करने में सक्षम होना वास्तव में उपयोगी है।

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

मुझे यकीन नहीं है कि अगर वे कभी फोरट्रान में बने, लेकिन सी और उसके वंशजों में करना आसान है।

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


5

OO सिस्टम के विभिन्न प्रकार हैं, और एक परिभाषा प्राप्त करना कठिन है जिस पर हर कोई सहमत होगा। यह दिखाने की कोशिश करने के बजाय कि जावा का OO आम लिस्प ऑब्जेक्ट सिस्टम के समान है, मैं कुछ और पारंपरिक कदमों के साथ शुरू करूंगा।

मान लीजिए कि आपके पास बिखरे हुए डेटा के रूप में बहुत सी वस्तुएं मौजूद हैं। उदाहरण के लिए, अंक X, Y और Z सरणी में तत्व हो सकते हैं। एक बिंदु पर विचार करने के लिए, यह सभी डेटा को एक सी की तरह किसी चीज़ में खींचने के लिए समझ में आता है struct

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

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

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

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


3

OO की कई अलग-अलग परिभाषाएँ हैं, हाँ। मुझे यकीन है कि आप इनमें से बहुत सारे अपने दम पर पा सकते हैं। मैं व्यक्तिगत रूप से रीस रे: ओओ को उनमें से एक अर्थ के रूप में पसंद करता हूं। मैं अनुमान लगा रहा हूं कि आपने पॉल ग्राहम को उद्धृत करते हुए पहले ही पढ़ लिया है। (मैं OO में रुचि रखने वाले किसी को भी इसकी सलाह देता हूं।) मैं जावा परिभाषा को कम से कम यहाँ अपनाने जा रहा हूँ {1,2,3,7,8,9}।

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

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

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

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


+1 - शानदार जवाब। "मुझे नहीं लगता कि OO छोटे स्तर पर बहुत उपयोगी है।"
कार्तिक श्रीनिवासन

मैंने यह भी एक लेख ( dl.acm.org/citation.cfm?id=326103 ) पढ़ा था जिसमें कहा गया था कि OOP किसी सॉफ्टवेयर उत्पाद के पहले दो रिलीज के लिए प्रक्रियात्मक के लिए कोई वास्तविक उत्पादकता लाभ wrt नहीं दिखाता है। जहां तक ​​मैं समझता हूं, केवल तीसरी रिलीज से शुरू होने वाले आपके वास्तविक फायदे हैं क्योंकि आप एक प्रक्रियात्मक शैली की तुलना में OO शैली में लिखे गए कोड का बेहतर पुन: उपयोग / रिफ्लेक्टर कर सकते हैं।
जियोर्जियो

1

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

  • व्यक्ति एक वस्तु है। एक व्यक्ति में कुछ गुण होते हैं, जैसे उम्र और लिंग। एक व्यक्ति चीजों को कर सकता है: खाना, सोना, कार चलाना।
  • कार भी एक वस्तु है (हालांकि विभिन्न प्रकार की)। इसमें मेक, मॉडल और वर्ष जैसे गुण भी हैं। एक कार चीजें कर सकती हैं: चाल।

लेकिन एक कार अपने दम पर आगे नहीं बढ़ सकती है, इसे ड्राइव करने के लिए एक व्यक्ति की आवश्यकता है - वस्तुओं के बीच बातचीत।


मुझे यह मिल गया: यह समझ में आता है। हालाँकि, मुझे लगता है कि कंप्यूटर की प्रोग्रामिंग के बारे में एक बहुत अच्छी बात यह है कि हमें "वास्तविक दुनिया" वस्तुओं के बारे में सोचने की ज़रूरत नहीं है। मुझे लगता है कि अधिक गणितीय रूप से (मैं जीव विज्ञान अनुसंधान कर रहा हूं)। यह एक "ए-हा" (एक ध्यानपूर्ण अंतर्दृष्टि) था, न कि एक दृष्टिकोण में। हालांकि यह बहुत प्रभावित हुआ है कि मैं अपना काम कैसे करता हूं।
जोएल जे। एडम्सन

1

OOP = डेटा स्ट्रक्चर्स + मैसेज पासिंग + इनहेरिटेंस, जिनमें से सभी प्रोग्रामिंग मॉडल में तार्किक विकास हैं।

OOP को लगभग 90 सेकंड में (प्रोग्रामर द्वारा) लिंक के लिए मेरी प्रोफ़ाइल को समझा जा सकता है। अवधारणाएँ बहुत सरल हैं।

इसे कैसे लागू किया जाए यह एक और मामला है। सिर्फ इसलिए कि आप जानते हैं कि एक झूला कैसे झूला जाता है, इसका मतलब यह नहीं है कि आप घर बनाना और बनाना जानते हैं। ;-)


+1 - मैं सहमत हूं। ओओपी कैसे लागू करें, बहुत सारे अभ्यास और समय को शांत किया, हालांकि सिर्फ यह जानना कि उन्हें क्या ज्यादा समय नहीं दिया गया है क्योंकि निहितार्थ यहां महत्वपूर्ण शब्द है।
कार्तिक श्रीनिवासन

0

मैंने कुछ समय पहले एक ब्लॉग पोस्ट लिखी थी जो आपको उपयोगी लग सकती है: प्रक्रियात्मक बनाम ओओपी व्याख्या


मुझे नहीं पता कि लोगों ने इसे क्यों वोट दिया! यह लेख बेहतर है तो सभी ऊपर एक साथ!
हारिस

इसका वोट डाउन हुआ क्योंकि इसका लिंक-एंड-रन है, जो अत्यधिक हतोत्साहित करता है। मेटा स्टैकओवरफ़्लो प्रश्न देखें: क्या ऐसे उत्तर हैं, जिनमें लिंक कहीं और हैं वास्तव में "अच्छे उत्तर"?
icc97

0

जिस तरह से मैंने पहली बार समझा वह यह है:

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग से पहले, आपने स्ट्रक्चर्ड प्रोग्रामिंग की थी । सब कुछ प्रक्रिया के आसपास केंद्रित है। पहला सवाल जो आपको खुद से पूछना है, " मैं जानकारी के साथ क्या करना चाहता हूं? "।

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के साथ, यह डेटा के आसपास केंद्रित है। पहला सवाल जो आपको खुद से पूछना है वह है " चुड़ैल की जानकारी जिससे मुझे निपटना है? "। इससे अमूर्तता आसान हो जाती है।


0

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

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

जैसा कि आपने देखा है, अनुप्रयोगों का एक बड़ा वर्ग है जिसके लिए यह एक समाधान को लागू करने का इतना बढ़िया तरीका नहीं है। आप मुख्यतः ऐसे अनुप्रयोगों से बने विश्व में रहते हैं। आपने अपने ब्लॉग पोस्ट में "99 बोतल बीयर" समस्या (आपके "पसंदीदा प्रोग्रामिंग शोकेस") के कार्यान्वयन को देखते हुए उल्लेख किया है। 99 बोतल बीयर निश्चित रूप से उस श्रेणी का हिस्सा है। 99 बोतल बीयर के कार्यान्वयन को देखकर ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग को समझने की कोशिश करना थोड़ा सा है जैसे ट्रीहाउस को देखकर उच्च वृद्धि वास्तुकला को समझने की कोशिश करना। यहां तक ​​कि एक बहुत अच्छी तरह से निर्मित ट्री हाउस आपको केवल इतना सिखा सकता है।

TL; DR: OO प्रोग्रामिंग पारंपरिक प्रोग्रामिंग की तरह है, सिवाय इसके कि आप डेटा स्ट्रक्चर्स को सामने परिभाषित करने में अपने प्रयास पर अधिक ध्यान केंद्रित करते हैं, और आप उन डेटा संरचनाओं को फ़ंक्शन पॉइंटर्स के माध्यम से एक दूसरे के साथ संवाद करते हैं।


-1

मुझे लगता है कि विकिपीडिया पृष्ठ मूल सिद्धांतों को प्राप्त करने के लिए एक अच्छी जगह है:
http://en.wikipedia.org/wiki/Object-oriented_programming

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

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

मुझे आशा है कि वह मदद करेंगे। बस इसके बारे में पढ़ते रहें और कोड को देखते रहें और यह अचानक "क्लिक" होगा। वह मेरा अनुभव था।


एक कारण देने के लिए डाउनवॉटर की देखभाल?
रेशनलगीक

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