oop कार्यात्मक और अनिवार्य प्रोग्रामिंग भाषाओं के बीच क्या अंतर है?




functional-programming (4)

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

मुझे पता है कि यह प्रोग्रामिंग के तरीके को चुनने के लिए उपयोगकर्ता आवश्यकताओं पर निर्भर करता है लेकिन कार्यात्मक प्रोग्रामिंग भाषाओं को सीखने की सिफारिश क्यों की जाती है?


यहां अंतर है:

अनिवार्य:

  • प्रारंभ
  • अपने जूते के आकार 9 1/2 चालू करें।
  • चाबियाँ [7] कुंजी रखने के लिए अपनी जेब में कमरा बनाएं।
  • जेब में चाबियों के लिए कमरे में चाबियाँ रखो।
  • गेराज दर्ज करें।
  • गेराज खोलें।
  • कार दर्ज करें

... और इतने पर और ...

  • रेफ्रिजरेटर में दूध रखो।
  • रूक जा।

घोषणात्मक, जहां कार्यात्मक एक उपश्रेणी है:

  • दूध एक स्वस्थ पेय है, जब तक आपको लैक्टोज को पचाने में समस्या न हो।
  • आमतौर पर, एक रेफ्रिजरेटर में दूध स्टोर करता है।
  • एक रेफ्रिजरेटर एक बॉक्स है जो चीजों को शांत रखता है।
  • एक दुकान एक जगह है जहां आइटम बेचे जाते हैं।
  • "बिक्री" करके हमारा मतलब है पैसे के लिए चीजों का आदान-प्रदान।
  • इसके अलावा, चीजों के लिए पैसे का आदान-प्रदान "खरीदना" कहा जाता है।

... और इतने पर और ...

  • सुनिश्चित करें कि हमारे पास रेफ्रिजरेटर में दूध है (जब हमें इसकी आवश्यकता होती है - आलसी कार्यात्मक भाषाओं के लिए)।

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


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

उदाहरण: जावा एक अनिवार्य भाषा है। उदाहरण के लिए, संख्याओं की एक श्रृंखला जोड़ने के लिए एक प्रोग्राम बनाया जा सकता है:

 int total = 0;
 int number1 = 5;
 int number2 = 10;
 int number3 = 15;
 total = number1 + number2 + number3; 

प्रत्येक कथन प्रोग्राम की स्थिति को बदलता है, प्रत्येक वैरिएबल को मानों को उन मानों के अंतिम जोड़ में निर्दिष्ट करने से। पांच बयानों के अनुक्रम का उपयोग करके कार्यक्रम स्पष्ट रूप से बताया गया है कि संख्या 5, 10 और 15 को एक साथ कैसे जोड़ना है।

कार्यात्मक भाषाएं: कार्यात्मक प्रोग्रामिंग प्रतिमान को समस्या निवारण के लिए एक शुद्ध कार्यात्मक दृष्टिकोण का समर्थन करने के लिए स्पष्ट रूप से बनाया गया था। कार्यात्मक प्रोग्रामिंग घोषणात्मक प्रोग्रामिंग का एक रूप है।

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

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

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

ओओपी लोगों या प्रभावशाली भाषाओं के लिए:

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

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

विपक्ष:

यह प्रोग्रामिंग के तरीके को चुनने के लिए उपयोगकर्ता आवश्यकताओं पर निर्भर करता है, इसलिए केवल तभी नुकसान होता है जब उपयोगकर्ता उचित तरीके से नहीं चुनते हैं।

जब विकास गलत तरीके से जाता है, तो आपको समस्याएं होती हैं:

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

मुझे पता है कि यह सवाल पुराना है और अन्य ने इसे पहले से ही समझाया है, मैं एक उदाहरण समस्या देना चाहता हूं जो सरल शब्दों में बताती है।

समस्या: 1 की तालिका लिखना।

उपाय: -

शाही शैली से: =>

    1*1=1
    1*2=2
    1*3=3
    .
    .
    .
    1*n=n 

कार्यात्मक शैली द्वारा: =>

    1
    2
    3
    .
    .
    .
    n

प्रभावशाली शैली में स्पष्टीकरण हम निर्देशों को अधिक स्पष्ट रूप से लिखते हैं और जिसे अधिक सरल तरीके से कहा जा सकता है।

जहां कार्यात्मक शैली में, चीजें जो आत्म-व्याख्यात्मक हैं उन्हें अनदेखा कर दिया जाएगा।


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

यह इस प्रकार है कि एक कार्यात्मक कार्यक्रम केवल एक अभिव्यक्ति है।

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

कार्यक्रमों और मूल्यों से बनी प्रोग्राम्स-ए-एक्सप्रेशन के इस ढांचे पर, भाषाओं, अवधारणाओं, "कार्यात्मक पैटर्न", संयोजक, और विभिन्न प्रकार के सिस्टम और मूल्यांकन एल्गोरिदम का एक संपूर्ण व्यावहारिक प्रतिमान बनाया गया है।

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





functional-programming