इन प्रोग्रामिंग प्रतिमानों के बीच क्या अंतर हैं, और क्या वे विशेष समस्याओं के लिए बेहतर अनुकूल हैं या किसी भी उपयोग-मामलों को दूसरों पर एहसान करते हैं?
वास्तुकला के उदाहरणों की सराहना की!
इन प्रोग्रामिंग प्रतिमानों के बीच क्या अंतर हैं, और क्या वे विशेष समस्याओं के लिए बेहतर अनुकूल हैं या किसी भी उपयोग-मामलों को दूसरों पर एहसान करते हैं?
वास्तुकला के उदाहरणों की सराहना की!
जवाबों:
वे सभी अपने तरीके से अच्छे हैं - वे एक ही समस्याओं के लिए अलग-अलग दृष्टिकोण रखते हैं।
विशुद्ध रूप से प्रक्रियात्मक शैली में, डेटा उस पर काम करने वाले कार्यों से अत्यधिक विघटित हो जाता है।
ऑब्जेक्ट ओरिएंटेड स्टाइल में, डेटा अपने साथ फंक्शन्स का संग्रह ले जाता है।
एक कार्यात्मक शैली में, डेटा और फ़ंक्शन एक-दूसरे के साथ आम तौर पर अधिक होते हैं (जैसे लिस्प और स्कीम में) वास्तव में उपयोग किए जाने वाले कार्यों के संदर्भ में अधिक लचीलापन प्रदान करते हैं। एल्गोरिदम भी लूप और पुनरावृत्ति के बजाय पुनरावृत्ति और संरचना के संदर्भ में परिभाषित किया जाता है।
बेशक, भाषा ही प्रभावित करती है कि कौन सी शैली पसंद की जाती है। हास्केल जैसी शुद्ध-कार्यात्मक भाषा में भी, आप एक प्रक्रियात्मक शैली में लिख सकते हैं (हालांकि यह बहुत हतोत्साहित किया जाता है), और यहां तक कि सी जैसी प्रक्रियात्मक भाषा में भी, आप ऑब्जेक्ट-ओरिएंटेड शैली (जैसे GTK +) में प्रोग्राम कर सकते हैं ईएफएल एपीआई)।
स्पष्ट होने के लिए, प्रत्येक प्रतिमान का "लाभ" केवल आपके एल्गोरिदम और डेटा संरचनाओं के मॉडलिंग में है। यदि, उदाहरण के लिए, आपके एल्गोरिथ्म में सूचियां और पेड़ शामिल हैं, तो एक कार्यात्मक एल्गोरिथ्म सबसे समझदार हो सकता है। या, यदि, उदाहरण के लिए, आपका डेटा अत्यधिक संरचित है, तो इसे वस्तुओं के रूप में रचना करने के लिए अधिक समझदारी हो सकती है यदि वह आपकी भाषा का मूल प्रतिमान है - या, यह आसानी से भिक्षुओं के कार्यात्मक अमूर्त के रूप में लिखा जा सकता है, जो हास्केल या एमएल जैसी भाषाओं का मूल प्रतिमान है।
जिस विकल्प का आप उपयोग करते हैं, वह बस वही है जो आपकी परियोजना के लिए अधिक मायने रखता है और आपकी भाषा का समर्थन करता है।
मुझे लगता है कि उपलब्ध पुस्तकालय, उपकरण, उदाहरण और समुदाय इन दिनों पूरी तरह से प्रतिमान को रौंदते हैं। उदाहरण के लिए, ML (या जो कुछ भी) हो सकता है कि वह सर्व-प्रयोजन की प्रोग्रामिंग भाषा हो, लेकिन यदि आप जो कर रहे हैं उसके लिए आपको कोई अच्छी लाइब्रेरी नहीं मिल सकती है।
उदाहरण के लिए, यदि आप एक वीडियो गेम बना रहे हैं, तो C ++ में अधिक अच्छे कोड उदाहरण और SDK हैं, इसलिए आप शायद इससे बेहतर हैं। एक छोटे से वेब एप्लिकेशन के लिए, कुछ महान पायथन, पीएचपी और रूबी फ्रेमवर्क हैं जो आपको बहुत जल्दी और दूर चलाएंगे। संकलित समय जाँच और उद्यम पुस्तकालयों और प्लेटफार्मों की वजह से जावा बड़ी परियोजनाओं के लिए एक बढ़िया विकल्प है।
यह मामला हुआ करता था कि विभिन्न भाषाओं के लिए मानक पुस्तकालय बहुत छोटे थे और आसानी से दोहराए गए थे - सी, सी ++, असेंबलर, एमएल, एलआईएसपी, आदि। मूल बातें के साथ आया था, लेकिन चीजों के मानकीकरण की बात आने पर चिकन को दिया गया। नेटवर्क संचार, एन्क्रिप्शन, ग्राफिक्स, डेटा फ़ाइल स्वरूपों (XML सहित) की तरह, यहां तक कि संतुलित पेड़ों और हैशटेबल्स जैसी बुनियादी डेटा संरचनाएं छोड़ दी गईं!
पायथन, पीएचपी, रूबी, और जावा जैसी आधुनिक भाषाएँ अब एक अधिक सभ्य मानक पुस्तकालय के साथ आती हैं और कई अच्छे तृतीय पक्ष पुस्तकालय हैं जिन्हें आप आसानी से उपयोग कर सकते हैं, पुस्तकालयों को एक दूसरे से टकराने से बचाने के लिए उनके नामस्थानों को गोद लेने के लिए महान भाग में। और पुस्तकालयों की स्मृति प्रबंधन योजनाओं को मानकीकृत करने के लिए कचरा संग्रह।
इन प्रतिमानों का परस्पर अनन्य होना आवश्यक नहीं है। यदि आप अजगर को देखते हैं, तो यह फ़ंक्शन और कक्षाओं का समर्थन करता है, लेकिन एक ही समय में, सब कुछ एक ऑब्जेक्ट है, जिसमें फ़ंक्शन शामिल हैं। आप कोड के एक टुकड़े में कार्यात्मक / ऊप / प्रक्रियात्मक शैली को मिश्रित और मैच कर सकते हैं।
मेरा मतलब है कि कार्यात्मक भाषाओं में (कम से कम हास्केल में, केवल एक ही मैंने अध्ययन किया) कोई वक्तव्य नहीं हैं! कार्यों को केवल उनके अंदर एक अभिव्यक्ति की अनुमति है !! लेकिन, फ़ंक्शंस प्रथम श्रेणी के नागरिक हैं, आप उन्हें मापदंडों के रूप में, अन्य क्षमताओं के एक समूह के साथ पास कर सकते हैं। वे कोड की कुछ पंक्तियों के साथ शक्तिशाली चीजें कर सकते हैं।
जबकि सी जैसी एक प्रक्रियात्मक भाषा में, आप फ़ंक्शन के पास का एकमात्र तरीका फ़ंक्शन पॉइंटर्स का उपयोग करके कर सकते हैं, और यह कि अकेले कई शक्तिशाली कार्यों को सक्षम नहीं करता है।
अजगर में, एक फ़ंक्शन प्रथम श्रेणी का नागरिक होता है, लेकिन इसमें मनमाने ढंग से संख्याएँ हो सकती हैं। तो आपके पास एक फ़ंक्शन हो सकता है जिसमें प्रक्रियात्मक कोड होता है, लेकिन आप इसे कार्यात्मक भाषाओं की तरह पास कर सकते हैं।
वही OOP के लिए जाता है। जावा जैसी भाषा आपको किसी कक्षा के बाहर प्रक्रिया / कार्य लिखने की अनुमति नहीं देती है। किसी फ़ंक्शन को पास करने का एकमात्र तरीका उसे उस ऑब्जेक्ट में लपेटना है जो उस फ़ंक्शन को लागू करता है, और उसके बाद उस ऑब्जेक्ट को पास करता है।
पायथन में, आपके पास यह प्रतिबंध नहीं है।
जीयूआई के लिए मैं कहूंगा कि ऑब्जेक्ट ओरिएंटेड प्रतिमान बहुत अच्छी तरह से अनुकूल है। विंडो एक ऑब्जेक्ट है, टेक्स्टबॉक्स ऑब्जेक्ट हैं, और ओके-बटन भी एक है। दूसरी ओर स्टिंग प्रोसेसिंग जैसे सामान को बहुत कम ओवरहेड के साथ किया जा सकता है और इसलिए सरल प्रक्रियात्मक प्रतिमान के साथ अधिक सरल है।
मुझे नहीं लगता कि यह न तो भाषा का कोई सवाल है। आप लगभग किसी भी लोकप्रिय भाषा में कार्यात्मक, प्रक्रियात्मक या वस्तु-उन्मुख लिख सकते हैं, हालांकि यह कुछ में कुछ अतिरिक्त प्रयास हो सकता है।
आपके प्रश्न का उत्तर देने के लिए, हमें दो तत्वों की आवश्यकता है:
सॉफ्टवेयर आर्किटेक्चर स्टाइल / पैटर्न की एक सूची विकिपीडिया पर सॉफ्टवेयर आर्किटेक्चर लेख पर दिखाई गई है । और आप उन पर आसानी से वेब पर शोध कर सकते हैं।
संक्षेप में और सामान्य तौर पर, प्रक्रियात्मक एक मॉडल के लिए अच्छा है जो एक प्रक्रिया का पालन करता है, ओओपी डिजाइन के लिए अच्छा है, और कार्यात्मक उच्च स्तरीय प्रोग्रामिंग के लिए अच्छा है।
मुझे लगता है कि आपको प्रत्येक प्रतिमान पर इतिहास पढ़ने की कोशिश करनी चाहिए और देखना चाहिए कि लोग इसे क्यों बनाते हैं और आप उन्हें आसानी से समझ सकते हैं।
उन दोनों को समझने के बाद, आप वास्तुकला शैलियों / पैटर्न की वस्तुओं को प्रोग्रामिंग प्रतिमानों से जोड़ सकते हैं।
मेरा एक मित्र NVIDIA CUDA का उपयोग करके एक ग्राफिक्स ऐप लिख रहा है । आवेदन OOP प्रतिमान के साथ बहुत अच्छी तरह से फिट बैठता है और समस्या बड़े करीने से मॉड्यूल में विघटित हो सकती है। हालाँकि, CUDA का उपयोग करने के लिए आपको C का उपयोग करने की आवश्यकता होती है, जो वंशानुक्रम का समर्थन नहीं करता है । इसलिए, आपको चतुर होने की आवश्यकता है।
a) आप एक चतुर प्रणाली तैयार करते हैं जो एक निश्चित सीमा तक विरासत का अनुकरण करेगी। यह किया जा सकता है!
i) आप एक हुक सिस्टम का उपयोग कर सकते हैं , जो माता-पिता पी के हर बच्चे को उम्मीद करता है कि फ़ंक्शन एफ के लिए एक निश्चित ओवरराइड है। आप बच्चों को उनके ओवरराइड को पंजीकृत करने के लिए बना सकते हैं, जो आवश्यक होने पर संग्रहीत और कॉल किए जाएंगे।
ii) आप बच्चों को माता-पिता में शामिल करने के लिए संरचित मेमोरी संरेखण सुविधा का उपयोग कर सकते हैं ।
यह साफ-सुथरा हो सकता है लेकिन भविष्य के प्रमाण, विश्वसनीय समाधान के साथ आना आसान नहीं है। आप सिस्टम को डिजाइन करने में बहुत समय बिताएंगे और इस बात की कोई गारंटी नहीं है कि आप प्रोजेक्ट के माध्यम से आधी-अधूरी समस्याओं में नहीं चलेंगे। कई विरासत को लागू करना और भी कठिन है, अगर लगभग असंभव नहीं है।
बी) आप लगातार नामकरण नीति का उपयोग कर सकते हैं और एक कार्यक्रम बनाने के लिए विभाजन और विजय दृष्टिकोण का उपयोग कर सकते हैं । इसकी कोई विरासत नहीं होगी, लेकिन क्योंकि आपके कार्य छोटे, आसानी से समझ में आ रहे हैं और लगातार स्वरूपित होने के कारण आपको इसकी आवश्यकता नहीं है। आपको जितने कोड लिखने की आवश्यकता है, वह ऊपर जाता है, ध्यान केंद्रित रहना बहुत आसान है और आसान समाधान (हैक्स) के आगे नहीं झुकना है। हालांकि, कोडिंग का यह निंजा तरीका सी कोडिंग का तरीका है। निम्न-स्तरीय स्वतंत्रता और अच्छा कोड लिखने के बीच संतुलन में रहना। इसे प्राप्त करने का अच्छा तरीका एक कार्यात्मक भाषा का उपयोग करके प्रोटोटाइप लिखना है। उदाहरण के लिए, हास्केल एल्गोरिदम के प्रोटोटाइप के लिए बेहद अच्छा है।
मैं दृष्टिकोण बी की ओर जाता हूं। मैंने दृष्टिकोण ए का उपयोग करके एक संभावित समाधान लिखा, और मैं ईमानदार रहूंगा, यह उस कोड का उपयोग करके बहुत अप्राकृतिक लगा।