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


159

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

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



1
इस अन्य [पोस्ट] [1] की जाँच करें। यह अंतरों का स्पष्ट रूप से वर्णन करता है। [१]: stackoverflow.com/questions/602444/…
थीटा

जवाबों:


160

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

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

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

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

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

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

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

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

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

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

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

विपक्ष:

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

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

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

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

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

4
मुझे उस पाठ पर स्पष्ट अंतर दिखाई नहीं देता जहाँ प्रत्येक प्रोग्रामिंग की विशेषता पर प्रकाश डाला जाता है। प्रक्रियात्मक प्रोग्रामिंग के लिए अधिकांश विवरण अनिवार्य प्रोग्रामिंग पाठ और इसके विपरीत द्वारा विमर्श किया जा सकता है।
एक्सईफेक्चर

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

230

यहाँ अंतर है:

अनिवार्य:

  • शुरू
  • अपने जूते का आकार ९ १/२ कर दें।
  • चाबियों का एक सरणी [7] रखने के लिए अपनी जेब में जगह बनाएं।
  • कमरे में चाबियां जेब में रखने के लिए रख दें।
  • गैराज दर्ज करें।
  • खुला गैराज।
  • कार दर्ज करें।

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

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

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

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

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

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

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


1
धन्यवाद। यह देखने के लिए एक शानदार तरीका है।
एल-सैमुअल्स

5
मुझे आपका स्पष्टीकरण पसंद आया @Igno, लेकिन कुछ अभी भी मेरे लिए अस्पष्ट है। घोषणापत्र में, भले ही आप सिर्फ सामान बताते हैं , लेकिन फिर भी आपको सही आगे बढ़ने के लिए बिट्स को बदलने और मशीन में राज्यों में बदलाव करने की आवश्यकता है। यह मुझे भ्रमित करता है, कि किसी भी तरह घोषणात्मक प्रक्रियात्मक प्रोग्रामिंग (सी कार्यों की तरह) के समान है , और अभी भी आंतरिक रूप से उनके बीच एक बड़ा अंतर है। कार्यात्मक प्रोग्रामिंग (मशीन स्तर पर) में कार्य के रूप में ही सी कार्य नहीं है ?
फोनियाक्स

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

3
यह दूर से नहीं है कि मैं क्या कार्यात्मक प्रोग्रामिंग को समझता हूं। मैंने सोचा कि कार्यात्मक प्रोग्रामिंग कार्यों से छिपे इनपुट और आउटपुट को हटा दिया गया था।
रिंगो

7
सविस्तार स्पष्टीकरण।
जोएटाइड

14

अधिकांश आधुनिक भाषाएं अलग-अलग हैं, दोनों अनिवार्य और कार्यात्मक हैं, लेकिन कार्यात्मक प्रोग्रामिंग को बेहतर ढंग से समझने के लिए, यह जावा या ग # जैसी इतनी कार्यात्मक भाषा में अनिवार्य कोड के विपरीत हास्केल जैसी शुद्ध कार्यात्मक भाषा का उदाहरण लेने के लिए सबसे अच्छा होगा। मेरा मानना ​​है कि उदाहरण द्वारा समझाना हमेशा आसान होता है, इसलिए नीचे एक है।

फ़ंक्शनल प्रोग्रामिंग: एन के फैक्टोरियल की गणना करें! यानी nx (n-1) x (n-2) x ... x 2 X 1

-- | Haskell comment goes like
-- | below 2 lines is code to calculate factorial and 3rd is it's execution  

factorial 0 = 1
factorial n = n * factorial (n - 1)
factorial 3

