प्रक्रियात्मक प्रोग्रामिंग पर ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का लाभ क्या है?


77

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

मुझे बताया गया है कि C ++ में ऑब्जेक्ट-ओरिएंटेड अवधारणाएँ हैं और साथ ही चर की परिभाषा के लिए सार्वजनिक और निजी मोड भी हैं: चीजें सी नहीं हैं। विजुअल बेसिक.नेट में प्रोग्राम विकसित करते समय मुझे इनका उपयोग कभी नहीं करना पड़ा: इसके क्या लाभ हैं?

मुझे यह भी बताया गया है कि यदि कोई चर सार्वजनिक है, तो इसे कहीं भी एक्सेस किया जा सकता है, लेकिन यह स्पष्ट नहीं है कि सी जैसी भाषा में वैश्विक चर से अलग कैसे है। यह भी स्पष्ट नहीं है कि एक निजी चर स्थानीय चर से कैसे भिन्न होता है।

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

if ( login == "admin") {
    // invoke the function
}

यह आदर्श क्यों नहीं है?

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




26
कुछ डाउनवोट का मुकाबला करने के लिए +1। अगर कोई सहकर्मी मुझसे ऐसा सवाल करता है, तो मुझे शायद कुछ चिंताएँ होंगी और मैं भी उसे नीचा दिखा सकता हूँ (यह मानते हुए कि उसके बगल में किसी तरह का डाउन एरो था)। हालाँकि, यह प्रश्न भविष्य के सॉफ्टवेयर इंजीनियर द्वारा पूछा गया प्रतीत होता है और ऐसा लगता है कि उसने कुछ समय सोचने और पोस्ट करने से पहले विषय पर चर्चा करने में बिताया। मैं उसे खारिज करने के बजाय उसकी मदद करने के लिए वोट देता हूं।
DXM

14
@DXM उत्कृष्ट विचार! डाउनवोट / अपवोट तीर को सहकर्मियों के चारों ओर तैरते हुए ... यह अद्भुत काम करेगा।
यानिस

2
मानक काउंटर तर्क: सी में आप जो कुछ भी कर सकते हैं उसे करने के लिए एक कोडांतरक तरीका है, इसलिए आपको सी के बारे में क्यों ध्यान रखना चाहिए? (संकेत: यह सब अमूर्तता के स्तर को बढ़ाने के बारे में है। C ++ इसे C की अधिकांश गति का त्याग करने के साथ प्रबंधित करता है। IMO जो C ++ की सफलता का मुख्य कारण है।)
sbi

जवाबों:


135

अब तक के सभी उत्तर आपके प्रश्न के विषय पर केंद्रित हैं, जैसा कि कहा गया है, "सी और सी ++ में क्या अंतर है"। वास्तव में, ऐसा लगता है कि आप जानते हैं कि क्या अंतर है, आप बस यह नहीं समझते हैं कि आपको उस अंतर की आवश्यकता क्यों होगी। तो, अन्य उत्तरों ने OO और एनकैप्सुलेशन को समझाने का प्रयास किया।

मैं अभी तक एक और जवाब के साथ झंकार करना चाहता था, क्योंकि आपके प्रश्न के विवरण के आधार पर, मेरा मानना ​​है कि आपको कई कदम वापस लेने की आवश्यकता है।

आप C ++ या OO के उद्देश्य को नहीं समझते हैं, क्योंकि आपके कारण, ऐसा लगता है कि आपके एप्लिकेशन को केवल डेटा संग्रहीत करने की आवश्यकता है। यह डेटा चर में संग्रहीत किया जाता है। "मैं एक चर को दुर्गम क्यों बनाना चाहूंगा? अब मैं इसे और एक्सेस नहीं कर सकता! सब कुछ सार्वजनिक करने से, या बेहतर वैश्विक होने पर, मैं कहीं से भी डेटा पढ़ सकता हूं और कोई समस्या नहीं है।" - और आप सही हैं, उन परियोजनाओं के पैमाने के आधार पर, जो आप वर्तमान में लिख रहे हैं, संभवतः कई समस्याएं नहीं हैं (या हैं, लेकिन आप अभी तक उनके बारे में जागरूक नहीं हुए हैं)।

