किस समस्या के लिए ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग एक अच्छा विकल्प नहीं है? [बन्द है]


19

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

मैं में ... अच्छी तरह से, चलो यह कॉल किया गया है सॉफ्टवेयर विकास इंजीनियरिंग मेरे जीवन व्यावहारिक रूप से सभी, और सब उस समय में, हालांकि OO हमेशा वहाँ गया था (अच्छी तरह से, सबसे उस समय के) मैं उपयोग करने के लिए की जरूरत थी कभी नहीं किया है "इसके तरीके", न ही उस प्रतिमान को सीखने के लिए। हमने हमेशा सरल प्रोग्राम संरचनाओं, दिनचर्या / कार्यों / मॉड्यूल का उपयोग किया है और यद्यपि यह उन कार्यक्रमों का प्रबंधन करने वाले आज के सर्वोत्तम अभ्यासों के विपरीत है (लगभग 300k LOC तक के कार्यक्रम, बहुत बड़ा कुछ भी नहीं) कभी भी मुश्किल साबित नहीं हुआ, अकेले असंभव।

इसलिए मैं आपसे पूछना चाहता हूं कि किस वस्तु के लिए कौन सी वस्तु समस्या उन्मुख हो सकती है? प्रक्रियात्मक प्रोग्रामिंग की तुलना में?


इसके अलावा stackoverflow.com/questions/178262/… देखें ।
एस.लॉट 4

जवाबों:


8

वस्तु उन्मुख प्रोग्रामिंग है प्रक्रियात्मक प्रोग्रामिंग। ओओ ऑब्जेक्ट को उन्मुख बनाने वाली बात है, जैसा कि रॉबर्ट हार्वे ने एक टिप्पणी में उल्लेख किया है, कि ओओ एक विशेष तरीके से डेटा को समेटता है (उस संरचना के साथ एक संरचना पर काम करने वाले कार्यों को बंडल करने के लिए)।

विलियम कुक वस्तुओं और अमूर्त डेटा प्रकारों के बीच अंतर को अच्छी तरह से बताते हैं।

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


5

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


3
Decoupling OO प्रोग्रामिंग का एक अच्छा साइड-इफ़ेक्ट है, लेकिन मैं कहूँगा कि OO प्रोग्रामिंग का प्राथमिक लाभ कार्यक्षमता का संगठनात्मक एनकैप्सुलेशन है।
रॉबर्ट हार्वे

1
@ रॉबर्ट हार्वे: मेरे पास एक ही वास्तविकता को देखने का एक अलग बिंदु है: मेरे लिए कार्यक्षमता का संगठनात्मक एनकैप्सुलेशन डिकॉउलिंग प्राप्त करने का साधन है जो बदले में पुन: प्रयोज्य की अनुमति देता है।
मौविसील

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

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

3

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

विस्तार: पता नहीं है कि मौजूदा OO भाषाएँ कितनी विलुप्त होती हैं। केवल जानते हैं कि जावा खराब है। वहाँ DSLs (डोमेन-विशिष्ट भाषाओं) को फ्रेमवर्क के रूप में लागू किया जाना है। दूसरी तरफ क्लोजर (जो कार्यात्मक है), में मैक्रोज़ है।


लॉकिंग तर्क के लिए +1 - सबूत ऐसा प्रतीत होता है कि उत्परिवर्तित वस्तुओं पर लॉकिंग लॉजिक OO भाषाओं में एक निश्चित बिंदु से परे असहनीय रूप से जटिल हो जाता है
mikera

संक्षिप्त नाम का उल्लेख करने के लिए +1। वस्तुओं के समान एक अवधारणा लेकिन सहायक संगति एक अभिनेता की है। अभिनेता समवर्ती संस्थाएं हैं जो अतुल्यकालिक संदेशों का आदान-प्रदान करके संवाद करते हैं।
जियोर्जियो

संगति पर डिट्टो; मैंने बयान दिया है कि राज्य की असतत इकाइयों को पहचानने / बनाए रखने के लिए प्रोत्साहित करने में, OO , वास्तव में संगामिति मुद्दों को प्रोत्साहित करता है।
user1172763

0

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

एक मुख्य एल्गोरिथ्म जैसी qsort()मनमानी वस्तुओं की तुलना के लिए अमूर्त का उपयोग करता है। fread()स्ट्रीम आदि के विवरण को अलग करने के लिए एक इंटरफ़ेस का उपयोग करता है।

उस दृष्टिकोण से मुझे किसी भी विशेष समस्या के साथ आने में मुश्किल होती है जो गैर-ओओ दृष्टिकोण के साथ बेहतर हल होती है।


0

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

विचार?


0

PURE ऑब्जेक्ट ओरिएंटेड भाषाएँ कई मामलों के लिए उपयुक्त नहीं हैं। क्योंकि शुद्ध वस्तु प्रधान भाषा होने के लिए कुछ मापदंड पूरे करने होते हैं। देखें-
/programming/250062/what-is-meant-by-the-term-true-object-orientation/250098#250098

लेकिन अधिकांश व्यापक रूप से उपयोग की जाने वाली प्रोग्रामिंग भाषाएं बहु-प्रतिमान हैं। वे विभिन्न प्रकार की प्रोग्रामिंग और विकास मुद्दों का सामना करने के लिए कई गैर-ओओ सुविधाओं को शामिल करते हैं। सी ++, सी #, जावा या रूबी सभी में गैर-ओओ कार्यात्मकता है। इसलिए, वे उन मुद्दों का सामना कर सकते हैं जो शुद्ध-ओओ में अच्छे नहीं हैं।


0

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

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

यहां ध्यान देने वाली एक महत्वपूर्ण बात यह है कि, जिन "संस्थाओं" का मैंने ऊपर उल्लेख किया है, उन्हें वास्तविक दुनिया की वस्तुओं पर मैप करने की आवश्यकता नहीं है! वे आपके आवेदन के डोमेन के सार भागों का प्रतिनिधित्व कर सकते हैं।

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

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