-- | for brevity let's call factorial as f; And x => y shows order execution left to right
-- | above executes as := f(3) as 3 x f(2) => f(2) as 2 x f(1) => f(1) as 1 x f(0) => f(0) as 1  
-- | 3 x (2 x (1 x (1)) = 6

ध्यान दें कि हास्केल फ़ंक्शन को तर्क मूल्य के स्तर पर ओवरलोडिंग की अनुमति देता है। अब नीचे अनिवार्यता की बढ़ती डिग्री में अनिवार्य कोड का उदाहरण है:

//somewhat functional way
function factorial(n) {
  if(n < 1) {
     return 1;
  }
  return n * factorial(n-1);   
}
factorial(3);

//somewhat more imperative way
function imperativeFactor(n) {
  int f = 1
  for(int i = 1; i <= n; i++) {
     f = f * i
  }
  return f;
}

यह पढ़ने के लिए एक अच्छा संदर्भ हो सकता है कि यह समझने के लिए कि आवश्यक कोड कैसे भाग, मशीन की स्थिति (मैं लूप के लिए), निष्पादन के आदेश, प्रवाह नियंत्रण पर अधिक ध्यान केंद्रित करता है।

बाद के उदाहरण को java / c # lang कोड के रूप में मोटे तौर पर देखा जा सकता है और फंक्शन को मान (शून्य) से अधिक करने के लिए Haskell के विपरीत भाषा की सीमा के रूप में पहला हिस्सा है, और इसलिए यह कहा जा सकता है कि यह शुद्ध कार्यात्मक भाषा नहीं है, दूसरी तरफ हाथ आप कह सकते हैं कि यह कार्यात्मक सहारा का समर्थन करता है। कुछ हद तक।

प्रकटीकरण: उपरोक्त कोड में से कोई भी परीक्षण / निष्पादित नहीं किया गया है, लेकिन उम्मीद है कि अवधारणा को व्यक्त करने के लिए पर्याप्त अच्छा होना चाहिए; भी मैं इस तरह के किसी भी सुधार के लिए टिप्पणी की सराहना करेंगे :)


1
यह नहीं होना चाहिए return n * factorial(n-1);?
जिनावी

@jinawee, इशारा करने के लिए धन्यवाद, मैंने इसे ठीक किया हैn * (n-1)
पुराने-साधु

10

फंक्शनल प्रोग्रामिंग एक तरह से डिक्लेरेशन प्रोग्रामिंग है, जिसमें कम्प्यूटेशन के तर्क का वर्णन किया गया है और निष्पादन का क्रम पूरी तरह से डी-स्ट्रेस्ड है।

समस्या: मैं इस जीव को घोड़े से जिराफ में बदलना चाहता हूं।

  • लंबी गर्दन
  • लम्बे पैर
  • धब्बे लगायें
  • प्राणी को काली जीभ दे
  • घोड़े की पूंछ निकालें

प्रत्येक आइटम को किसी भी क्रम में उसी परिणाम का उत्पादन करने के लिए चलाया जा सकता है।

इंपीरियल प्रोग्रामिंग प्रक्रियात्मक है। राज्य और व्यवस्था महत्वपूर्ण है।

समस्या: मैं अपनी कार पार्क करना चाहता हूं।

  1. गेराज दरवाजे की प्रारंभिक स्थिति पर ध्यान दें
  2. ड्राइववे में कार रोकी
  3. यदि गेराज दरवाजा बंद है, तो गेराज दरवाजा खोलें, नया राज्य याद रखें; अन्यथा जारी रखें
  4. गैरेज में कार खींचो
  5. गेराज दरवाजा बंद करें

वांछित परिणाम प्राप्त करने के लिए प्रत्येक चरण किया जाना चाहिए। गेराज दरवाजा बंद होने पर गैरेज में खींचने से टूटे हुए गेराज दरवाजे का परिणाम होगा।


मुझे केवल async बनाम सिंक में अंतर दिखाई देता है।
व्लादिमीर वुकानैक

@VladimirVukanac async / सिंक एक तंत्र है, न कि प्रोग्रामिंग का एक रूप
जकब केलर