मुझे लगता है कि मूल प्रश्न जो आपको उत्तर देने की आवश्यकता है, वह यह है: "मैं कभी डेटा क्यों छिपाना चाहूंगा? यदि मैं ऐसा करता हूं, तो मैं इसके साथ काम नहीं कर सकता!" और यही कारण है:

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

आपकी विशिष्ट परियोजनाएं (कोड की लाइनें) कितनी बड़ी हैं? अब किसी प्रोजेक्ट को 5000 से 50000 गुना बड़ा मान लें। साथ ही, इसमें कई लोग काम कर रहे हैं। टीम के सभी लोग कैसे याद कर सकते हैं (या यहां तक ​​कि इस बात से अवगत हैं) कि वे सभी चर क्या कर रहे हैं?

ऊपर मैंने जो बताया वह पूरी तरह से युग्मित कोड का एक उदाहरण है। और समय की सुबह से (मानने का समय 1 जनवरी, 1970 से शुरू हुआ), मानव इन समस्याओं से बचने के उपाय खोज रहा है। जिस तरह से आप उनसे बचते हैं, वह आपके कोड को सिस्टम, सबसिस्टम और कंपोनेंट्स में विभाजित करके और कितने फंक्शंस को डेटा के किसी भी हिस्से तक पहुंचाने तक सीमित करता है। अगर मेरे पास 5 पूर्णांक और एक स्ट्रिंग है जो किसी प्रकार के राज्य का प्रतिनिधित्व करता है, तो क्या मेरे लिए इस राज्य के साथ काम करना आसान होगा यदि केवल 5 फ़ंक्शन सेट / मान प्राप्त करें? या यदि 100 फ़ंक्शन इन समान मानों को सेट / प्राप्त करते हैं? OO भाषाओं (यानी C) के बिना भी, लोग अन्य डेटा से डेटा को अलग करने और कोड के विभिन्न हिस्सों के बीच स्वच्छ पृथक्करण सीमा बनाने पर कड़ी मेहनत कर रहे हैं। जब परियोजना एक निश्चित आकार में हो जाती है, तो प्रोग्रामिंग में आसानी नहीं हो जाती है, "क्या मैं फ़ंक्शन वाई से चर एक्स तक पहुंच सकता हूं",

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

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


5
महान जवाब, सवाल पर दिए गए उपयुक्त स्तर को हिट करने के लिए लगता है
कार्लोस

29
+1 ... ज्यादातर के लिए, "और समय की सुबह से (संभालने का समय 1 जनवरी, 1970 को शुरू हुआ) ..." लाइन
कैफ़ीक नेक

4
@ चाड - मुझे लगा कि लाइन अकेले मुझे कम से कम एक अंक स्कोर करना चाहिए :)
DXM

प्रक्रियात्मक प्रतिमान में आप जिस पैमाने की बात करते हैं, इस समस्या से निपटने का एक तरीका है। इसे कार्य कहा जाता है। लेकिन समस्या को समझाने का अच्छा तरीका है।
कष्टप्रद_समय 13

@DXM - मुझे यकीन नहीं है कि मुझे उत्तर सही से समझ में आया है। हम एक ही सेट प्राप्त कर सकते हैं / प्रक्रियात्मक प्रोग्रामिंग में भी कार्यक्षमता प्राप्त कर सकते हैं। हम वैश्विक चर को संशोधित / प्राप्त करने के लिए C में सेट / प्राप्त फ़ंक्शन लिख सकते हैं। इस पद्धति का उपयोग करते हुए, हम वैश्विक चर को संशोधित करने वाले कार्यों की संख्या को सीमित कर रहे हैं। और ओओपी में भी, यदि हम सेट / प्राप्त तरीकों का भी उपयोग करते हैं, तो हम इन तरीकों का उपयोग ऑब्जेक्ट के बाहर से मानों को बदलने के लिए करेंगे।
कादिना

10

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

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

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

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


6

ओओपी बनाम सी वास्तव में आपके द्वारा चर्चा की गई किसी भी चीज के बारे में नहीं है। यह मुख्य रूप से उन क्षेत्रों में पैकेजिंग कोड के बारे में है जो अनायास ही (या कभी-कभी जानबूझकर भी) एक दूसरे को प्रभावित नहीं कर सकते हैं।

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


