एक ही सिक्के के दो पहलू: JavaScript में फंक्शनल बनाम ऑब्जेक्ट-ओरिएंटेड दृष्टिकोण
\n\nयदि आपने कभी सोचा है कि क्यों कुछ डेवलपर्स ऐसा कोड लिखते हैं जो गणितीय सूत्र जैसा दिखता है, जबकि अन्य इसे IKEA फर्नीचर असेंबली निर्देशों की तरह लिखते हैं, तो आप एक शाश्वत बहस पर आ गए हैं: JavaScript में फंक्शनल प्रोग्रामिंग (FP) बनाम ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP)।
\n\nJavaScript एक अनोखी भाषा है। इसका जन्म बटनों के लिए एक स्क्रिप्टिंग भाषा के रूप में हुआ था, लेकिन यह एक ऐसे राक्षस में विकसित हुई जो सब कुछ कर सकता है। यह मल्टी-पैराडाइम है: आप इसमें प्रोसीजरल, OOP या फंक्शनल शैली में लिख सकते हैं। और यहीं से सबसे दिलचस्प शुरुआत होती है। एक नौसिखिया को कौन सा दृष्टिकोण चुनना चाहिए? और एक अनुभवी डेवलपर को? आइए बिना कट्टरता के, वास्तविक उदाहरणों के साथ समझते हैं।
\n\nमुख्य बात संक्षेप में: क्या क्या है?
\n\nऑब्जेक्ट-ओरिएंटेड दृष्टिकोण (OOP) "संस्थाओं" के बारे में है। आपके पास ऑब्जेक्ट हैं (बिल्ली, कार, उपयोगकर्ता), उनके पास गुण हैं (रंग, गति, नाम) और विधियाँ हैं (म्याऊं करना, चलना, लॉगिन करना)। आप डेटा और व्यवहार को एक साथ समूहित करते हैं। क्लासिक: class Car { drive() {} }।
फंक्शनल दृष्टिकोण (FP) "क्रियाओं" के बारे में है। डेटा और फंक्शन अलग-अलग होते हैं। फंक्शन शुद्ध ट्रांसफॉर्मर हैं: इनपुट पर कुछ डेटा, आउटपुट पर कुछ और, बिना किसी साइड इफेक्ट के। कोई this, म्यूटेशन या छिपी हुई स्थिति नहीं।
विडंबना यह है कि JavaScript "बॉक्स से बाहर" किसी के लिए भी आदर्श नहीं है, लेकिन यह दोनों शैलियों को खूबसूरती से उपयोग करने की अनुमति देता है। सवाल सिर्फ इतना है कि कब किसे लागू करना है।
\n\nJavaScript में OOP: प्रोटोटाइप से ES6 क्लासेस तक
\n\nबहुत पहले, IE6 के युग में, JS में OOP डरावना लगता था। सब कुछ प्रोटोटाइप पर आधारित था - एक ऐसा तंत्र जिसमें ऑब्जेक्ट अन्य ऑब्जेक्ट्स से गुण प्राप्त करते हैं। यह शक्तिशाली था, लेकिन सहज नहीं था।
\n\nES6 (ES2015) के आगमन के साथ, भाषा में सिंटैक्टिक शुगर जोड़ा गया - class। लेकिन यह समझना महत्वपूर्ण है: हुड के नीचे ये वही प्रोटोटाइप हैं। क्लासेस ने Java या C++ से आने वालों के लिए कोड को साफ और अधिक समझने योग्य बना दिया।
OOP उदाहरण: क्लास "उपयोगकर्ता"
\n\nclass User {\n constructor(name, email) {\n this.name = name;\n this.email = email;\n this.loggedIn = false;\n }\n\n login() {\n this.loggedIn = true;\n return `${this.name} सिस्टम में लॉग इन हुआ`;\n }\n\n logout() {\n this.loggedIn = false;\n return `${this.name} बाहर निकला`;\n }\n}\n\nconst admin = new User('अन्ना', 'anna@example.com');\nconsole.log(admin.login()); // अन्ना सिस्टम में लॉग इन हुआ\n\n\nसब कुछ तार्किक है: डेटा (name, email) विधियों (login, logout) के साथ रहता है। ऑब्जेक्ट की स्थिति उसी की विधियों के माध्यम से बदलती है। यह क्लासिक एनकैप्सुलेशन है।
JS में OOP की समस्याएँ
\n- \n
thisका संदर्भ। संदर्भ का खो जाना नौसिखियों का अभिशाप है। यदि किसी विधि को callback के रूप में पास किया जाता है, तोthis"टूट" जाता है।.bind(), एरो फंक्शन या क्लोज़र का उपयोग करना पड़ता है। \n - इनहेरिटेंस। गहरी क्लास पदानुक्रम ("डायमंड प्रॉब्लम") भ्रम पैदा करती है। अक्सर कंपोज़िशन (mixins) इनहेरिटेंस से बेहतर होता है। \n
- अवस्था। म्यूटेटिंग स्टेट (जब हम ऑब्जेक्ट के गुण बदलते हैं) बड़े प्रोजेक्ट्स में बग का मुख्य स्रोत है। एक विधि गलती से वह बदल सकती है जो उसे नहीं बदलना चाहिए। \n
फंक्शनल दृष्टिकोण: शुद्धता और पूर्वानुमेयता
\n\nफंक्शनल प्रोग्रामर OOP को हल्की मुस्कान के साथ देखते हैं। उनका आदर्श वाक्य: "डेटा डेटा है, फंक्शन फंक्शन हैं। उन्हें एक साथ न मिलाएं।"
\n\nJavaScript में फंक्शनल प्रोग्रामिंग की मुख्य अवधारणाएँ:
\n- \n
- शुद्ध फंक्शन - परिणाम केवल तर्कों पर निर्भर करता है, कोई साइड इफेक्ट नहीं। \n
- अपरिवर्तनीयता (Immutability) - आप डेटा नहीं बदलते, आप उसकी नई प्रतियाँ बनाते हैं। \n
ब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें
Swift में कतारें और बैकग्राउंड टास्क: कोड जो लैग न करे
C++ में std::string को कैसे ट्रिम करें: शुरुआती और विशेषज्ञों के लिए 5 कार्यशील तरीके
Kotlin के साथ GraphQL API: चरण-दर-चरण ट्यूटोरियल
C++ में फ़ाइल सिस्टम के साथ काम करना: शुरुआती लोगों के लिए पूर्ण गाइड
वेब डेवलपमेंट के लिए शीर्ष 10 PHP फ्रेमवर्क: A से Z तक