2
ओह, धन्यवाद, मैं इसके बारे में अधिक शोध करूंगा। क्या आप इतनी दयालु होंगे, समस्या 1 को अपडेट करने के लिए समस्या 2 जैसी ही होगी "मैं अपनी कार पार्क करना चाहता हूं" लेकिन कार्यात्मक प्रोग्रामिंग तरीके से लिखा गया है? फिर समानता को बाहर रखा जाएगा।
व्लादिमीर वुकानैक

6

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

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

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

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

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


3

2005 से 2013 तक सभी तरह से वेब विकास में इम्पीरेटिव प्रोग्रामिंग शैली का अभ्यास किया गया था।

अनिवार्य प्रोग्रामिंग के साथ, हमने कोड लिखा है जो हमारे आवेदन को ठीक से सूचीबद्ध करना चाहिए, चरण दर चरण।

कार्यात्मक प्रोग्रामिंग शैली संयोजन कार्यों के चतुर तरीकों के माध्यम से अमूर्तता पैदा करती है।

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

अब, ये त्वरित विवरण शायद बहुत मायने नहीं रखते हैं, इसलिए एक सादृश्य के माध्यम से चलने से अनिवार्य और घोषणात्मक प्रोग्रामिंग के बीच के अंतर से चलते हैं।

कल्पना कीजिए कि हम सॉफ्टवेयर का निर्माण नहीं कर रहे हैं, बल्कि इसके बजाय हम जीवित रहने के लिए पीक बनाते हैं। शायद हम बुरे बेकर हैं और स्वादिष्ट पाई को सेंकना नहीं जानते।

तो हमारा बॉस हमें एक दिशा-निर्देश देता है, जिसे हम एक नुस्खा के रूप में जानते हैं।

नुस्खा हमें बताएगा कि पाई कैसे बनाई जाए। एक नुस्खा इस तरह से एक अनिवार्य शैली में लिखा गया है:

  1. 1 कप मैदा मिलाएं
  2. 1 अंडा जोड़ें
  3. 1 कप चीनी डालें
  4. एक पैन में मिश्रण डालो
  5. पैन को 30 मिनट और 350 डिग्री एफ में ओवन में रखें।

घोषणात्मक नुस्खा निम्नलिखित करेगा:

1 कप आटा, 1 अंडा, 1 कप चीनी - प्रारंभिक अवस्था

नियम

  1. यदि सब कुछ मिश्रित है, तो पैन में रखें।
  2. अगर सब कुछ unmixed, कटोरा में जगह है।
  3. यदि पैन में सब कुछ है, तो ओवन में रखें।

इसलिए जरूरी एप्रोच स्टेप बाई स्टेप एप्रोच हैं। आप चरण एक से शुरू करते हैं और चरण 2 और इतने पर जाते हैं।

आप अंत में कुछ अंत उत्पाद के साथ समाप्त होते हैं। तो इस पाई को बनाते हुए, हम इन सामग्रियों को लेते हैं, उन्हें मिलाते हैं, इसे एक पैन और ओवन में डालते हैं और आपको अपना अंतिम उत्पाद मिल जाता है।

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

हम प्रारंभिक अवस्था या प्रारंभिक अवयव लेते हैं और उनके लिए कुछ नियम लागू करते हैं।

इसलिए हम प्रारंभिक अवस्था लेते हैं और उन्हें इन नियमों के माध्यम से बार-बार पास करते हैं जब तक कि हम एक प्रकार का फल स्ट्रॉबेरी पाई या जो भी खाने के लिए तैयार नहीं हो जाते।

इसलिए एक घोषणात्मक दृष्टिकोण में, हमें यह जानना होगा कि इन नियमों को ठीक से कैसे बनाया जाए।

इसलिए जिन नियमों को हम अपनी सामग्री या स्थिति की जांच करना चाहते हैं, अगर मिलाया जाए, तो उन्हें एक पैन में रखें।