4
-1। C में कुछ भी विशेष नहीं है जो सभी कार्यों को वैश्विक बनाता है। आप किसी भी फ़ंक्शन को स्थिर घोषित कर सकते हैं और इस तरह इसके दायरे को स्थानीय फ़ाइल तक सीमित कर सकते हैं। C इस पहलू में C ++, Java आदि से भिन्न नहीं है। इसके अलावा, OOP भाषा सिंटैक्स के बारे में नहीं है, आप OO प्रोग्राम को C में ठीक-ठीक लिख सकते हैं, हालाँकि वे OO के लिए सिंटैक्स समर्थन वाली भाषाओं की तुलना में थोड़ा अधिक क्रूड होंगे। और इसके विपरीत: आपको ओओपी नहीं मिलता है क्योंकि आपने ओओ का समर्थन करने वाली भाषा को चुना है। ऑब्जेक्ट-ओरिएंटेशन एक प्रोग्रामिंग शैली है , न कि एक भाषा सुविधा।

@ लुंडिन: जब आप तकनीकी रूप से सही होते हैं, तो आप बिंदु से चूक गए हैं। OOP भाषाएं इसे OOP तरीके से व्यवहार करने के लिए डिफ़ॉल्ट व्यवहार करती हैं। C नहीं करता है।
जॉन फिशर

1
OO भाषाओं में ऐसा कुछ भी नहीं है जो आपको ऐसा करने के लिए मजबूर करे। उदाहरण के लिए, मैंने बिना किसी ओ ओ के बिना अस्पष्ट सी ++ कार्यक्रमों के अनगिनत देखा है। इसी तरह, यदि आपको OO के बारे में कोई सुराग नहीं मिला है, लेकिन कक्षाएं, विरासत आदि को लागू करने का प्रयास करें, तो गड़बड़ किए गए प्रोग्राम को बनाने का लगभग 100% मौका है।

@ लुंडिन: मुझे नहीं लगता कि C ++ एक उचित उदाहरण है। यह (या कम से कम) बिना किसी (बहुत) संशोधन के सी कार्यक्रमों को संकलित करने में सक्षम था। शीर्ष पर कक्षाएं जोड़ने से यह C # या जावा के स्तर पर एक OOP भाषा नहीं बनती है, लेकिन यह उस तरह के विकास को सक्षम करती है।
जॉन फिशर

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

4

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

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

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


वस्तु-उन्मुख भाषाओं के लिए इंटरफेस की अवधारणा अद्वितीय नहीं है। एक बड़ा कारक, मुझे लगता है, गैर-ओओपी भाषाओं में एक मॉड्यूल के भीतर उपयोग किए जाने वाले लगभग सभी कार्य एक ही वैश्विक नामस्थान से संबंधित होने चाहिए। यह जरूरी है कि एक या तो उपसर्ग फ़ंक्शन नाम से संकेत मिलता है कि वे क्या पर किसी और काम करते हैं, या कई मिलता-जुलता तरीकों जो पूरी तरह से अलग बातें करते हैं है (उदाहरण के लिए SetLocationएक ले जाने के लिए इस्तेमाल किया जा सकता Monsterहै, जबकि SetPositionएक के लिए कदम हो सकता है PopupWindow, और Moveस्थिति को समायोजित करने के लिए इस्तेमाल किया जा सकता है a DisplayCursor) ए । सही "चाल" विधि खोजने की कोशिश ...
सुपरकैट

... बहुत आसान किया जा सकता है जब कोई MyMonstor->संपादक लिखता है केवल उन तरीकों की एक सूची दिखाता है जो प्रकार की चीजों पर लागू होते हैं Monster। यदि कई दर्जनों विभिन्न प्रकार की चीजें हैं, जिनमें से प्रत्येक के बारे में दर्जनों संचालन का समर्थन करता है, तो विधि सूचियों में अव्यवस्था की मात्रा को 90% तक काटने से उत्पादकता में काफी आसानी हो सकती है।
सुपरकैट

@supercat नाम क्लैशिंग एक भाषा का मुद्दा है जो एक गैर-OOP मुद्दा नहीं है। दूसरी ओर नामस्थान समस्याग्रस्त हैं क्योंकि संकलक को अनिवार्य रूप से फ़ंक्शन को स्वचालित रूप से नामांकित करने या इसे मंगाए जाने की आवश्यकता होती है। तो क्यों न इसे मैन्युअल रूप से करें?
कष्टप्रद_सिक्विद

