उत्तर:
विकिपीडिया में आपके द्वारा पूछे गए कुछ उदाहरणों के साथ कार्यात्मक प्रोग्रामिंग पर एक शानदार लेख है । @ कोनराड रुडोल्फ ने पहले ही ओओपी लेख का लिंक प्रदान किया ।
मुझे नहीं लगता कि एक प्रतिमान दूसरे का एक सुपर-सेट है। वे प्रोग्रामिंग पर अलग-अलग दृष्टिकोण हैं और कुछ समस्याओं को एक परिप्रेक्ष्य से और कुछ दूसरे से बेहतर हल किया जाता है।
एफपी और ओओपी के सभी कार्यान्वयनों से आपका प्रश्न और अधिक जटिल है । प्रत्येक भाषा के अपने प्रश्न हैं जो आपके प्रश्न के किसी भी अच्छे उत्तर के लिए प्रासंगिक हैं।
तेजी से बढ़ती जुआ:
मुझे यह विचार पसंद है कि स्काला जैसी भाषा आपको दोनों दुनिया में सर्वश्रेष्ठ देने की कोशिश करती है। मुझे चिंता है कि यह आपको दोनों दुनिया की जटिलताओं के बारे में बताता है।
जावा एक ओओ भाषा है, लेकिन संस्करण 7 में एक "ट्राइ-विथ-रिसोर्सेज" फीचर जोड़ा गया है जिसका उपयोग एक तरह के क्लोजर की नकल करने के लिए किया जा सकता है। यहां यह एक अन्य फ़ंक्शन के बीच में एक स्थानीय चर "ए" को अपडेट करने की नकल करता है, यह उस फ़ंक्शन को दिखाई देने के बिना। इस स्थिति में अन्य फ़ंक्शन का पहला आधा क्लोजरट्री () कंस्ट्रक्टर है और दूसरा हाफ क्लोज () विधि है।
public class ClosureTry implements AutoCloseable {
public static void main(String[] args) {
int a = 1;
try(ClosureTry ct = new ClosureTry()) {
System.out.println("Middle Stuff...");
a = 2;
}
System.out.println("a: " + a);
}
public ClosureTry() {
System.out.println("Start Stuff Goes Here...");
}
/** Interface throws exception, but we don't have to. */
public void close() {
System.out.println("End Stuff Goes Here...");
}
}
आउटपुट:
Start Stuff Goes Here...
Middle Stuff...
End Stuff Goes Here...
a: 2
यह एक स्ट्रीम खोलने, स्ट्रीम को लिखने और इसे मज़बूती से बंद करने के अपने उद्देश्य के लिए उपयोगी हो सकता है, या बस दो कार्यों को इस तरह से बाँधने के लिए कि आप उनके बीच कुछ काम करने के बाद दूसरे को कॉल करना न भूलें । बेशक, यह इतना नया और असामान्य है कि एक और प्रोग्रामर कोशिश कर सकता है कि बिना यह एहसास किए कि वे कुछ तोड़ रहे हैं, इसलिए यह वर्तमान में एक तरह का एंटी-पैटर्न है, लेकिन दिलचस्प है कि यह किया जा सकता है।
आप एक पुनरावृत्ति के रूप में सबसे अनिवार्य भाषाओं में किसी भी लूप को व्यक्त कर सकते हैं। वस्तुओं और चरों को अपरिवर्तनीय बनाया जा सकता है। साइड इफेक्ट्स को कम करने के लिए संभावनाएं लिखी जा सकती हैं (हालांकि मैं यह तर्क दूंगा कि कंप्यूटर पर एक सच्चा कार्य संभव नहीं है - इसे निष्पादित करने में लगने वाला समय और प्रोसेसर / डिस्क / सिस्टम संसाधन जो इसका उपयोग करते हैं, वह अपरिहार्य साइड इफेक्ट्स हैं)। कुछ कार्यात्मक भाषाएं कई करने के लिए बनाई जा सकती हैं, यदि सभी ऑब्जेक्ट-ओरिएंटेड ऑपरेशन भी नहीं। उन्हें पारस्परिक रूप से अनन्य होने की आवश्यकता नहीं है, हालांकि कुछ भाषाओं की सीमाएं हैं (जैसे कि चर के किसी भी अद्यतन की अनुमति नहीं है) जो कुछ पैटर्न (जैसे परस्पर क्षेत्रों) को रोकती हैं।
मेरे लिए, ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के सबसे उपयोगी हिस्से डेटा हाइडिंग (एनकैप्सुलेशन) हैं, समान (पॉलीमॉर्फिज़्म) के समान-समान ऑब्जेक्ट्स का इलाज करते हैं, और आपके डेटा और विधियों को इकट्ठा करते हैं जो उस डेटा (ऑब्जेक्ट्स / क्लासेस) पर एक साथ काम करते हैं। वंशानुक्रम OOP का प्रमुख हो सकता है, लेकिन मेरे लिए यह सबसे कम महत्वपूर्ण और कम से कम इस्तेमाल किया जाने वाला हिस्सा है।
कार्यात्मक प्रोग्रामिंग के सबसे उपयोगी भाग अपरिवर्तनीयता (चर के बजाय टोकन / मूल्य), फ़ंक्शन (कोई साइड इफेक्ट नहीं), और बंद होते हैं।
मुझे नहीं लगता कि यह ऑब्जेक्ट-ओरिएंटेड है, लेकिन मुझे यह कहना है कि कंप्यूटर विज्ञान में सबसे उपयोगी चीजों में से एक इंटरफ़ेस घोषित करने की क्षमता है, फिर उस इंटरफ़ेस को कार्यक्षमता और डेटा के विभिन्न टुकड़े लागू होते हैं। मुझे काम करने के लिए डेटा के कुछ उत्परिवर्तनीय टुकड़े भी पसंद हैं, इसलिए मुझे लगता है कि मैं विशेष रूप से कार्यात्मक भाषाओं में पूरी तरह से सहज नहीं हूं, हालांकि मैं अपने सभी प्रोग्राम डिजाइनों में परिवर्तनशीलता और दुष्प्रभावों को सीमित करने की कोशिश करता हूं।