जावास्क्रिप्ट में कार्यात्मक प्रोग्रामिंग का परिचय
कार्यात्मक प्रोग्रामिंग (FP) एक प्रोग्रामिंग प्रतिमान है जिसमें गणनाओं को गणितीय कार्यों के अनुप्रयोग के रूप में देखा जाता है। अनिवार्य दृष्टिकोण के विपरीत, जहां हम प्रोग्राम की स्थिति को बदलने वाले निर्देशों का एक क्रम लिखते हैं, कार्यात्मक शैली इस बात पर ध्यान केंद्रित करती है कि क्या गणना करने की आवश्यकता है, न कि कैसे यह करना है।
जावास्क्रिप्ट, एक बहु-प्रतिमान भाषा होने के नाते, कार्यात्मक प्रोग्रामिंग के लिए पूरी तरह उपयुक्त है। Node.js वातावरण में, यह दृष्टिकोण डेटा प्रोसेसिंग, स्ट्रीम के साथ काम करने और विश्वसनीय सर्वर-साइड एप्लिकेशन बनाने में विशेष रूप से उपयोगी है। इस लेख में, हम व्यावहारिक उदाहरणों के साथ FP की प्रमुख अवधारणाओं का विश्लेषण करेंगे।
कार्यात्मक प्रोग्रामिंग के मूल सिद्धांत
शुद्ध फ़ंक्शन (Pure Functions)
शुद्ध फ़ंक्शन वह फ़ंक्शन है जो:
- समान तर्कों के लिए हमेशा एक ही परिणाम लौटाता है (नियतिवाद)।
- इसका कोई दुष्प्रभाव नहीं होता (बाहरी चर नहीं बदलता, कंसोल पर आउटपुट नहीं देता, फ़ाइलों में नहीं लिखता)।
// शुद्ध फ़ंक्शनconst add = (a, b) => a + b;
// अशुद्ध फ़ंक्शन (दुष्प्रभाव - कंसोल पर आउटपुट)const impureAdd = (a, b) => { console.log(`${a} और ${b} को जोड़ रहे हैं`); return a + b;};
// अशुद्ध फ़ंक्शन (बाहरी स्थिति पर निर्भर)let counter = 0;const increment = () => ++counter;शुद्ध फ़ंक्शन के लाभ: इनका परीक्षण, डिबगिंग और समानांतरीकरण आसान है। ये पूर्वानुमानित होते हैं और निष्पादन संदर्भ पर निर्भर नहीं होते।
इम्यूटेबिलिटी (Immutability)
इम्यूटेबिलिटी का अर्थ है कि डेटा बनने के बाद उसे बदला नहीं जाता। मौजूदा ऑब्जेक्ट को बदलने के बजाय, हम आवश्यक परिवर्तनों के साथ उसकी एक नई प्रतिलिपि बनाते हैं।
// म्यूटेबल दृष्टिकोण (खराब)const user = { name: 'इवान', age: 30 };user.age = 31; // सीधे बदल रहे हैं
// इम्यूटेबल दृष्टिकोण (अच्छा)const user2 = { name: 'मारिया', age: 25 };const updatedUser = { ...user2, age: 26 };// मूल ऑब्जेक्ट user2 अपरिवर्तित रहा
// ऐरे के साथ काम करनाconst numbers = [1, 2, 3];const newNumbers = [...numbers, 4]; // [1, 2, 3, 4]// numbers [1, 2, 3] ही रहाNode.js में, एसिंक्रोनस कोड में अप्रत्याशित म्यूटेशन से बचने के लिए अनुरोधों और एप्लिकेशन स्थिति के साथ काम करते समय इम्यूटेबिलिटी विशेष रूप से महत्वपूर्ण है।
उच्च-क्रम फ़ंक्शन और क्लोजर
उच्च-क्रम फ़ंक्शन (Higher-Order Functions)
ये ऐसे फ़ंक्शन हैं जो अन्य फ़ंक्शन को तर्क के रूप में लेते हैं या उन्हें लौटाते हैं। ऐरे के अंतर्निहित तरीके map, filter, reduce इसके उत्कृष्ट उदाहरण हैं।
const numbers = [1, 2, 3, 4, 5];
// map - प्रत्येक तत्व को रूपांतरित करता हैconst doubled = numbers.map(n => n * 2);// [2, 4, 6, 8, 10]
// filter - शर्त के अनुसार तत्वों को रखता हैconst evens = numbers.filter(n => n % 2 === 0);// [2, 4]
// reduce - ऐरे को एक मान में समेटता हैconst sum = numbers.reduce((acc, n) => acc + n, 0);// 15क्लोजर (Closures)
क्लोजर एक ऐसा फ़ंक्शन है जो उस स्कोप के वेरिएबल को "याद" रखता है जिसमें इसे बनाया गया था, भले ही वह स्कोप निष्पादित हो चुका हो।
const createCounter = () => { let count = 0; // निजी वेरिएबल return () => ++count;};
const counter1 = createCounter();console.log(counter1()); // 1console.log(counter1()); // 2
const counter2 = createCounter();console.log(counter2()); // 1 (स्वतंत्र काउंटर)क्लोजर का व्यापक रूप से फ़ंक्शन फ़ैक्टरी बनाने और कार्यात्मक शैली में स्थिति को एनकैप्सुलेट करने के लिए उपयोग किया जाता है।
करीइंग और फ़ंक्शन कंपोज़िशन
करीइंग (Currying)
करीइंग एक ऐसे फ़ंक्शन का रूपांतरण है जो कई तर्क लेता है, फ़ंक्शन के अनुक्रम में, जिनमें से प्रत्येक