क्या OOP कोड के पुन: उपयोग के वादे को पूरा करता है? कोड पुन: उपयोग को प्राप्त करने के लिए क्या विकल्प हैं?


56

शायद ऑब्जेक्ट-ओरिएंटेड प्रतिमान का उपयोग करने का सबसे बड़ा वादा कोड का पुन: उपयोग है। कुछ विवाद कि यह हासिल किया गया था। क्यों हासिल किया गया (नहीं)?

क्या OOP के रूप में कोड पुन: उपयोग करता है, इसे परिभाषित करता है, परियोजनाओं को अधिक उत्पादक बनाता है?

या अधिक प्रबंधनीय? या बनाए रखना आसान है? या अधिक गुणवत्ता के साथ?

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

हमें OOP पुन: उपयोग या अन्य प्रतिमान पुन: उपयोग के साथ अपने अनुभव बताएं।


3
लेकिन यह एक डुप्लिकेट है: programmers.stackexchange.com/questions/1059
फ्रैंक शियरर

7
यह पूरक है, सटीक नकल नहीं है। मैं अंतर को बेहतर ढंग से समझने के लिए फिर से तैयार हूं।
मणियारो

यदि आप वोट कर सकते हैं और सोच सकते हैं कि यह एक उपयोगी प्रश्न है या इसके नीचे उपयोगी उत्तर हैं, तो कृपया वोट करें। StackExchange साइटों को एक अच्छे समुदाय के निर्माण के लिए वोटों की आवश्यकता होती है। आप प्रति दिन 30 वोट दे सकते हैं, उन्हें बर्बाद मत करो। विशेष रूप से उच्च प्रतिष्ठा और कम मतों वाले उपयोगकर्ताओं को दिए गए कृपया इसे पढ़ें: meta.programmers.stackexchange.com/questions/393/…
Maniero

2
इसी तरह का एक प्रश्न यहाँ: प्रोग्रामर.स्टैकएक्सचेंज
जॉर्ज मारियन

2
@j_random_hacker: टिप्पणियों को पढ़ें।
मणियेरो

जवाबों:


34

कोड का पुन: उपयोग एक बहुत अच्छा विचार है। महान नहीं है

मेरे पास लगभग 30 वर्षों के सॉफ़्टवेयर इंजीनियरिंग का एक दृष्टिकोण है, जो "पुन: उपयोग" करने की कोशिश कर रहा है।

मैंने 80 के दशक में एक शोध विषय के रूप में "कोड पुन: उपयोग" की जांच शुरू कर दी थी, मुझे पता चला कि मैंने 70 के दशक के शुरुआती दिनों में बनाए गए एक ओएस के डिजाइन का पुन: उपयोग किया था, दूसरे ओएस के लिए मैंने 70 के दशक के अंत में बनाया था।

कोड के पुन: उपयोग का अच्छा हिस्सा कभी-कभी ईमानदार-से-ईश्वर के लिए कोड का पुन: उपयोग करने की क्षमता है। लेकिन दुनिया कोड से भरी है; आप जो चाहते हैं वह कैसे पा सकते हैं? यहाँ मैं क्या पुनः प्रयोग अभिशाप कहते हैं :

मैं सांता क्लॉस (ओके ओपन सोर्स) हूं, और मेरे पास 1 बिलियन सॉफ्टवेयर घटकों का एक बैग है। आपके पास उनमें से कोई भी हो सकता है।

सौभाग्य का चयन।

पुन: उपयोग की समस्या को अच्छी तरह से हल करने के लिए:

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

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

कोड पुन: उपयोग नहीं किया है (OOP न तो) कोड प्रणालियों के लिए हमारी क्षमता में परिमाण सुधार के आदेश प्रदान करता है।

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

हमें जिस चीज पर काम करना चाहिए वह कोड के निर्माण के लिए ज्ञान का पुन: उपयोग है । यदि हम ऐसा कर सकते हैं, तो हम उस ज्ञान को उस कोड के निर्माण के लिए लागू कर सकते हैं जिसकी हमें ज़रूरत है, मान्यताओं के वर्तमान सेट को संभालना।

ऐसा करने के लिए, किसी को अभी भी सॉफ्टवेयर घटकों को चिह्नित करने के लिए समान विनिर्देश क्षमता की आवश्यकता है (आपको अभी भी कहना है कि आप क्या चाहते हैं!)। लेकिन फिर आप इस "निर्माण" ज्ञान को उन विशिष्टताओं पर लागू करते हैं जो आप चाहते हैं कि कोड उत्पन्न करें।

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

