मैंने हास्केल जैसे कार्यात्मक भाषाओं का उपयोग करने के बारे में बहुत सारी बातें सुनी हैं। कार्यात्मक प्रोग्रामिंग बनाम वस्तु-उन्मुख प्रोग्रामिंग के बड़े अंतर, पेशेवरों और विपक्षों में से कुछ क्या हैं?
मैंने हास्केल जैसे कार्यात्मक भाषाओं का उपयोग करने के बारे में बहुत सारी बातें सुनी हैं। कार्यात्मक प्रोग्रामिंग बनाम वस्तु-उन्मुख प्रोग्रामिंग के बड़े अंतर, पेशेवरों और विपक्षों में से कुछ क्या हैं?
जवाबों:
मैं कहूंगा कि यह अधिक कार्यात्मक प्रोग्रामिंग बनाम इंपीरियल प्रोग्रामिंग है ।
सबसे बड़ा अंतर यह है कि इंपीरियल प्रोग्रामिंग नियंत्रण प्रवाह के बारे में है जबकि कार्यात्मक प्रोग्रामिंग डेटा प्रवाह के बारे में है । यह कहने का एक और तरीका यह है कि कार्यात्मक प्रोग्रामिंग केवल अभिव्यक्तियों का उपयोग करती है जबकि अनिवार्य प्रोग्रामिंग में अभिव्यक्ति और कथन दोनों का उपयोग किया जाता है।
उदाहरण के लिए, अपरिमेय प्रोग्रामिंग वेरिएबल्स और लूप्स राज्य को संभालते समय आम हैं, जबकि कार्यात्मक प्रोग्रामिंग में राज्य को पैरामीटर पासिंग के माध्यम से नियंत्रित किया जाता है, जो साइड-इफेक्ट्स और असाइनमेंट से बचा जाता है।
एक सूची के योग की गणना के लिए एक फ़ंक्शन के लिए इंपीरियल छद्म कोड (एक चर में योग रखा गया है):
int sumList(List<int> list) {
int sum = 0;
for(int n = 0; n < list.size(); n++) {
sum = sum + list.get(n);
}
return sum;
}
समान फ़ंक्शन के लिए कार्यात्मक छद्म कोड (योग एक पैरामीटर के रूप में पारित किया जाता है):
fun sumList([], sum) = sum
| sumList(v::lst, sum) = sumList(lst, v+sum)
मैं कार्यात्मक अवधारणाओं के अच्छे परिचय के लिए साइमन पेटन-जोन्स द्वारा कार्यात्मक प्रोग्रामिंग के साथ प्रस्तुति टैमिंग प्रभाव की सिफारिश करता हूं ।
कार्यात्मक प्रोग्रामिंग एक घोषणात्मक मॉडल पर आधारित है और इसकी जड़ें लैम्ब्डा कैलकुलस से हैं। यह बहुत सी बेहतरीन अवधारणाएँ प्रदान करता है जिन्हें C ++ और C # जैसी अधिक अनिवार्य भाषाओं से उधार लिया जा सकता है।
कुछ उदाहरणों में संदर्भित पारदर्शिता, लैम्ब्डा फ़ंक्शंस, प्रथम श्रेणी फ़ंक्शंस, आलसी और उत्सुक मूल्यांकन, और अपरिवर्तनीयता शामिल हैं।
यदि कार्यात्मक प्रोग्रामिंग सीखने के लिए और कुछ नहीं है, तो यह उन अवधारणाओं के लिए उपयोगी है जो इसमें शामिल हैं। यह आपके प्रोग्रामिंग करने के तरीके को बदल देगा और प्रोग्रामिंग के बारे में विचार करेगा। और मुझे लगता है कि भविष्य में कार्यात्मक प्रोग्रामिंग उतनी ही महत्वपूर्ण होगी जितनी ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग की गई है।
आरंभ करने के लिए आप एक शुद्ध कार्यात्मक भाषा जैसे हास्केल का उपयोग करने के लिए चुना जा सकता है, या आप F # की तरह एक संकर का उपयोग कर सकते हैं ।
अधिकांश अच्छे विश्वविद्यालय कार्यात्मक प्रोग्रामिंग को कवर करेंगे और अगर आप स्कूल जाते हैं तो मैं आपको अत्यधिक सुझाव दूंगा कि आप यह कोर्स करें।
कार्यात्मक प्रोग्रामिंग बनाम वस्तु-उन्मुख प्रोग्रामिंग के बड़े अंतर, पेशेवरों और विपक्षों में से कुछ क्या हैं?
अच्छी तरह से ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग अच्छा है क्योंकि यह आपको अपनी जटिल समस्या को पदानुक्रम में मॉडल करने की अनुमति देता है ताकि आप समस्या को सरल बना सकें। लेकिन यह बहुत कठिन हो जाता है जब आप उत्परिवर्तित वस्तुओं का उपयोग करते समय बहु थ्रेडेड प्रोग्रामिंग पर विचार करना शुरू करते हैं। ऐसे मामलों में आपको सिंक्रनाइज़ेशन ऑब्जेक्ट का भारी उपयोग करने की आवश्यकता होती है और यह एक बड़े एप्लिकेशन को पूर्ण करने के लिए असंभव है।
यहीं कार्यात्मक प्रोग्रामिंग आती है। अपरिवर्तनीय कार्यात्मक प्रोग्रामिंग जैसी चीजों के कारण वास्तव में बहु थ्रेडेड प्रोग्रामों को सरल बनाता है। जब आप जानते हैं कि किसी फ़ंक्शन को दिए गए इनपुट X को हमेशा आउटपुट दिया जाएगा, तो यह कुछ को समानांतर करना लगभग तुच्छ आसान बनाता है। आप यह भी जानते हैं कि एक चर (या कार्यात्मक प्रोग्रामिंग में मूल्य) दूसरे धागे से मध्य उपयोग को बदल नहीं सकता है।
(यह उत्तर StackOverflow पर एक बंद प्रश्न के उत्तर से अनुकूलित है ।)
कार्यात्मक प्रोग्रामिंग और ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के बीच एक बड़ा अंतर यह है कि प्रत्येक एक अलग तरह के सॉफ़्टवेयर विकास में बेहतर है:
आप के पास निर्धारित जब वस्तु उन्मुख भाषाओं अच्छे हैं संचालन पर बातें , और के रूप में अपने कोड विकसित होता है, आप मुख्य रूप से नई चीजों जोड़ें। यह नए वर्गों को जोड़कर पूरा किया जा सकता है जो मौजूदा तरीकों को लागू करते हैं, और मौजूदा कक्षाएं अकेले छोड़ दी जाती हैं।
जब आपके पास चीजों का एक निश्चित सेट होता है, तो कार्यात्मक भाषाएं अच्छी होती हैं , और जैसा कि आपका कोड विकसित होता है, आप मुख्य रूप से मौजूदा चीजों पर नए ऑपरेशन जोड़ते हैं। यह मौजूदा डेटा प्रकारों के साथ गणना करने वाले नए कार्यों को जोड़कर पूरा किया जा सकता है, और मौजूदा कार्यों को अकेला छोड़ दिया जाता है।
जब विकास गलत तरीके से होता है, तो आपको समस्याएं होती हैं:
ऑब्जेक्ट-ओरिएंटेड प्रोग्राम में एक नया ऑपरेशन जोड़ना एक नई विधि जोड़ने के लिए कई वर्ग परिभाषाओं को संपादित करने की आवश्यकता हो सकती है।
एक कार्यात्मक कार्यक्रम में एक नई तरह की चीज जोड़ना एक नए मामले को जोड़ने के लिए कई फ़ंक्शन परिभाषाओं को संपादित करने की आवश्यकता हो सकती है।
इस समस्या को कई वर्षों से अच्छी तरह से जाना जाता है; 1998 में, फिल वाडलर ने इसे "अभिव्यक्ति समस्या" करार दिया । हालांकि कुछ शोधकर्ताओं का मानना है कि अभिव्यक्ति की समस्या को मिक्सिन जैसी भाषा सुविधाओं के साथ संबोधित किया जा सकता है, लेकिन व्यापक रूप से स्वीकार किए जाने वाले समाधान की मुख्यधारा में आने के लिए अभी तक कोई समाधान नहीं है।
कोई वास्तविक बनाम नहीं है। वे पूरी तरह से पूरक हो सकते हैं। एफपी भाषाएं हैं, जो ओओपी का समर्थन करती हैं। लेकिन समुदाय अलग-अलग तरीके से अलग-अलग तरीके से संभालते हैं।
एफपी भाषाओं के उपयोगकर्ता गणितीय कानूनों के माध्यम से प्रतिरूपकता प्राप्त करते हैं। और अपने कानूनों के अनुपालन को दिखाने के लिए प्रमाण देना पसंद करते हैं।
अत्यावश्यक OOP में उपयोगकर्ता परीक्षण-मामलों में वस्तु के व्यवहार को पकड़ते हैं, जो कि वस्तु को इस तरह से रूपांतरकता में बदल देने और प्राप्त करने पर फिर से हो सकता है।
यह सिर्फ एक छोटा सा पहलू है, लेकिन मुझे लगता है कि यह ध्यान देने योग्य है।
एक सादृश्य:
आपको नौकरी का आवेदन सौंपा गया है। आप अपना नाम, संपर्क जानकारी और कार्य इतिहास भरें। जब आप समाप्त कर लेते हैं तो आपके पास कोई रिक्त एप्लिकेशन नहीं होता है।
अब इसके बजाय कल्पना करें कि लिखने से पहले आप इसे सिलोफ़न की एक स्पष्ट शीट के साथ ओवरले करें। आप अपना नाम लिखिए। आप सिलोफ़न की एक और शीट जोड़ते हैं। आप अपनी संपर्क जानकारी लिखें। अधिक सिलोफ़न। आप अपना कार्य इतिहास लिखें। जब आप समाप्त कर लेते हैं, तब भी आपके पास रिक्त आवेदन अछूता रहता है। आपके पास सिलोफ़न की तीन शीट भी हैं जिनमें से प्रत्येक ने एकल, असतत परिवर्तन के प्रभाव पर कब्जा कर लिया है।
पूर्व (ओओपी) चीजों को बदलने के विचार को गले लगाता है जबकि बाद वाला (एफपी) इसे दूर कर देता है। दोनों राज्य प्रबंधन प्रतिमान हैं। दोनों, विभिन्न रणनीतियों का उपयोग करके, नौकरी आवेदन को पूरा करने के प्रभाव को पकड़ सकते हैं। ओओपी सीधे शुरुआती साधन को बदल देता है, जबकि एफपी ओवरले करता है जो परिवर्तन की उपस्थिति को प्रभावित करने से पहले आया था ।