हमारी प्रारंभिक स्थिति के साथ, यह मेल नहीं खाता क्योंकि हमने अभी तक अपनी सामग्री को मिलाया नहीं है।

इसलिए नियम 2 कहता है, यदि वे मिश्रित नहीं हैं, तो उन्हें एक कटोरे में मिलाएं। ठीक है हाँ यह नियम लागू होता है।

अब हमारे पास हमारे राज्य के रूप में मिश्रित सामग्री का एक कटोरा है।

अब हम उस नए राज्य को फिर से अपने नियमों पर लागू करते हैं।

इसलिए नियम 1 कहता है कि यदि सामग्री को पैन में मिलाया जाता है, तो ठीक है, अब नियम 1 लागू होता है, इसे करने दें।

अब हमारे पास यह नया राज्य है जहां सामग्री मिश्रित और एक पैन में है। नियम 1 अब प्रासंगिक नहीं है, नियम 2 लागू नहीं होता है।

नियम 3 कहता है कि यदि सामग्री एक पैन में है, तो उन्हें ओवन में रखें, महान वह नियम जो इस नए राज्य पर लागू होता है, इसे करने देता है।

और हम एक स्वादिष्ट गर्म सेब पाई या जो कुछ भी करते हैं, उसके साथ समाप्त होते हैं।

अब, यदि आप मेरे जैसे हैं, तो आप सोच रहे होंगे कि हम अभी भी अनिवार्य प्रोग्रामिंग क्यों नहीं कर रहे हैं। यह समझ में आता है।

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

एक घोषणात्मक दृष्टिकोण में, हमारे पास कुछ प्रारंभिक सामग्री या प्रारंभिक अवस्था हो सकती है textInput=“”, जैसे एकल चर।

शायद पाठ इनपुट एक खाली स्ट्रिंग के रूप में शुरू होता है।

हम इस प्रारंभिक स्थिति को लेते हैं और इसे आपके आवेदन में परिभाषित नियमों के एक सेट पर लागू करते हैं।

  1. यदि उपयोगकर्ता पाठ में प्रवेश करता है, तो पाठ इनपुट अपडेट करें। ठीक है, अभी जो लागू नहीं होता है।

  2. यदि टेम्पलेट प्रदान किया गया है, तो विजेट की गणना करें।

  3. यदि textInput अपडेट किया गया है, तो टेम्पलेट को फिर से प्रस्तुत करें।

ठीक है, इसमें से कोई भी लागू नहीं होता है इसलिए यह कार्यक्रम घटित होने वाली किसी घटना की प्रतीक्षा करेगा।

तो कुछ बिंदु पर एक उपयोगकर्ता पाठ इनपुट को अपडेट करता है और फिर हम नियम नंबर 1 को लागू कर सकते हैं।

हम इसे अद्यतन कर सकते हैं “abcd”

इसलिए हमने सिर्फ अपना टेक्स्ट और टेक्सट अपडेट अपडेट किया है, नियम नंबर 2 लागू नहीं होता है, नियम नंबर 3 कहता है कि यदि टेक्स्ट इनपुट अपडेट है, जो अभी हुआ है, तो टेम्पलेट को फिर से प्रस्तुत करें और फिर हम नियम 2 पर वापस जाएं। यदि टेम्पलेट रेंडर किया गया है , विजेट की गणना, ठीक विजेट की गणना करने देता है।

सामान्य तौर पर, प्रोग्रामर के रूप में, हम अधिक घोषणात्मक प्रोग्रामिंग डिजाइनों के लिए प्रयास करना चाहते हैं।

इम्पीरेटिव अधिक स्पष्ट और स्पष्ट लगता है, लेकिन एक घोषणात्मक दृष्टिकोण बड़े अनुप्रयोगों के लिए बहुत अच्छी तरह से मापता है।


2