इसके लिए आवश्यक मशीनरी का एक महत्वपूर्ण टुकड़ा "घटक विवरण" को स्वीकार करने के लिए यांत्रिक उपकरण हैं (ये सिर्फ औपचारिक दस्तावेज हैं और प्रोग्रामिंग भाषाओं की तरह पार्स किए जा सकते हैं) और उनके लिए कार्यक्रम परिवर्तनों को लागू करें।

कंपाइलर पहले से ही ऐसा करते हैं: -} और वे वास्तव में उस समस्या के वर्ग में अच्छे हैं जिससे वे निपटते हैं।

कोड पीढ़ी वाले UML मॉडल ऐसा करने का एक प्रयास है। बहुत अच्छा प्रयास नहीं; अधिकांश यूएमएल मॉडल में बहुत कुछ जो कहता है वह है "मेरे पास डेटा है जो इस तरह दिखता है"। अगर कार्यक्षमता को छोड़ दिया जाए तो एक वास्तविक कार्यक्रम तैयार करना बहुत कठिन है।

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

लेकिन डीएमएस के पास ऊपर वर्णित दो प्रमुख गुण हैं: मनमाने ढंग से औपचारिक विनिर्देशों को संसाधित करने की क्षमता, और "कोड पीढ़ी के ज्ञान" को रूपांतरित करने की क्षमता, और उन्हें मांग पर लागू करने की क्षमता। और उल्लेखनीय रूप से, हम कुछ विशेष मामलों में उत्पन्न करते हैं, कुछ विशिष्ट विनिर्देशों से दिलचस्प कोड; इसका कार्यान्वयन उत्पन्न करने के लिए डीएमएस का उपयोग बड़े पैमाने पर किया जाता है। यह हमारे (ज्ञान) पुन: उपयोग के कम से कम कुछ वादों के लिए हासिल किया गया है: अत्यंत महत्वपूर्ण उत्पादकता लाभ। मेरे पास लगभग 7 तकनीकी लोगों की एक टीम है; हमने शायद डीएमएस के लिए "विनिर्देशों" के 1-2 एमएसएलओसी लिखे हैं, लेकिन कुछ 10MSLOC उत्पन्न कोड हैं।

सारांश: पीढ़ी के ज्ञान का पुन : उपयोग जीत है, कोड का पुन: उपयोग नहीं ।


4
IMHO, सबसे अच्छा जवाब। महत्वपूर्ण बात ज्ञात / विचार का पुन: उपयोग है, कोड नहीं।
क्रावमीर

4
Mostly what has been discovered over the years is that for code to be reusable, it sort of has to be designed for that purpose, or it contains too many implicit assumptions.मैं एक समान निष्कर्ष पर पहुँच गया हूँ, लेकिन मैं इसे इतनी सहजता से व्यक्त नहीं कर सका।
बिजिकलोप

36

कोड फिर से उपयोग ओओपी में हासिल किया गया है लेकिन यह कार्यात्मक प्रोग्रामिंग में भी हासिल किया गया है। कभी भी आप कोड का एक ब्लॉक लेते हैं और इसे अपने कोड के बाकी हिस्सों से कॉल करने योग्य बनाते हैं, जैसे कि आप इस कार्यक्षमता का उपयोग कहीं और कर सकते हैं कोड फिर से उपयोग करें।

इस प्रकार का कोड पुनः उपयोग कोड को अधिक प्रबंधनीय बनाता है क्योंकि इस एक कॉल करने योग्य ब्लॉक को बदलने से सभी स्थानों पर परिवर्तन होता है जिसे इसे कहा जाता है। मैं कहूंगा कि इस परिणाम में गुणवत्ता और पठनीयता भी बढ़ी है।

मुझे यकीन नहीं है कि OOP कोड पुन: उपयोग करने के लिए बस है। मैं OOP को वस्तुओं के साथ बातचीत करने और डेटा संरचना के विवरण को अलग करने के तरीके के रूप में देखता हूं।

विकिपीडिया से:

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


9
+1 कार्यात्मक प्रोग्रामिंग कोड के पुन: उपयोग के लिए जाने का तरीका हो सकता है।
जोनास

1
@ माथिउ एम।: ठीक है, कैसे पुन: प्रयोज्य है double sqrt (double x)? शुद्ध कार्य पुन: प्रयोज्यता के प्रतीक हैं।
जूनस पुलका