@annoying_squid: क्या OOP प्रदान करता है को प्रभावी ढंग से उपयोग करने की क्षमता है प्रकार नाम स्थान का चयन करने के लिए एक funciton के प्राथमिक तर्क की। अगर मेरे पास एक itप्रकार का चर है SuperFancyWhizBang, तो किसी एक SuperFancyWhizBangतरीके को लागू itकरने के लिए टाइप लिखने की आवश्यकता नहीं है SuperFancyWhizBang; कह it.woozle()कंपाइलर को स्वचालित रूप से woozleभीतर देखने के लिए निर्देशित करेगा SuperFancyWhizBang
सुपरकैट

3

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

इसलिए अंतर यह नहीं है कि कोड क्या कर सकता है, बल्कि लोग क्या कर सकते हैं।

लोग गलती करते हैं। बहुत सारे।

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

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


2

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


बस फ़ंक्शन प्रोटोटाइप का उपयोग करें। वह अतिक्रमण है।
कष्टप्रद_सिक्विद

2

कोई फर्क नहीं पड़ता कि मैं कहाँ पढ़ता हूँ निजी चर नहीं पहुँचा जा सकता है, जबकि सार्वजनिक चर हो सकता है फिर सार्वजनिक और वैश्विक क्यों फर्क नहीं पड़ता? सार्वजनिक और निजी का वास्तविक उपयोग क्या है? कृपया यह न कहें कि इसका उपयोग हर कोई कर सकता है, मुझे लगता है कि हम कुछ शर्तों का उपयोग क्यों नहीं करते हैं और कॉल करते हैं?

मुझे आशा है कि आप कभी भी अपने आवेदन में एक से अधिक स्ट्रिंग नहीं चाहते हैं। मुझे यह भी उम्मीद है कि आपके स्थानीय चर फ़ंक्शन कॉल के बीच बने रहते हैं। ये चीजें अभिगम्यता के संदर्भ में समान हो सकती हैं लेकिन जीवनकाल और अन्य उपयोग के संदर्भ में? वे बिल्कुल समान नहीं हैं।


1

जैसा कि कई ने कहा, किसी भी कार्यक्रम को, एक बार संकलित करने पर, एक बाइनरी कोड में बदल दिया जाता है और बाइनरी स्ट्रिंग के रूप में एक पूर्णांक का प्रतिनिधित्व करने के लिए इस्तेमाल किया जा सकता है, कोई भी कार्यक्रम अंततः केवल एक संख्या है। हालाँकि आपके लिए आवश्यक संख्या को परिभाषित करना बहुत कठिन हो सकता है और यही कारण है कि उच्च स्तरीय प्रोग्रामिंग भाषाएं आईं। प्रोग्रामिंग लैंग्वेज असेंबली कोड के केवल मॉडल हैं जो वे अंततः उत्पन्न करते हैं। मैं आपको Context Oriented Programming http://www.jot.fm/issues/issue_2008_03/article4/ के बारे में इस बहुत अच्छे पेपर के माध्यम से प्रक्रियात्मक और OO प्रोग्रामिंग के बीच के अंतर को समझाना चाहूंगा

जैसा कि आप इस चित्र से देख सकते हैं, कागज में दर्शाया गया है, प्रक्रियात्मक प्रोग्रामिंग एक कम्प्यूटेशनल इकाई को नाम के साथ जोड़ने के लिए केवल एक आयाम प्रदान करता है। यहां, प्रक्रिया कॉल या नाम सीधे प्रक्रिया कार्यान्वयन के लिए मैप किए जाते हैं। चित्रा-एक कॉलिंग एम 1 में केवल एम 1 प्रक्रिया के कार्यान्वयन के लिए कोई विकल्प नहीं है।

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

यह वास्तव में encapsulation और modularization की अनुमति देता है।

यहाँ छवि विवरण दर्ज करें

चित्रा-सी अंत में विषय-उन्मुख प्रोग्रामिंग के बारे में है जो वस्तु-उन्मुख पद्धति को एक और आयाम द्वारा फैलाती है।

आशा है कि इसने आपको OOP को एक अलग दृष्टिकोण से सोचने में मदद की।


0

(+1) किसी ऐसी चीज़ का प्रश्न पूछना जो आपको समझ में न आए, भले ही यह मूर्खतापूर्ण लगे।

