क्या आपको लगता है कि ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग जटिलता का समाधान है। क्यों? यह विषय थोड़ा विवादास्पद हो सकता है लेकिन यहाँ के विशेषज्ञों से क्यों इसका उत्तर जानने की मेरी मंशा!
क्या आपको लगता है कि ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग जटिलता का समाधान है। क्यों? यह विषय थोड़ा विवादास्पद हो सकता है लेकिन यहाँ के विशेषज्ञों से क्यों इसका उत्तर जानने की मेरी मंशा!
जवाबों:
जटिलता का कोई हल नहीं है।
"द मिथिकल मैन-मंथ" में, फ्रेड ब्रुक्स ने प्रोग्रामिंग में आकस्मिक और आवश्यक जटिलता के बीच के अंतर पर चर्चा की। एक्सीडेंटल जटिलता हमारे टूल और विधियों के कारण होती है, जैसे कि किसी भाषा में अतिरिक्त कोड लिखना और परीक्षण करना क्योंकि हम अपने विचारों को सीधे व्यक्त नहीं कर सकते हैं, और जैसी चीजें। नई विधियाँ और तकनीकें आकस्मिक जटिलता को कम कर सकती हैं। मैं पच्चीस साल पहले जितना तेज और बेहतर कार्यक्रम लिख सकता था, क्योंकि मेरे पास बेहतर भाषाएं और उपकरण हैं।
आवश्यक जटिलता इस तथ्य से आती है कि हम प्रोग्रामिंग के साथ जो करने की कोशिश करते हैं वह स्वाभाविक रूप से जटिल है, और यह कि एक अप्रासंगिक जटिलता है। "आवश्यक", इस संदर्भ में, "बहुत आवश्यक" के बजाय "चीज के सार से संबंधित" का अर्थ है।
इसलिए, उन्होंने दावा किया कि कोई चांदी की गोली नहीं होगी, यह लिखना सॉफ्टवेयर मुश्किल होगा।
मैं दृढ़ता से अनुशंसा करता हूं कि आप उनकी पुस्तक पढ़ें: विशेष रूप से, मैं एक अतिरिक्त निबंध "नो सिल्वर बुलेट" के साथ सिल्वर एनिवर्सरी संस्करण की सिफारिश करता हूं। इसमें वह जटिलता के प्रस्तावित समाधानों की समीक्षा करता है और उनके प्रभाव पर विचार करता है। (क्या वह सबसे प्रभावी है हटना लपेटो सॉफ्टवेयर - एक बार कुछ जटिल लिखें, और हजारों या लाखों प्रतियां बेचते हैं।)
अब, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग मदद करता है, जब सही किया जाता है, तो अमूर्त बनाने और जटिलता को छिपाने के द्वारा। एक वर्ग की एक वस्तु का एक निश्चित परिभाषित व्यवहार है जिसे हम कार्यान्वयन की जटिलता के बारे में परवाह किए बिना, कारण से कर सकते हैं। उचित रूप से लिखित कक्षाओं में एक-दूसरे के साथ कम युग्मन होता है, और विभाजन और जीतना जटिलता से निपटने का एक शानदार तरीका है यदि आप इसके साथ दूर हो सकते हैं। उनके पास उच्च सामंजस्य भी है, जिसमें वे कार्यों और डेटा का एक सेट है जो एक दूसरे से बहुत निकटता से संबंधित हैं।
मुझे उम्मीद है कि जल्द ही आपको कुछ बेहतर जवाब मिलेंगे, लेकिन यहाँ एक आसान है:
OOP एक तरह से मॉडलिंग सॉफ्टवेयर द्वारा जटिलता के साथ मदद करता है। यह आमतौर पर एक दीवार वस्तु के साथ बातचीत करने वाली गेंद वस्तु की छवि बनाना आसान है, क्योंकि यह रूटीन और डेटा संरचनाओं की एक श्रृंखला की कल्पना करना है, क्योंकि यह वास्तविक दुनिया के साथ बातचीत करने के करीब है।
* क्योंकि कुछ भी जटिलता को 'हल' नहीं कर सकता
मुझे लगता है कि ओओपी की मौजूदा मुख्यधारा की परिभाषा जटिलता के प्रबंधन के लिए अच्छा समाधान नहीं है।
यदि आप इसकी जड़ों की ओर लौटते हैं, तो मेरा मानना है कि एलन काई "लिस्प" से काफी प्रभावित थे।
क्योंकि लिस्प मुख्य धारा के गोद लेने से भ्रष्ट नहीं हुआ है, यह संभवतः अपने मूल मूल्यों का संरक्षण करने में कामयाब रहा। इसलिए मुझे लगता है कि यह देखकर कि लिम्फ जटिलता की इस समस्या से कैसे निपटता है, इससे हमें कुछ जानकारी मिल सकती है, और हम इसे जज के रूप में उपयोग कर सकते हैं कि जटिलता से निपटने में ओओपी कितना उपयोगी है।
यदि आप SICP के "व्याख्यान 3a: हेंडरसन एस्चर उदाहरण" के अंत को देखते हैं , तो हैल एबेल्सन का प्रस्ताव है कि कार्य को छोटे-छोटे उपकार में तोड़कर नहीं, बल्कि अमूर्तता की परतों को बनाकर किया जाता है। उच्चतम स्तर पर, आप घोल के निचले स्तर के समाधान के संदर्भ में जटिल समस्या के समाधान को व्यक्त करते हैं।
मुझे लगता है कि ओओपी मूल रूप से अमूर्त की इन परतों को बनाने के लिए एक तंत्र के रूप में था।
दुर्भाग्य से आजकल, OOP (ab) स्पेगेटी कोड / संरचनाओं को लिखने के लिए उपयोग किया जाता है।
मैं एक उदाहरण बनाऊंगा: एक एफपीएस मल्टी-प्लेयर गेम।
उच्चतम स्तर पर, खेल एक नक्शे के चारों ओर चलने वाले खिलाड़ियों का एक समूह होता है और हथियारों का उपयोग करते हुए एक दूसरे पर शूटिंग करता है।
अगले निचले स्तर पर, हमें नक्शे और हथियारों और खिलाड़ियों के बारे में बात करनी होगी। शायद हम उनके बारे में भौतिक वस्तुओं के रूप में बात कर सकते हैं जो खेल की दुनिया के भीतर बातचीत करते हैं।
अगले निचले स्तर पर, हम इस बारे में बात कर सकते हैं कि वस्तुएं भौतिक रूप से कैसे संपर्क करती हैं (आंदोलन, टकराव, आदि)।
इत्यादि इत्यादि।
इसका क्या मतलब है, (और मैं SICP से उद्धृत कर रहा हूं ..), यह है कि प्रत्येक परत पर, हम न केवल एक विशेष विशिष्ट समस्या को हल करते हैं, बल्कि समस्याओं का एक वर्ग जो हम समस्या के पड़ोस में आते हैं। ' फिर से हल करने की कोशिश कर रहा है इसलिए यदि समस्या के विवरण में एक छोटा सा बदलाव है, तो इसे समाधान में केवल एक छोटे से बदलाव की आवश्यकता होगी।
तो, OOP का उपयोग करने का बुद्धिमान तरीका अमूर्तता की परतें बनाना है, अमूर्तता के प्रत्येक स्तर पर, आप सीधे स्तर से "ऑब्जेक्ट्स" का उपयोग करके समस्या को हल करते हैं जो सीधे नीचे है।
यहाँ थोड़ा सा मैं व्याख्यान से उद्धृत कर रहा था: http://www.youtube.com/watch?v=CYtrfncMqHQ
हमेशा की तरह मैं हर किसी से असहमत हूं। आपको जटिलता का प्रबंधन करने के लिए उपकरण देने से दूर, OOP जटिलता की एक बड़ी मात्रा बनाता है क्योंकि यह एक अपर्याप्त और गणितीय रूप से फर्जी प्रतिमान है। यह प्रोग्रामर को कोई अंत नहीं देता है, ओओपी के साथ चीजों को मॉडल करने का प्रयास करने के लिए जिसे ओओपी के साथ मॉडल नहीं किया जा सकता है।
मेरे विचार में यहाँ का मदरसा काम मेयर्स ऑब्जेक्ट ओरिएंटेड सॉफ्टवेयर कंस्ट्रक्शन है। यह आवश्यकताओं के एक सेट का विवरण देता है, जिनमें से एक को मैं महत्वपूर्ण मानता हूं: ओपन-क्लोज्ड सिद्धांत। यह कहता है कि एक चीज को विस्तार के लिए खुला होना चाहिए लेकिन उपयोग के लिए बंद कर दिया जाना चाहिए।
मेयर इन आवश्यकताओं से ऑब्जेक्ट ओरिएंटेशन प्राप्त करने के लिए आगे बढ़ता है, जैसा कि एफिल में सन्निहित है। एनकैप्सुलेशन, क्लोजर, इनहेरिटेंस ओपन-नेस प्रदान करता है, और उल्लिखित "चीज़" क्लास है।
मैं इस काम को अच्छा विज्ञान मानता हूं क्योंकि मेयर का काम गलत था, और यह संभव है कि उनके काम की गुणवत्ता के कारण, त्रुटि को इंगित करने और उसे ठीक करने के लिए।
त्रुटि वर्ग, या प्रकार, प्रतिरूपता की इकाई बना रही है। यह गलत है, और निश्चित रूप से ऐसा है। यहां तक कि मेयर ने समस्या को पहचान लिया (कोविर्सियस समस्या कहा जाता है), कि ओओपी एक से अधिक की समानता के संबंधों को संभाल नहीं सकता है (अर्थात, ओओपी गुणों के लिए ठीक काम करता है लेकिन बाइनरी संबंधों पर विफल रहता है)। एफिल में, इस समस्या के परिणामस्वरूप टाइप सिस्टम में एक अस्वस्थता थी!
समाधान काफी स्पष्ट है। प्रतिरूपता की इकाई एक प्रकार से बड़ी होनी चाहिए। इसमें कई प्रकार के, और उनसे संबंधित विधियाँ शामिल होनी चाहिए।
यह शायद ही आश्चर्य की बात है कि अमूर्तता का यह मॉडल अमूर्त के गणितीय सिद्धांत द्वारा समर्थित है, अर्थात् श्रेणी सिद्धांत: प्रकार एक श्रेणी की वस्तु हैं, और विधियाँ (कार्य) तीर हैं।
इस मॉडल के साथ, कई प्रकार के प्रतिनिधित्व कार्यों के एक सेट के लिए जाने जाते हैं। प्रतिनिधित्व जनता से छिपा हुआ है, इसलिए यह एनकैप्सलेशन है, लेकिन हम मॉड्यूल का उपयोग करते हैं, न कि कक्षाओं का।
मानक मेटा-भाषा (SML) और Ocaml इस मॉडल पर सीधे आधारित हैं। Ocaml में कक्षाएं और OOP भी हैं: यह बेकार नहीं है क्योंकि OOP आपको गुणों पर प्रेषण देता है, उर्फ डायनामिक बाइंडिंग। हालांकि अधिकांश वास्तविक दुनिया की समस्याओं में संबंध शामिल हैं और यह शायद ही आश्चर्य की बात है कि Ocaml में बहुत अधिक कक्षाओं का उपयोग नहीं किया जाता है।
यह शायद ही आश्चर्य की बात है विरासत शायद ही C ++ मानक टेम्पलेट पुस्तकालय में सभी पर उपयोग किया जाता है।
साधारण तथ्य यह है कि ओओपी आपको जटिलता को संभालने के लिए सही उपकरण नहीं देता है, यह आपको उपकरण को वास्तव में सरल समस्याओं को संभालने के लिए भी नहीं देता है, इसके बजाय यह प्रोग्रामर की दो पीढ़ियों को भ्रमित और भ्रमित करता है। मदद करने की बात तो दूर, OOP सबसे ज्यादा बुराई और बुरी चीज है जो C, फोरट्रान और कोबोल के बाद से प्रोग्रामिंग के लिए हुई है।
ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग की जड़ें हैं जिन्हें 1960 के दशक में पता लगाया जा सकता है। के रूप में हार्डवेयर और सॉफ्टवेयर तेजी से जटिल हो गया, प्रबंधन क्षमता अक्सर एक चिंता का विषय बन गया। शोधकर्ताओं ने सॉफ़्टवेयर तर्क को बनाए रखने के तरीकों का अध्ययन किया और प्रोग्रामिंग लॉजिक के पुन: प्रयोज्य इकाइयों को दृढ़ता से जोर देकर सामान्य समस्याओं को हल करने के लिए भाग में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग विकसित की ।
एक ऑब्जेक्ट-ओरिएंटेड प्रोग्राम को पारंपरिक मॉडल के विपरीत, इंटरेक्टिंग ऑब्जेक्ट्स के संग्रह के रूप में देखा जा सकता है, जिसमें एक प्रोग्राम को प्रदर्शन करने के लिए कार्यों की सूची (सबरूटीन्स) के रूप में देखा जाता है। OOP में, प्रत्येक ऑब्जेक्ट संदेश प्राप्त करने, डेटा को संसाधित करने और अन्य वस्तुओं को संदेश भेजने में सक्षम है। प्रत्येक वस्तु को एक अलग भूमिका या जिम्मेदारी के साथ एक स्वतंत्र 'मशीन' के रूप में देखा जा सकता है। इन वस्तुओं पर क्रिया (या "विधियाँ") वस्तु के साथ निकटता से जुड़ी हैं ।
http://en.wikipedia.org/wiki/Object-oriented_programming
ऑब्जेक्ट ओरिएंटेशन की अन्य विशेषताओं जैसे बहुरूपता, वंशानुक्रम, संदेश पासिंग, डिकूपिंग और इनकैप्सुलेशन के साथ चिंताओं का यह पृथक्करण, एक तार्किक और वैचारिक ढांचा प्रदान करता है जिसके द्वारा बड़े कार्यक्रमों की जटिलता को अत्यधिक प्रभावी तरीके से प्रबंधित किया जा सकता है।
सॉफ्टवेयर विकास में कई तरह की जटिलताएँ हैं। प्रोग्रामिंग स्तर पर, OOP समस्या डोमेन को मॉडल करने के लिए वस्तुओं और कक्षाओं का उपयोग करके जटिलता को संबोधित करना चाहता है। एक प्रसिद्ध गुरु ने कहा कि समस्या का समाधान सिर्फ समस्या का प्रतिनिधित्व करना है ताकि समाधान स्वयं का प्रतिनिधित्व हो। इसलिए, कक्षाओं का उपयोग करते हुए अमूर्तता द्वारा, एक्सेस मॉडिफ़ायर और विधियों का उपयोग करके, संबंध और पुन: उपयोग को निर्दिष्ट करने के लिए विरासत, वर्गों के बीच संबंध और सहयोग स्थापित करने में रचना, समान वस्तुओं में विभिन्न व्यवहारों के निर्धारण को सरल बनाने के साधन के रूप में बहुरूपता, जटिलता का प्रबंधन किया जा सकता है।
सॉफ्टवेयर जटिलता का प्रबंधन करने के अन्य तरीके भी हैं, उदाहरण के लिए, तर्क (प्रस्तावना) और कार्यात्मक (हास्केल) प्रोग्रामिंग।
प्रोग्रामिंग से अधिक के स्तर पर, हमें OOP को निर्देशित करने के लिए डिज़ाइन पैटर्न और सिद्धांत की आवश्यकता होती है। इसलिए OOP एक कम (कोडिंग) स्तर पर जटिलता का प्रबंधन कर रहा है, जबकि इन पद्धतियों जैसे कि डिज़ाइन पैटर्न और सिद्धांत उच्च स्तर (सिस्टम और एप्लिकेशन) के स्तर पर समाधान के डिज़ाइन का मार्गदर्शन करते हैं और सॉफ्टवेयर विकास और जटिलताओं को अधिक प्रबंधनीय बनाते हैं।
आपके प्रश्न का उत्तर देने के लिए, हाँ, OOP कई अन्य समाधानों में जटिलता से निपटने का एक समाधान है। यह निम्न स्तर पर एक समाधान है। हमें OOP को उच्च स्तर पर मार्गदर्शन करने के लिए डिज़ाइन पैटर्न और सिद्धांत की आवश्यकता है।
ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग आवश्यक और वैकल्पिक जटिलता का प्रबंधन करता है, लेकिन यह भी कम नहीं करता है।
मैं द आर्ट ऑफ यूनिक्स प्रोग्रामिंग में एरिक स्टीवन रेमंड द्वारा प्रदान की गई परिभाषा को पसंद करता हूं , क्योंकि यह आवश्यक, वैकल्पिक और आकस्मिक जटिलता के बीच परिसीमन करता है। http://www.faqs.org/docs/artu/ch13s01.html#id2964646
ओओपी आवश्यक या वैकल्पिक जटिलता के लिए कुछ भी नहीं करता है, वे कार्यक्रम की आवश्यकताओं का एक फ़ंक्शन हैं। यह आकस्मिक जटिलता पर प्रभाव डाल सकता है, इसमें आप ओओपी के साथ कभी-कभी अधिक सुरुचिपूर्ण डिजाइन बना सकते हैं। हालांकि, कभी-कभी ओओपी का उपयोग करते समय डिज़ाइन खराब होता है।
जटिल समस्याओं को प्रौद्योगिकी के माध्यम से सरल नहीं किया जा सकता है, उन्हें केवल तकनीक के माध्यम से प्रबंधित किया जा सकता है ।
OOP एक तकनीक है, एक अवधारणा है, और एक समस्या से निपटने का तरीका है।
OOP आपको एक डिज़ाइन लागू करने के लिए उपकरण देता है जो जटिलता को प्रबंधित करना आसान बना सकता है, लेकिन आप आसानी से एक बुरा डिज़ाइन बना सकते हैं जो आपकी जटिलता को बढ़ाता है। दूसरे शब्दों में, यदि ठीक से उपयोग नहीं किया जाता है, तो आप अपनी समस्याओं में प्रौद्योगिकी-प्रेरित जटिलता हो सकते हैं।
ध्यान रखें कि कई अन्य पहलू हैं जो तय करेंगे कि आपकी परियोजना कितनी सफल होगी (यानी परियोजना प्रबंधन शैली, समस्या परिभाषा, परिवर्तन प्रबंधन, आदि ...)। आपके द्वारा उपयोग की जाने वाली तकनीक केवल इस बात में प्रासंगिक है कि यह आपको समस्या का प्रबंधन करने में कितना मदद करेगी ।
अंत में, ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग जटिलता का समाधान नहीं हो सकता है ; यह इसे प्रबंधित करने के लिए सिर्फ एक उपकरण है। (अगर ठीक से इस्तेमाल किया गया हो)
ऑब्जेक्ट ओरिएंटेशन (पारंपरिक रूप से प्रयुक्त) कई परिस्थितियों में एक उपयोगी उपकरण है, लेकिन यह जटिलता का पर्याप्त समाधान नहीं है।
विशेष रूप से, यह अक्सर " आकस्मिक जटिलता " का एक बहुत जोड़ता है । उदाहरण कार्यान्वयन जटिलता के आसपास की जटिलताएं हैं, "मानक कार्यक्षमता" के बहुत सारे प्रदान करने की आवश्यकता है, बराबर () और हैशकोड () आदि। इस विषय पर स्टुअर्ट हल्लोवे द्वारा एक अच्छी प्रस्तुति: " सरलता आइने आसान है "।
अधिकांश भाषाओं में वस्तुएं बहुत से उत्परिवर्तनीय अवस्था को भी समाहित कर लेती हैं - जो कि समवर्ती दुनिया में तेजी से घटते डिजाइन के फैसले की तरह लग रही है। रिच हिकी का एक दिलचस्प वीडियो फिर से वस्तु पहचान और राज्य के बीच के अंतर को देखता है, और कैसे यह दोनों को भ्रमित करने की गलती हो सकती है।
ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग एक समस्या का प्रतिनिधित्व करने का एक तरीका है, अधिक कुछ नहीं, कुछ भी कम नहीं। यह स्वयं में और किसी भी अन्य प्रोग्रामिंग प्रतिमान से कम जटिल नहीं है। एक अच्छी तरह से डिज़ाइन किया गया ओओपी सिस्टम जटिलता का प्रबंधन करता है और कम करता है, लेकिन ऐसी प्रणाली को डिजाइन करना भी बहुत आसान है जो आवश्यकता से बहुत अधिक जटिल है और हर चीज के रास्ते में मिलती है।
C ++ के अनुसार, OOP आपको अपने आप को लटकाने के लिए पर्याप्त रस्सी देता है।
मुझे लगता है कि हाँ , सिर्फ इसलिए कि यह आपको छोटे आत्म-युक्त "बिल्डिंग ब्लॉक्स" में जटिलता को स्लाइस करने की अनुमति देता है जो विवरण छिपाते हैं, और फिर उन्हें आपकी ज़रूरत की कार्यक्षमता बनाने के लिए उपयोग करते हैं, चरण दर चरण, परत दर परत।
विभाजन और जीत।
OOP एक समाधान पर एक प्रयास है।
जटिलता का प्रबंधन करने का सबसे अच्छा तरीका अमूर्तता बनाना है। यदि मैं अपने डेटा को उपयोगी संग्रह में बदल सकता हूं, तो पहचानने योग्य कार्यों के साथ जो उन संग्रहों पर काम करते हैं, मैं उन चीजों के रूप में संग्रह के बारे में सोचना शुरू कर सकता हूं जो इन चीजों को असतत करते हैं। " यही वर्गों और विधियों का आधार है। उस संबंध में, ठीक से डिज़ाइन किया गया OOP जटिलता का प्रबंधन करने में मदद कर सकता है।
कहीं रास्ते में, किसी ने फैसला किया कि हम कोड-पुन: उपयोग की समस्या को हल करने में मदद करने के लिए OOP का उपयोग कर सकते हैं। मेरा मतलब है, पहिया को क्यों मजबूत करें? यदि किसी और व्यक्ति ने इस समस्या को हल करने की दिशा में बहुत काम किया है, तो उन्होंने जो किया है उसका लाभ उठाएं, इसमें वे ट्विक जोड़ दें, जो आपके विशेष प्रोजेक्ट के लिए आवश्यक हैं और वॉइला! आपने अपनी ओर से अपेक्षाकृत कम काम के साथ एक शक्तिशाली, परिष्कृत एप्लिकेशन बनाया है। OO प्रोग्रामर बहुत उत्पादक प्रोग्रामर हो सकते हैं।
अंतिम परिणाम यह है कि आधुनिक OO प्रोग्रामर अंत में "जादूगर के प्रशिक्षु" होते हैं, जहां वे "गोंद" की कुछ पंक्तियों के साथ बड़े, अनछुए पुस्तकालयों का एक गुच्छा बाँधते हैं और कुछ मिलता है जो काम करता है। Sorta। किंडा। सर्वाधिक समय। क्या इस लाइब्रेरी को उस एक के साथ इस्तेमाल करने से संभावित दुष्परिणाम होते हैं? शायद। लेकिन उन पुस्तकालयों में निहित कोड को वास्तव में खोदने का समय किसके पास है? खासकर जब पुस्तकालयों का विकास हो रहा हो। नतीजा यह है कि हम फूला हुआ अनुप्रयोगों के साथ समाप्त होते हैं, जहां एक प्रोग्रामर को उस पुस्तकालय से मुट्ठी भर वर्गों और तरीकों की आवश्यकता होती है, लेकिन ऐप को उन सभी अन्य सामानों का वजन वहन करना पड़ता है जिनकी उन्हें आवश्यकता नहीं थी।
अंतिम परिणाम यह है कि आप अपनी आवश्यकता से बहुत अधिक जटिलता के साथ समाप्त होते हैं।
जटिलता से निपटने के लिए एक और तंत्र जिसे आप अलग कार्यक्षमता चाहते हैं। आप अपने सभी डेटा एक्सेस फ़ंक्शंस एक ही स्थान पर चाहते हैं। आप एक जगह में अपने सभी यूजर इंटरफेस की कार्यक्षमता चाहते हैं। आप अपने सभी नियंत्रकों को एक जगह चाहते हैं। इसलिए आप विभिन्न वर्गों का निर्माण करते हैं जो कार्यक्षमता के विभिन्न भागों का प्रबंधन करते हैं। अब तक सब ठीक है। और यह तराजू, एक हद तक; आपके डेवलपर्स जो डेटा एक्सेस के साथ कुशल हैं, वे उन वर्गों को लिख सकते हैं, आपके उपयोगकर्ता-इंटरफ़ेस लोग उपयोगकर्ता-इंटरफ़ेस कक्षाएं लिख सकते हैं, आदि सभी अच्छी तरह से और अच्छे हैं।
जब तक आपको किसी और के लिखे कुछ को बनाए रखना है।
हां, यह जानना अच्छा है कि सभी डेटा एक्सेस फ़ंक्शन यहां स्थित हैं। लेकिन उन्हें क्या कहते हैं?
यह विधि उस विधि को उस वर्ग पर बुला रही है। लेकिन जब मैं कक्षा की परिभाषा को देखता हूं, तो उस नाम की कोई विधि नहीं है। ओह, यह विरासत श्रृंखला में कुछ और एक या दो परतों से विरासत में मिली है। एक मिनट रुकिए; उस वर्ग ने एक इंटरफ़ेस लागू किया? कितने अलग-अलग वर्ग उस इंटरफ़ेस को लागू करते हैं? और हम कुछ जटिल रन-टाइम सिस्टम का उपयोग कर रहे हैं (मैं आपको, स्प्रिंग को देख रहा हूं) रन-टाइम में कक्षाओं के "एक साथ तार" उदाहरण? उस इंटरफ़ेस को लागू करने वाले किसी भी वर्ग को कहाँ इस्तेमाल किया जा सकता है?
आप बहुत सारे छोटे, असतत तरीकों से समाप्त होते हैं जो सटीक चीजें करते हैं। लेकिन यह उस एक को बुलाता है, दूसरे वर्ग में। जो उस एक को बुलाता है, फिर भी दूसरे वर्ग में। जो उस एक को बुलाता है, अभी भी दूसरे वर्ग में। जो एक अतिरिक्त कक्षा में उस एक को बुलाता है। जो एक विशेष प्रकार का परिणाम देता है। जिस पर आपको एक निश्चित कार्य करने के लिए एक विधि को कॉल करना होगा। जो दूसरे प्रकार का परिणाम देता है। आदि।
इसके लिए एक शब्द है: स्पेगेटी कोड।
आप कोड की रचना करने के लिए केवल एक बहुत ही जटिल प्रणाली के साथ समाप्त होते हैं। इसलिए विजुअल स्टूडियो, ग्रहण और नेटबीन्स जैसे आईडीई। जिनमें से सभी में एक महत्वपूर्ण सीखने की अवस्था है। वास्तव में, उनमें से कई अलग-अलग समूहों द्वारा विकसित / एकत्रित करने में सक्षम हैं, जिनमें से प्रत्येक के पास अपने सीखने के मोड़ हैं।
यह जटिलता का प्रबंधन है?
डिबगिंग कोड इसे लिखने से दोगुना कठिन है। सौभाग्य इस सामग्री में से कुछ डिबगिंग। खासकर अगर यह कई पुस्तकालयों का उपयोग कर रहा है, तो रन-टाइम पर "एक साथ वायर्ड" किसी तरह की निर्भरता-इंजेक्शन प्रणाली का उपयोग कर।
संक्षेप में: OOP जटिलता प्रदान करने में मदद करने के लिए एक आशाजनक उपकरण की तरह दिखता है। वास्तविकता यह है कि परिणामस्वरूप कोड बुरी तरह से फूला हुआ है (क्योंकि आप उन सभी लिंक किए गए पुस्तकालयों से अपनी ज़रूरत के टुकड़े नहीं निकाल सकते हैं) और आपको कोड को नेविगेट करने के लिए परिष्कृत उपकरणों की आवश्यकता है। यह जल्दी से एक रखरखाव दुःस्वप्न बन जाता है।
IMHO, यह एक शुद्ध नुकसान है; यह खत्म होने से अधिक जटिलता जोड़ता है। यह आपको उन चीजों को करने की अनुमति देता है जो इसके बिना, बहुत मुश्किल से, संभवतः असंभव भी हो सकती हैं। लेकिन कोई भी बड़ी परियोजना तेजी से एक अप्रत्याशित गंदगी में विकसित होती है।
यदि आप पहले से ही जानते हैं कि यह कैसे काम करता है, और आप इसे याद रख सकते हैं, तो आप इसे बनाए रखने का मौका दे सकते हैं।
ईगलसन का नियम लागू करना याद रखें: आपका अपना कोई भी कोड, जिसे आपने छह महीने में नहीं देखा है, किसी अन्य व्यक्ति द्वारा भी लिखा जा सकता है।
कुछ हद तक...
क्यों? क्योंकि यह बहुत तार्किक मॉड्यूलर सुविधा प्रदान करता है। कम से कम प्रक्रियात्मक प्रोग्रामिंग की तुलना में जहां यह सब बहुत स्पैगेटी कोड के विशाल ढेर लिखने के लिए आकर्षक है।
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग हमें जटिलता को संभालने में मदद करने के लिए लगता है क्योंकि यह हमें कई तरह के तरीकों के बजाय एक विशिष्ट फैशन में कोड लिखने के लिए मजबूर करता है। टास्क उन्मुख प्रोग्रामिंग बहुत अधिक सहज है, यही वजह है कि प्रोग्रामिंग ने इस तरह से शुरू किया। ऑब्जेक्ट-ओरिएंटेशन प्रभावी ढंग से समझने और उपयोग करने के लिए प्रशिक्षण और अभ्यास लेता है, लेकिन प्रोग्रामिंग को एक निश्चित मार्ग में विवश करके, यह प्रशिक्षित लोगों को उस कोड को प्रभावी ढंग से बनाए रखने की अनुमति देता है जो लिखा गया था।
यह किसी भी अन्य विधि की तुलना में अधिक तार्किक या वास्तविक दुनिया नहीं है, यह समान लेंस के माध्यम से हमारी समस्या को हल करने पर ध्यान केंद्रित करने का एक तरीका है। बहुत सारी तकनीकी विशिष्टताएं अपने कार्यों की जटिलता को संभालने के लिए एक गैर-सहज कठोर कार्यप्रणाली के प्रतिमान का उपयोग करती हैं।
जटिलता को संभालने के लिए एक तीसरा तरीका कार्यात्मक प्रोग्रामिंग होगा, और भविष्य में संभवतः अन्य नए तरीके भी होंगे।
मुझे लगता है कि यह स्थिरता के लिए एक समाधान के रूप में अधिक है, क्योंकि, एक प्रोग्रामर के रूप में, आपको उन तरीकों को रखना चाहिए जहां आपके पास डेटा है, इस प्रकार आपके एप्लिकेशन का ऑब्जेक्ट मॉडल बना रहा है।
हां, यह आपके कोड को एक प्राकृतिक तरीके से "देखने" के लिए एक मॉडल प्रदान करके जटिलता का समाधान है, क्योंकि जिन वस्तुओं में गुण और संभावित क्रियाएं होती हैं