3
@Joonas: double sqrt(double x), float sqrt(float x), int sqrt(int x)आप उनमें से एक बहुत परिभाषित कर सकते हैं, जबकि एक सामान्य प्रोग्रामिंग भाषा के साथ आप के लिए होता है Number sqrt(Number x)और इसके साथ किया जाए।
मैथ्यू एम।

1
@ माथिउ एम .: वास्तव में, जेनेरिक कोड प्रतिकृति को कम करते हैं, इसलिए यह "अधिक पुन: प्रयोज्य" है, हाँ। हालांकि, मुझे लगता है कि पुन: प्रयोज्य की असली कुंजी सरल, छोटे, समझदार, शुद्ध कार्यों (यह "कार्यात्मक प्रोग्रामिंग" दिशा है) को परिभाषित करना है, और उन्हें पास करना है, जो सी में संभव है। यह सामान्य प्रोग्रामिंग शैली की तुलना में अधिक है भाषा की क्षमताओं के बारे में ही।
जूनस पुलका

1
@ जून: आह, मैंने शुद्ध शब्द को याद किया था , आप सही कह रहे हैं, छोटे शुद्ध कार्यों की रचना करना बहुत अच्छा है, और यहां तक ​​कि सी इसके लिए कार्यों के लिए संकेत भी देते हैं।
मथिउ एम।

15

हां और ना

कोड का पुन: उपयोग कई अलग-अलग गतिविधियों के लिए एक कैच-ऑल टर्म है।

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

13

मैं एक लंबा जवाब पोस्ट करूंगा लेकिन क्यों? उदी दहन ने इसे मुझसे बेहतर समझा।

http://www.udidahan.com/2009/06/07/the-fallacy-of-reuse/

यहाँ पोस्ट की शुरुआत है:

इस उद्योग का पुन: उपयोग के साथ कब्जा कर लिया गया है।

यह धारणा है कि अगर हम अभी और कोड का पुन: उपयोग करते हैं, तो सब कुछ बेहतर होगा।

कुछ तो यहां तक ​​कहते हैं कि ऑब्जेक्ट-ओरिएंटेशन के पूरे बिंदु का पुन: उपयोग किया गया था - यह नहीं था, एनकैप्सुलेशन बड़ी बात थी। उसके बाद घटक-उन्मुखीकरण वह चीज थी जिसे पुन: उपयोग करना चाहिए था। जाहिर है कि इतनी अच्छी तरह से या तो बाहर पैन नहीं किया है क्योंकि यहाँ हम अब सेवा-उन्मुखीकरण पर हमारे पुन: उपयोग की उम्मीद कर रहे हैं।

दिन के उन्मुखीकरण के साथ पुन: उपयोग कैसे प्राप्त करें, इस पर पैटर्न की संपूर्ण पुस्तकें लिखी गई हैं। इकाई सेवाओं और गतिविधि सेवाओं से, प्रक्रिया सेवाओं और ऑर्केस्ट्रेशन सेवाओं के माध्यम से, इसे प्राप्त करने की कोशिश में हर तरह से सेवाओं को वर्गीकृत किया गया है। पुन: उपयोग करने और पुन: प्रयोज्य सेवाओं के निर्माण के लिए कंपोज़िंग सेवाओं को महत्वपूर्ण माना गया है।

मैं आपको गंदे-छोटे रहस्य से रूबरू करा सकता हूँ:

पुन: उपयोग एक पतन है


4
-1। श्री दहन स्ट्रोमैन के साथ व्यस्त है; जैसा कि वह बताता है कि कोई भी गैर-जेनेरिक कोड का गंभीरता से पुन: उपयोग नहीं करता है, और यदि आप उस तर्क को उसके लेख से हटाते हैं, तो वह वास्तव में पक्ष में है या कोड का उचित रूप से पुन: उपयोग कर रहा है
स्टीवन ए। लोव

3
@Steven A. Lowe खैर मेरी इच्छा है कि यह सच था। मेरी इच्छा है कि मुझे आपका भाग्य मिले क्योंकि मैंने गैर-सामान्य रूप में कोड का पुन: उपयोग देखा है। यह सुंदर नहीं था।
टोनी

1
मुझे यकीन है कि यह नहीं था - लेकिन वे गंभीर थे ? dilbert.com/strips/comic/1996-01-31
स्टीवन ए। लोव

1
सहमत, कोड को पुन: प्रयोज्य बनाने की लागत बहुत अधिक है, इसलिए यह तब तक भुगतान नहीं करता है जब तक आप जावा या .NET बेस कक्षाओं के पैमाने पर बात नहीं कर रहे हैं। Youtube.com/watch?v=aAb7hSCtvGw
Andomar