अंतर ऑब्जेक्ट और क्लास ओरिएंटेड प्रोग्रामिंग है। "सादा सी", डेटा और कार्यों के साथ काम करता है। "C ++" "ऑब्जेक्ट और क्लासेस" अवधारणाओं को जोड़ता है, साथ ही कई संबंधित माध्यमिक अवधारणाएं।

हालांकि, मैं डेवलपर्स को "सी ++" से पहले "प्लेन सी" सीखने की वकालत करता हूं। या "ऑब्जेक्ट पास्कल" से पहले "प्रक्रियात्मक पास्कल"।

कई डेवलपर्स सोचते हैं कि छात्रों को केवल एक सामान पढ़ाया जाना चाहिए।

उदाहरण के लिए, पुराने शिक्षक जिन्हें OO नहीं मिलता है, और केवल "सादा संरचित C" सिखाते हैं।

या "हिपस्टर" शिक्षक जो केवल ओओ सिखाते हैं, लेकिन "प्लेन सी" नहीं, क्योंकि "आपको इसकी आवश्यकता नहीं है"। या दोनों, शिक्षण क्रम की परवाह किए बिना।

मुझे लगता है कि छात्रों को "स्ट्रक्चर्ड प्लेन सी" और "ऑब्जेक्ट ओरिएंटेड सी (सी ++)" दोनों सिखाया जाना चाहिए। "प्लेन सी" के साथ, पहले, और "सी ++", बाद में।

वास्तविक दुनिया में, आपको दोनों प्रतिमानों (साथ ही "कार्यात्मक" जैसे अन्य प्रतिमानों) को सीखने की जरूरत है।

संरचित कार्यक्रमों को एक बड़ा, एकल "वस्तु" के रूप में सोचने से मदद मिल सकती है।

आपको नामस्थानों ("मॉड्यूल") में भी जोर देना चाहिए, दोनों भाषाओं में, कई शिक्षक इसे अनदेखा करते हैं, लेकिन, इसके महत्वपूर्ण।


नाम स्थान और अधिभार केवल कार्यक्रम को समझने में कठिन बनाते हैं। यह पहचान प्रक्रिया संदर्भ को संवेदनशील बनाता है। जब आप foo()C ++ में देखते हैं , तो यह एक वैश्विक फ़ंक्शन, वर्तमान नामस्थान में एक फ़ंक्शन, आपके द्वारा उपयोग किए जाने वाले नामस्थान में एक फ़ंक्शन using, एक विधि, एक विरासत में मिली विधि और यदि यह फ़ंक्शन कॉल में है: यह किसी नाम स्थान में हो सकता है तर्क आधारित नाम लुकअप द्वारा हल किया जा सकता है, और जावा और सी # के लिए भी ऐसा ही है। सी में यह केवल वर्तमान स्रोत फ़ाइल में एक स्थिर फ़ंक्शन हो सकता है, या हेडर से एक हो सकता है।
कैलमेरियस

MODULE_Foo () हर जगह लिखना एक दृश्य अव्यवस्था हो सकती है, लेकिन कम से कम आप वास्तव में जानते हैं कि यह कौन सा फ़ंक्शन है।
कैलमेरियस

@ काल्मिसर समाधान, स्पष्ट रूप से, फू कुछ भी नाम नहीं है ।

0

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


-1

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग प्रक्रियात्मक प्रोग्रामिंग है, बॉक्स के साथ।

पीपी में, आपके पास एक बॉक्स है, एक राज्य है, जो कि परियोजना के बढ़ने के साथ अविश्वसनीय रूप से बड़ा हो जाता है, जिससे हर बार जब आप उस बड़े राज्य के एक छोटे से हिस्से को भूल जाते हैं तो साइड-इफेक्ट दिखाई देते हैं।

OO में, आपके पास कई बॉक्स हैं, कई राज्य हैं, और जैसे-जैसे प्रोजेक्ट बढ़ता है, बॉक्स थोड़ा बढ़ता है, और बॉक्स की संख्या बहुत बढ़ जाती है।

छोटे बक्से को देखना आसान है, पूरी तस्वीर का भ्रम होना आसान है, लेकिन वास्तव में लगभग असंभव है, क्योंकि वर्गों और इंटरफेस को देखने से कार्यान्वयन विवरण छुपाता है जिसमें महत्वपूर्ण प्रभाव हो सकते हैं।

