C# में कार्यात्मक प्रोग्रामिंग: विकास के लिए एक आधुनिक दृष्टिकोण
कार्यात्मक प्रोग्रामिंग (FP) एक प्रतिमान है जिसमें गणनाओं को गणितीय कार्यों की गणना के रूप में माना जाता है और स्थिति में बदलाव और परिवर्तनीय डेटा से बचा जाता है। हालाँकि C# मूल रूप से एक ऑब्जेक्ट-ओरिएंटेड भाषा के रूप में बनाया गया था, संस्करण 3.0 से इसने सक्रिय रूप से कार्यात्मक दृष्टिकोण के तत्वों को शामिल करना शुरू कर दिया। आज, C# में कार्यात्मक प्रोग्रामिंग सिर्फ एक फैशनेबल चलन नहीं है, बल्कि अधिक पूर्वानुमानित, परीक्षण योग्य और समानांतर-सुरक्षित कोड लिखने के लिए एक शक्तिशाली उपकरण है।
इस लेख में, हम C# पर लागू FP की प्रमुख अवधारणाओं पर चर्चा करेंगे: शुद्ध फ़ंक्शन, डेटा अपरिवर्तनीयता, LINQ, क्लोज़र और लैम्ब्डा एक्सप्रेशन। आप देखेंगे कि कैसे ये तकनीकें .NET इकोसिस्टम में संक्षिप्त और विश्वसनीय कोड लिखने में मदद करती हैं।
1. शुद्ध फ़ंक्शन और साइड इफेक्ट्स का अभाव
शुद्ध फ़ंक्शन वह फ़ंक्शन है जो:
- समान तर्कों के लिए हमेशा एक ही परिणाम लौटाता है (रेफरेंशियल ट्रांसपेरेंसी)।
- इसका कोई साइड इफेक्ट नहीं होता (ग्लोबल वेरिएबल नहीं बदलता, इनपुट/आउटपुट नहीं करता, पास किए गए तर्कों को नहीं बदलता)।
C# में, एक शुद्ध फ़ंक्शन इस तरह दिख सकता है:
// शुद्ध फ़ंक्शनpublic int AddPure(int a, int b){ return a + b;}
// शुद्ध फ़ंक्शन नहीं (साइड इफेक्ट — कंसोल पर आउटपुट और ग्लोबल वेरिएबल में बदलाव)private int _state = 0;public int AddImpure(int a, int b){ _state++; Console.WriteLine("फ़ंक्शन कॉल"); return a + b + _state;}शुद्ध फ़ंक्शन के लाभ स्पष्ट हैं: उनका परीक्षण करना आसान है, वे पूर्वानुमानित होते हैं, और उन्हें समानांतर थ्रेड्स से सुरक्षित रूप से कॉल किया जा सकता है। I/O से संबंधित नहीं होने वाले सभी तर्क को शुद्ध फ़ंक्शन में रखने का प्रयास करें।
2. डेटा अपरिवर्तनीयता (Immutability)
कार्यात्मक प्रोग्रामिंग अपरिवर्तनीय डेटा के साथ काम करने को प्रोत्साहित करती है। किसी मौजूदा ऑब्जेक्ट को संशोधित करने के बजाय, आप बदले हुए गुणों वाला एक नया ऑब्जेक्ट बनाते हैं। C# में, इसके लिए ये बहुत उपयुक्त हैं:
- record (C# 9 से) — वैल्यू-बेस्ड समानता और डिफ़ॉल्ट रूप से अपरिवर्तनीयता वाला रेफरेंस टाइप।
- struct — छोटी अपरिवर्तनीय संरचनाओं के लिए (जैसे, निर्देशांक, पैसा)।
- IEnumerable<T> — LINQ के माध्यम से अपरिवर्तनीय कलेक्शन के लिए।
record के साथ उदाहरण:
public record Person(string Name, int Age);
// with-एक्सप्रेशन का उपयोग करके बदलावों के साथ कॉपी बनानाvar original = new Person("एलेक्सी", 30);var updated = original with { Age = 31 };
Console.WriteLine(original); // Person { Name = एलेक्सी, Age = 30 }Console.WriteLine(updated); // Person { Name = एलेक्सी, Age = 31 }यह दृष्टिकोण एक स्थान पर डेटा में आकस्मिक बदलाव को रोकता है जो प्रोग्राम के अन्य भागों को प्रभावित करता है।
3. LINQ — डेटा के लिए कार्यात्मक क्वेरी
LINQ (Language Integrated Query) शायद C# में कार्यात्मक दृष्टिकोण का सबसे प्रमुख उदाहरण है। यह मेथड चेन का उपयोग करके घोषणात्मक शैली में कलेक्शन को प्रोसेस करने की अनुमति देता है।
प्रमुख कार्यात्मक LINQ मेथड:
Select— प्रत्येक तत्व का रूपांतरण (map के समान)।Where— फ़िल्टरिंग (filter के समान)।Aggregate— फोल्डिंग (reduce के समान)।SelectMany— नेस्टेड कलेक्शन को फैलाना (flatMap)।
उदाहरण: सम संख्याओं के वर्गों का योग ज्ञात करना।
int[] numbers = { 1, 2, 3, 4, 5, 6 };
// इम्पेरेटिव शैलीint sumImperative = 0;foreach (var num in numbers){ if (num % 2 == 0) { sumImperative += num * num; }}
// LINQ के साथ कार्यात्मक शैलीint sumFunctional = numbers .Where(n => n % 2 == 0) // फ़िल्टरिंग .Select(n => n * n) // रूपांतरण .Sum(); // एग्रीगेशन
C
```