13

मैं क्रिस से सहमत हूं, कार्यात्मक प्रोग्रामिंग कोड का पुन: उपयोग करने का एक अच्छा तरीका है।

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

मुझे लगता है कि OOP में गहरी विरासत कई मामलों में भ्रामक हो सकती है। आपके पास एक वर्ग है और विभिन्न फाइलों में कई निकट संबंधी तरीके लागू हैं। जैसा कि जो आर्मस्ट्रांग ने ओओपी के बारे में कहा:

ऑब्जेक्ट-ओरिएंटेड भाषाओं के साथ समस्या यह है कि उन्हें यह सब निहित वातावरण मिला है जो वे अपने साथ ले जाते हैं। आप एक केला चाहते थे लेकिन आपको जो मिला वह था एक केला और पूरे जंगल को पकड़ना।

जब यह कोड पुन: उपयोग करने की बात आती है तो उच्च आदेश फ़ंक्शन भी बहुत उपयोगी होते हैं mapऔर foldrयह Google के MapReduce की नींव है ।

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

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

अतुल्यकालिक संदेश ईवेंट चालित प्रणालियों में और एर्लैंग में गुजरना भी एक बहुत अच्छा तरीका है जो कि डिकम्प्लस सिस्टम और ढीली युग्मन जटिल प्रणालियों में महत्वपूर्ण है। पर्याप्त रूप से विघटित प्रणाली के साथ आप सिस्टम को विकसित कर सकते हैं जबकि यह चल रहा है, शायद विभिन्न नोड्स पर। यूनिबेट ने इस बारे में एक शानदार प्रस्तुति दी: डोमेन इवेंट ड्रिवेन आर्किटेक्चर

हालाँकि मुझे लगता है कि अधिकांश कोड का उपयोग पुस्तकालयों और रूपरेखाओं का उपयोग करके किया जाता है।


2
मुझे वह गोरिल्ला बोली। ^ ^
गैब्लिन

मुझे लगा कि प्रश्न कोड पुन: उपयोग के बारे में था, अच्छा शब्दार्थ नहीं ..?
डेनियल लुबरोव

6

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


4

OOP कोई विशेष नहीं है; आप OOP के साथ या उसके बिना पुन: प्रयोज्य कोड बना सकते हैं। शुद्ध कार्य विशेष रूप से पुन : प्रयोज्य हैं : उदाहरण के लिए, java.lang.math.sqrt(double)एक नंबर लेता है और एक नंबर देता है। कोई OOP नहीं है, लेकिन निश्चित रूप से वहाँ से बाहर अधिकांश कोड से अधिक पुन: प्रयोज्य है।


4

एक कार्यात्मक प्रोग्रामिंग दृश्य से OOP ज्यादातर राज्य के प्रबंधन के बारे में है।

कार्यात्मक प्रोग्रामिंग में आप आसानी से सूचियों के सैकड़ों उपयोगी कार्य कर सकते हैं: http://haskell.org/ghc/docs/6.12.1/html/lbooks/base-4.2.0.0/Data-List.html

क्या आपके पास सूची-श्रेणी में सैकड़ों विधियां होंगी? सार्वजनिक तरीकों को आंतरिक स्थिति के लिए एक इंटरफ़ेस माना जाता है जिसे आप छोटा रखना चाहते हैं।

अफसोस की बात है, इसके बजाय (पुनः) बहुत सारे छोटे कार्यों का उपयोग करते हुए, कुछ लोग कार्यक्षमता की नकल करते हैं। मेरे लिए है कि क्योंकि OOP कोड पुन: उपयोग को प्रोत्साहित नहीं करता है जितना कार्यात्मक प्रोग्रामिंग करता है।


1
आपके निष्कर्ष सभी गलत हैं, @ Lenny222। ओओपी के बारे में कुछ भी नहीं है जिसे राज्य बनाए रखने के लिए कक्षाओं की आवश्यकता होती है। यह इसकी वास्तुकला का एक सवाल है कि क्या यह आंतरिक रूप से राज्य को संग्रहीत करता है या, जैसे कि स्मॉलटॉक के एंगर वर्गों को, नए राज्य के साथ नई वस्तुओं को त्वरित करता है।
Huperniketes