कार्यात्मक प्रोग्रामिंग में, आपके पास कई फ़ंक्शन बॉक्स होते हैं, और यह तय करते हैं कि प्रत्येक फ़ंक्शन में एक प्रविष्टि (पैरामीटर) और एक निकास (रिटर्न) है, बाहरी संदर्भ में कड़ाई से कोई अन्य पहुंच नहीं है।

क्योंकि कोई राज्य नहीं है और कोई साइड-इफ़ेक्ट (डिज़ाइन के अनुसार) नहीं है, आप किसी भी फंक्शन का पूरी तरह से अलग से विश्लेषण कर सकते हैं और 100% जानते हैं कि यह किसी भी परिस्थिति में कैसे व्यवहार करेगा।

क्योंकि आप तार्किक इकाइयों द्वारा बॉक्सिंग कोड हैं जो क्रियाओं का प्रतिनिधित्व करते हैं, यह भी संभव है कि केवल एक बॉक्स प्रति विशिष्ट कार्रवाई हो।

यह OOP की तुलना में किसी भी बड़े पैमाने पर परियोजना के कोड को छोटा कर देगा जो विभिन्न वर्गों में कोड आधार पर कई एनालॉग कार्यों को छिपाने का वादा करता है।

यह पीपी को बहुत दूर से हरा देगा क्योंकि आप प्रोजेक्ट को लंबे समय तक विकसित कर सकते हैं क्योंकि ट्रैक का ध्यान रखने के लिए अधिक XXXXXXXL राज्य नहीं है।

सारांश में, पीपी एक सरल प्रोग्राम को एप्रोच करने का सबसे सरल तरीका है और एफपी संभवतः किसी कॉम्प्लेक्स एप्रोच करने का सबसे सरल तरीका है।

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

और आपको मुफ्त में 100% विश्वसनीय इकाई परीक्षण मिलता है।

और आपको "निजी स्थिर अंतिम of_doom प्रतिभाशाली भयानक string_1" लिखना नहीं है।

और आपको मुफ्त में समानता मिलती है।


-3

साधारण एक वाक्य का अंतर यह है कि C ++ कक्षाओं के साथ C है। (हालांकि यह अब बहुत अधिक है) मैं नहीं करता कि आप विकिपीडिया पर C ++ पर एक महान लेख पढ़कर दो के बीच के अंतर को क्यों नहीं सीखना चाहते हैं ...। यह लेख आपको बहुत हद तक मदद करेगा: - C ++ (विकिपीडिया)

साथ ही मुद्दे पर गुगली करने से मदद मिलेगी। यादृच्छिक व्यक्तियों को यह समझाने के लिए पूछना मुश्किल हो सकता है। आईएमएचओ, किसी से पूछकर पढ़ने से बेहतर समझ में आता है


मैंने उन लोगों को पढ़ा है, लेकिन उन्होंने सिर्फ इतना कहा है कि वे कहाँ उपयोग किए जाते हैं लेकिन फिर भी मेरे प्रश्न को हल नहीं किया गया है।
निको

मैंने कोई प्रयास किए बिना सवाल नहीं पूछा, लेकिन मैं अभी भी अंतर को समझने में असमर्थ हूं, इसलिए मैंने स्टैकओवरफ्लो के साथ मुलाकात की, जिससे मुझे इनकी मदद करने में मदद मिली
niko

1
@ नोइको, आप मुझे यहाँ गलत कर रहे हैं। मेरा मतलब यह था कि आपको पढ़कर दोनों के बीच के अंतर को समझने की कोशिश करनी चाहिए। अपने दोस्तों से पूछना अच्छा नहीं है। क्योंकि वे अपनी समझ प्रदान करेंगे, जो शायद आपको निराश न करें। लेकिन, चिंता न करें, यहाँ बहुत अच्छे साथी हैं, वे निश्चित रूप से आपकी मदद करेंगे :-)
पंकज उपाध्याय

2
मैं नीचे नहीं गया था, लेकिन "सी ++ सी के साथ सी" था। हम में से जो लोग वास्तव में C ++ कर सकते हैं वे हमारे गधे काम करते हैं जो लोगों के सिर से बाहर निकलने की कोशिश कर रहे हैं ।
डेडएमजी

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