• इम्पीरेटिव भाषाएँ:

  • कुशल निष्पादन

  • जटिल शब्दार्थ

  • जटिल वाक्य रचना

  • Concurrency डिज़ाइनर प्रोग्रामर है

  • जटिल परीक्षण, कोई संदर्भात्मक पारदर्शिता नहीं है, इसके दुष्प्रभाव हैं

  • राज्य है

• कार्यात्मक भाषाएँ:

  • सरल शब्दार्थ

  • सरल वाक्य रचना

  • कम कुशल निष्पादन

  • कार्यक्रमों को स्वचालित रूप से समवर्ती बनाया जा सकता है

  • सरल परीक्षण, में संदर्भात्मक पारदर्शिता है, इसका कोई दुष्प्रभाव नहीं है

  • कोई राज्य नहीं है

1

मुझे लगता है कि कार्यात्मक प्रोग्रामिंग को अनिवार्य रूप से व्यक्त करना संभव है:

  • वस्तुओं और if... else/ switchवक्तव्यों के बहुत सारे राज्य की जाँच का उपयोग करना
  • असिंकोनसनेस का ध्यान रखने के लिए कुछ समयबाह्य / प्रतीक्षा तंत्र

इस तरह के दृष्टिकोण के साथ भारी समस्याएं हैं:

  • नियम / प्रक्रियाएँ दोहराई जाती हैं
  • राज्यसुविधाएँ साइड-इफेक्ट्स / गलतियों की संभावना छोड़ती हैं

कार्यात्मक प्रोग्रामिंग, वस्तुओं के कार्यों / विधियों का इलाज करना और स्टेटलेसनेस को गले लगाना, उन समस्याओं को हल करने के लिए पैदा हुआ था जो मुझे विश्वास है।

Usages का उदाहरण: Android, iOS या वेब ऐप्स के लॉजिक्स incl जैसे फ्रंटएंड एप्लिकेशन। बैकएंड के साथ संचार।

अनिवार्य / प्रक्रियात्मक कोड के साथ कार्यात्मक प्रोग्रामिंग का अनुकरण करते समय अन्य चुनौतियां:

  • दौड़ की स्थिति
  • जटिल संयोजन और घटनाओं का क्रम। उदाहरण के लिए, उपयोगकर्ता बैंकिंग ऐप में पैसे भेजने की कोशिश करता है। चरण 1) निम्न में से सभी समानांतर में करें, केवल तभी आगे बढ़ें जब सब अच्छा हो तो) जांचें कि क्या उपयोगकर्ता अभी भी अच्छा है (धोखाधड़ी, एएमएल) ख) यदि उपयोगकर्ता के पास पर्याप्त बैलेंस है तो जांच लें कि क्या प्राप्तकर्ता वैध है और अच्छा है (धोखाधड़ी, एएमएल) आदि चरण 2) हस्तांतरण ऑपरेशन करते हैं चरण 3) उपयोगकर्ता के संतुलन और / या किसी प्रकार की ट्रैकिंग पर अपडेट दिखाएं। उदाहरण के लिए RxJava के साथ, कोड संक्षिप्त और समझदार है। इसके बिना, मैं सोच सकता हूं कि बहुत सारे कोड, गड़बड़ और त्रुटि प्रवण कोड होंगे

मेरा यह भी मानना ​​है कि दिन के अंत में, कार्यात्मक कोड को असेंबली या मशीन कोड में अनुवादित किया जाएगा जो संकलक द्वारा अनिवार्य / प्रक्रियात्मक है। हालाँकि, जब तक आप असेंबली नहीं लिखते हैं, जैसा कि मानव उच्च स्तरीय / मानव-पढ़ने योग्य भाषा के साथ कोड लिखते हैं, कार्यात्मक प्रोग्रामिंग सूचीबद्ध परिदृश्यों के लिए अभिव्यक्ति का अधिक उपयुक्त तरीका है


-1

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

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

उपाय: -

इम्पीरियल शैली द्वारा: =>

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

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

    1
    2
    3
    .
    .
    .
    n

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

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

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