1
मुझे खेद है कि मैंने खुद को इस गलतफहमी को रोकने वाले तरीके से व्यक्त नहीं किया है: मेरा मतलब है कि ओओपी और एफपी के बीच का अंतर यह नहीं है कि ओओपी ईकोर्स कोड एफपी से अधिक पुन: उपयोग करता है (हेडलाइन का अर्थ है)। मैंने एफपी के साथ बेहतर कोड पुन: उपयोग का अनुभव किया है। यदि आपके पास केवल अपरिवर्तनीय वर्ग हैं, तो आप FP का अनुकरण कर रहे हैं, तो OOP पहले स्थान पर क्यों है? मेरे पीओवी में यह अनिवार्य राज्य प्रबंधन के बारे में है।
लेनिप्रोग्रामर्स

3

मेरे लिए, हाँ, लेकिन हर समय नहीं, और यह अन्य तरीकों से किया जा सकता था।

एक अमूर्त आधार वर्ग बनाकर और उस वर्ग के ठोस क्रियान्वयन के द्वारा अधिकांश समय।

इसके अलावा कई चौखटे कोड का उपयोग करने के लिए वंशानुक्रम का उपयोग करते हैं (डेल्फी, जावा, .नेट बस कुछ हैं जो वसंत को तुरंत ध्यान में रखते हैं)।

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


3

अपने अनुभव में, मैंने सामान्य प्रोग्रामिंग सुविधाओं (जैसे C ++ टेम्प्लेट) के माध्यम से "पुन: प्रयोज्य" कोड का अधिक सफलता प्राप्त की है, जबकि मैंने विरासत वंशानुक्रम जैसे ओओपी सिद्धांतों का उपयोग किया है।


2

प्रभावी पुन: उपयोग के लिए OOP बहुत खुला है।

पुन: उपयोग करने के कई तरीके हैं। प्रत्येक सार्वजनिक वर्ग पूछता है: "मेरा एक नया उदाहरण बनाओ!" , प्रत्येक सार्वजनिक विधि कहती है: "मुझे बुलाओ!" , प्रत्येक संरक्षित विधि उपज: "मुझे ओवरराइड करें!" - और पुन: उपयोग के ये सभी तरीके अलग - अलग हैं , उनके अलग-अलग पैरामीटर हैं, वे अलग-अलग संदर्भ में दिखाई देते हैं, सभी के अपने अलग-अलग नियम हैं, इसे कैसे कॉल / एक्सटेंड / ओवरराइड करें।

एपीआई बेहतर है, यह ओओपी (या गैर-ऊप) अंक का एक सख्त उपसमूह है, लेकिन वास्तविक जीवन में, एपीआई अतिव्यापी और हमेशा के लिए बढ़ते हैं, फिर भी बहुत सारे कनेक्शन बिंदु हैं। इसके अलावा, एक अच्छा एपीआई जीवन को आसान बना सकता है, यह OOP के लिए इंटरफ़ेस प्रदान करने का सबसे अच्छा तरीका है।


डेटाडॉल प्रतिमान घटकों के लिए एक सख्त इंटरफ़ेस प्रदान करता है, उनके पास निम्न प्रकार के पोर्ट हैं:

  • उपभोक्ताओं (इनपुट्स), और
  • निर्माता (आउटपुट)।

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

मैं थोड़ा अस्पष्ट था, आप StackOverflow पर "dataflow" टैग , या विकिपीडिया "datafow प्रोग्रामिंग" या विकिपीडिया "प्रवाह-आधारित प्रोग्रामिंग" पर एक नज़र डाल सकते हैं ।

(इसके अलावा, मैंने C ++ में डेटाफ्लो सिस्टम लिखा है। इसलिए OOP और DF दुश्मन नहीं हैं, DF एक उच्च स्तरीय परीक्षा तरीका है।)


2

CommonLisp में पुन: उपयोग को प्राप्त करने के लिए बहुत सारे साधन हैं:

  • डायनामिक टाइपिंग, आपका कोड डिफ़ॉल्ट रूप से सामान्य होना चाहिए

  • अपरिमेय सार, यानी सबरूटीन्स

  • ऑब्जेक्ट-ओरिएंटेशन, कई वंशानुक्रम और कई प्रेषण के साथ

  • सिंटैक्स-एब्स्ट्रैक्शन, नए सिंटैक्टिक कंस्ट्रक्शंस को परिभाषित करने या बॉयलर-प्लेट कोड को संक्षिप्त करने की क्षमता

  • कार्यात्मक सार, क्लोजर और उच्च-क्रम-कार्य

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


1

