फंक्शनल बनाम OOP in JS: 2024 में क्या चुनें?

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

एक ही सिक्के के दो पहलू: JavaScript में फंक्शनल बनाम ऑब्जेक्ट-ओरिएंटेड दृष्टिकोण

\n\n

यदि आपने कभी सोचा है कि क्यों कुछ डेवलपर्स ऐसा कोड लिखते हैं जो गणितीय सूत्र जैसा दिखता है, जबकि अन्य इसे IKEA फर्नीचर असेंबली निर्देशों की तरह लिखते हैं, तो आप एक शाश्वत बहस पर आ गए हैं: JavaScript में फंक्शनल प्रोग्रामिंग (FP) बनाम ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP)।

\n\n

JavaScript एक अनोखी भाषा है। इसका जन्म बटनों के लिए एक स्क्रिप्टिंग भाषा के रूप में हुआ था, लेकिन यह एक ऐसे राक्षस में विकसित हुई जो सब कुछ कर सकता है। यह मल्टी-पैराडाइम है: आप इसमें प्रोसीजरल, OOP या फंक्शनल शैली में लिख सकते हैं। और यहीं से सबसे दिलचस्प शुरुआत होती है। एक नौसिखिया को कौन सा दृष्टिकोण चुनना चाहिए? और एक अनुभवी डेवलपर को? आइए बिना कट्टरता के, वास्तविक उदाहरणों के साथ समझते हैं।

\n\n

मुख्य बात संक्षेप में: क्या क्या है?

\n\n

ऑब्जेक्ट-ओरिएंटेड दृष्टिकोण (OOP) "संस्थाओं" के बारे में है। आपके पास ऑब्जेक्ट हैं (बिल्ली, कार, उपयोगकर्ता), उनके पास गुण हैं (रंग, गति, नाम) और विधियाँ हैं (म्याऊं करना, चलना, लॉगिन करना)। आप डेटा और व्यवहार को एक साथ समूहित करते हैं। क्लासिक: class Car { drive() {} }।

\n\n

फंक्शनल दृष्टिकोण (FP) "क्रियाओं" के बारे में है। डेटा और फंक्शन अलग-अलग होते हैं। फंक्शन शुद्ध ट्रांसफॉर्मर हैं: इनपुट पर कुछ डेटा, आउटपुट पर कुछ और, बिना किसी साइड इफेक्ट के। कोई this, म्यूटेशन या छिपी हुई स्थिति नहीं।

\n\n

विडंबना यह है कि JavaScript "बॉक्स से बाहर" किसी के लिए भी आदर्श नहीं है, लेकिन यह दोनों शैलियों को खूबसूरती से उपयोग करने की अनुमति देता है। सवाल सिर्फ इतना है कि कब किसे लागू करना है।

\n\n

JavaScript में OOP: प्रोटोटाइप से ES6 क्लासेस तक

\n\n

बहुत पहले, IE6 के युग में, JS में OOP डरावना लगता था। सब कुछ प्रोटोटाइप पर आधारित था - एक ऐसा तंत्र जिसमें ऑब्जेक्ट अन्य ऑब्जेक्ट्स से गुण प्राप्त करते हैं। यह शक्तिशाली था, लेकिन सहज नहीं था।

\n\n

ES6 (ES2015) के आगमन के साथ, भाषा में सिंटैक्टिक शुगर जोड़ा गया - class। लेकिन यह समझना महत्वपूर्ण है: हुड के नीचे ये वही प्रोटोटाइप हैं। क्लासेस ने Java या C++ से आने वालों के लिए कोड को साफ और अधिक समझने योग्य बना दिया।

\n\n

OOP उदाहरण: क्लास "उपयोगकर्ता"

\n\n
class 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) के साथ रहता है। ऑब्जेक्ट की स्थिति उसी की विधियों के माध्यम से बदलती है। यह क्लासिक एनकैप्सुलेशन है।

\n\n

JS में OOP की समस्याएँ

\n
    \n
  • this का संदर्भ। संदर्भ का खो जाना नौसिखियों का अभिशाप है। यदि किसी विधि को callback के रूप में पास किया जाता है, तो this "टूट" जाता है। .bind(), एरो फंक्शन या क्लोज़र का उपयोग करना पड़ता है।
  • \n
  • इनहेरिटेंस। गहरी क्लास पदानुक्रम ("डायमंड प्रॉब्लम") भ्रम पैदा करती है। अक्सर कंपोज़िशन (mixins) इनहेरिटेंस से बेहतर होता है।
  • \n
  • अवस्था। म्यूटेटिंग स्टेट (जब हम ऑब्जेक्ट के गुण बदलते हैं) बड़े प्रोजेक्ट्स में बग का मुख्य स्रोत है। एक विधि गलती से वह बदल सकती है जो उसे नहीं बदलना चाहिए।
  • \n
\n\n

फंक्शनल दृष्टिकोण: शुद्धता और पूर्वानुमेयता

\n\n

फंक्शनल प्रोग्रामर OOP को हल्की मुस्कान के साथ देखते हैं। उनका आदर्श वाक्य: "डेटा डेटा है, फंक्शन फंक्शन हैं। उन्हें एक साथ न मिलाएं।"

\n\n

JavaScript में फंक्शनल प्रोग्रामिंग की मुख्य अवधारणाएँ:

\n