वास्तव में "पुन: उपयोग" जैसी कोई चीज नहीं है जिस तरह से लोग इसका वर्णन करते हैं। पुन: उपयोग किसी भी चीज की आकस्मिक संपत्ति है। इसके लिए योजना बनाना कठिन है। जब वे "पुन: उपयोग" के बारे में बात करते हैं तो ज्यादातर लोगों का मतलब "उपयोग" है। यह काफी कम आकर्षक और रोमांचक शब्द है। जब आप एक पुस्तकालय का उपयोग करते हैं, तो आप इसका उपयोग उस चीज के लिए कर रहे हैं, जो सामान्य रूप से इसका उद्देश्य था। आप कर रहे हैं नहीं यह पुन: उपयोग जब तक आप कुछ इसके साथ सच में पागल कर रहे हैं।

इस अर्थ में, वास्तविक दुनिया में पुन: उपयोग चीजों के पुन: उपयोग के बारे में है। मैं यहाँ इन सीटों का पुन: उपयोग कर सकता हूँ और उन्हें पुन: व्यवस्थित करने के लिए ... एक बिस्तर! बहुत आरामदायक बिस्तर नहीं है, लेकिन मैं ऐसा कर सकता हूं। यह उनका प्राथमिक उपयोग नहीं है। मैं उन्हें अपने प्रयोज्यता के मूल डोमेन के बाहर पुनः उपयोग कर रहा हूं। [...] कल, मैं यूके वापस जाऊंगा। मैं विमान का पुन: उपयोग नहीं करूंगा । मैं इसे सिर्फ उस उद्देश्य के लिए उपयोग करूंगा जिसका यह उद्देश्य था, इसके बारे में कुछ भी कल्पना या रोमांचक नहीं है।

- केवलिन हेनी


3
लोग कुछ भी विश्वास करेंगे कि वे प्रिंट में देखते हैं। केवलिन हेन्नी गलत है और ऐतिहासिक संदर्भों की कमी और खराब अर्थ व्याख्या पर आधारित है। पुन: उपयोग कोड UNIVAC और IBM वैक्यूम ट्यूब कंप्यूटर के दिनों से एक मौलिक प्रोग्रामिंग सिद्धांत था। पुन: उपयोग कोड के बारे में इसके अलावा कुछ कार्यक्षमता के लिए इसे फिर से purposing नहीं था जिसके लिए यह योजना बनाई गई थी । आपने ऑब्जेक्ट कोड का उत्पादन करने के लिए अपने उप-रूटीन को लिखा और इकट्ठा किया (बाद में इसे संकलित किया गया) जो तब आपके प्रोग्राम में जुड़ा हुआ था। रीयूज का वास्तव में मतलब है कि आज उद्योग में इसका क्या अर्थ है।
हपरनिकेतेस

यदि आप दो कार्य लिखते हैं जो एक ही कार्य करते हैं, तो आपने कोड का पुन: उपयोग नहीं किया है, भले ही आपने उन्हें कितनी बार उपयोग किया हो।
जेएफओ

कुर्सी सादृश्य अच्छा है और वह सब लेकिन सिर्फ एक शब्द: लेगो।
बिजिकलोप

1

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

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

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

मुझे लगता है कि OOP का सबसे बड़ा लाभ सामान्य स्वीकृति है कि कोड को कैसे व्यवस्थित किया जाना चाहिए। बाकी सब कुछ ग्रेवी है। प्रोग्रामर की एक टीम पूरी तरह से इस बात पर सहमत नहीं हो सकती है कि सभी वर्गों को कैसे संरचित किया जाना चाहिए, लेकिन उन्हें कोड खोजने में सक्षम होना चाहिए।

मैंने यह जानने के लिए पर्याप्त प्रक्रियात्मक कोड देखा है कि यह कहीं भी हो सकता है, और कभी-कभी यह हर जगह होता है।


"और कोई भी भाषा इतनी सख्ती से ओओ नहीं है कि जब वह सोचता है कि आपको एक अन्य वर्ग से विरासत में मिला कोड होना चाहिए, तो एक त्रुटि होगी" - अभी तक, वैसे भी नहीं!
स्टीवन ए। लोव

1

OOP आपको कोड का पुन: उपयोग करने के और तरीके देता है । बस इतना ही।


OOP इंटरफ़ेस पुन: उपयोग और डिज़ाइन पुन: उपयोग को भी बढ़ावा देता है।
रवांग

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

@ एसके-तर्क: ऑर्थोगोनल।
स्टीवन ए लोव

1

क्षैतिज पुन: उपयोग: पहलू, लक्षण, ग्राफ्ट

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

पहलू आधारित प्रोग्रामिंग

मैं एओपी को ओओपी के लापता आधे नारंगी के रूप में मानता हूं। AOP वास्तव में ज्ञात नहीं है, लेकिन इसने इसे उत्पादन कोड बना दिया है।

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

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

अगर आप AOP को बेहतर समझना चाहते हैं, तो यह दो वार्ताएँ देखें:

लक्षण और ग्राफ्ट

लक्षण पुन: प्रयोज्य कोड है कि OOP के पूरक हैं परिभाषित करने के लिए एक और निर्माण कर रहे हैं, वे के समान हैं mixins , लेकिन क्लीनर।

उन्हें समझाने के बजाय, एक महान PHP RFC है जो दोनों को समझाता है । लक्षण PHP btw के लिए आ रहे हैं, वे पहले से ही ट्रंक करने के लिए प्रतिबद्ध हैं।

संक्षेप में

OOP मेरी राय में, अभी भी, मॉड्यूलरिटी में महत्वपूर्ण है और जैसा कि हम आमतौर पर जानते हैं कि OOP अभी भी अधूरा है


0

OOP उन उपयोगी उपकरणों का एक सेट प्रदान करता है जो आपको उन कोडों को लिखने की अनुमति देता है जो उन उपकरणों के बिना आपके द्वारा किए जा सकने वाले स्थानों से अधिक उपयोग किए जा सकते हैं। यदि आप एक PrintItफ़ंक्शन लिखते हैं जो किसी भी पुरानी वस्तु को लेता है और .toString()उस पर कॉल करता है, तो आपको उस कोड को फिर से उपयोग करना होगा जैसे ही आप इसे एक से अधिक प्रकार की ऑब्जेक्ट के साथ कहते हैं। इन उपकरणों के साथ, कोड की प्रत्येक पंक्ति अधिक करती है।

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

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


0

उपरोक्त पोस्टों को पढ़ना, कुछ टिप्पणी:

  • कई लोग सोचते हैं कि OOP में कोड का पुन: उपयोग वंशानुक्रम से होता है। मैं इससे सहमत नहीं हूँ। इंटरफेस और कॉन्ट्रैक्ट OOP सिस्टम में कोड को फिर से उपयोग करने के लिए मुख्य हैं। ओओपी एक घटक प्रौद्योगिकी बनाने में एक ग्रे बॉक्स प्रयास है।
  • डोमेन विशिष्ट और सामान्य "चौखटे" के बीच का अंतर फिर से उपयोग के विषय के रूप में मुझे बहुत सार है। चीजों पर मेरे विचार में, एक घटक (एक संक्षिप्त, न्यूनतम और पुन: उपयोग करने योग्य इंटरफ़ेस अनुबंध और पीछे कार्यान्वयन) केवल तभी किया जा सकता है, यदि यह जिस समस्या को संबोधित करता है वह अच्छी तरह से समझा जाता है। एक डोमेन विशिष्ट घटक, जो गैर-डोमेन विशेषज्ञों को डोमेन के बारे में कम ज्ञान के साथ अपना काम करने की अनुमति देता है (पुनः) उपयोगी घटक है। उपयोगकर्ताओं को इंटरफ़ेस को समझने की आवश्यकता है, इसलिए समस्या डोमेन की पेचीदगियां कम हैं।
  • पुन: उपयोग के स्तर अक्सर भूल गए: आइडिया पुन: उपयोग, विनिर्देश पुन: उपयोग, आर्किटेक्चर / डिज़ाइन पुनः उपयोग, इंटरफ़ेस पुनः उपयोग, टेस्ट-केस पुनः उपयोग। कोड पुन: उपयोग हमेशा अनुकूल नहीं होता है। लेकिन यह एक नया, समान उत्पाद से निपटने के लिए एक विशिष्ट वास्तुकला से चिपके रहने के लिए एक बड़ा समय बचाने वाला है।
  • मेरी नज़र में OOP डिज़ाइन पैटर्न (गामा एट अल) बड़े पैमाने पर कोड री-यूज़ के संदर्भ में सार्थक होने के बजाय सामरिक कार्यान्वयन तकनीकों पर विस्तृत है। वे ओओपी तत्वों के साथ एक आवेदन लिखने में मदद करते हैं, फिर भी मैं उन्हें "कोड फिर से उपयोग" प्रश्न के समाधान के रूप में नहीं देखता हूं।
  • शायद यह उचित नहीं है: सी / सी ++ / सी # अनुभव के २० साल और ६ महीने कार्यात्मक प्रोग्रामिंग (एफ #)। पुन: उपयोग को सक्षम करने का एक प्रमुख तत्व है: लोगों को आसानी से "इंटरफ़ेस" खोजने की जरूरत है, इसका अध्ययन करें, इसे समझें, फिर इसका उपयोग करें। शुद्ध कार्यात्मक प्रोग्रामिंग मेरे लिए संरचना, पुन: उपयोग के लिए उम्मीदवारों या जहां यह सब शुरू होता है और जहां यह सब समाप्त होता है, देखना आसान नहीं है। इतनी प्रशंसा की गई "सिंटैक्टिक शुगर" अक्सर मेरी आँखों में नमक होता है, मुझे आसानी से देखने से रोकता है कि क्या होता है। इस प्रकार मैं कम से कम एक कार्यात्मक (यह क्या है - कार्यों का गुच्छा?) का उपयोग करने की कोशिश करेगा, जिसमें छिपे हुए साइड-इफेक्ट्स हो सकते हैं जो मैं भी नहीं देख सकता (आलसी मूल्यांकन, मोनैड्स, ...)। मुझे गलत मत समझो, कार्यात्मक प्रोग्रामिंग में बहुत शांत पक्ष हैं, लेकिन घोषित की गई सभी ताकतें मुझे संदेह के एक अच्छे माप के साथ दिखाई देती हैं।
  • विशिष्टता, डिजाइन, कार्यान्वयन युग्मित हैं, फिर भी "समान चीज़" पर आसानी से पता लगाने योग्य विचार नहीं हैं। एक नई प्रोग्रामिंग प्रतिमान की तुलना में भविष्य की उत्पादकता में वृद्धि के लिए बहुत अधिक महत्वपूर्ण है, उन विचारों के बीच आपसी लाभ को बढ़ाने के लिए (स्वचालित तर्क, पता लगाने की क्षमता) अंतराल को बंद करना। औपचारिक विनिर्देशन भाषाएँ, मानकीकृत परीक्षण संकेतन (जैसे ttcn3) और प्रोग्रामिंग भाषाएँ टिप्पणी-लैटरिंग के बिना विशिष्टताओं के विरुद्ध इंटरफेस और अनुबंधों के सत्यापन का समर्थन करने वाली हो सकती हैं, जिनकी हमें तत्काल आवश्यकता है।

0

समस्या अधिक सूक्ष्म imho है:

  1. ओओपी उत्परिवर्ती राज्य के साथ कोडिंग संरचना के लिए एक शानदार तरीका है । राज्य को वस्तुओं में समाहित करने से, अत्यावश्यक राज्यप्रणाली कोड अधिक समझ में आता है क्योंकि, उदाहरण के लिए, यदि राज्य के एक टुकड़े को एक वर्ग के निजी क्षेत्रों के रूप में व्यक्त किया जाता है, तो आप जानते हैं कि कम से कम इस विशेष राज्य के टुकड़े को केवल इस तरीके से संशोधित किया जा सकता है कक्षा। (और आप आसानी से विरासत, btw का दुरुपयोग करके इस लाभ को तोड़ सकते हैं।) यह अब पर्याप्त है, लेकिन यह भी नहीं होने से बेहतर है।
  2. परिवर्तनशील स्थिति के साथ कोड का पुन: उपयोग करना मुश्किल है । अपरिवर्तनीय डेटा संरचनाओं का उपयोग करके कोड की तुलना में कठिन है।

तो OOP अपने आप में पुन: प्रयोज्य कोड बनाने के pov से खराब नहीं है , लेकिन OOP का उपयोग करके लिखे गए कोड के प्रकार पुन: उपयोग करने के लिए स्वाभाविक रूप से कठिन हैं

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

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

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

PS और अगर कोई यह कहना चाहता है कि "OO परस्पर स्थिति के बारे में नहीं है, तो आपके पास अपरिवर्तनीय राज्य के साथ OO भी हो सकता है" ... मैं कहता हूं कि "FP नाम के रूप में कक्षाओं का उपयोग कर रहे हैं"। यह बहुत अच्छा है जब यह आपके लिए काम करता है और यह कुछ भाषा के मॉड्यूल सिस्टम की कुछ कमियों से बचता है और इसके परिणामस्वरूप अधिक पुन: प्रयोज्य कोड हो सकता है। लेकिन वह ऊ नहीं है;)

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