OOP में एब्स्ट्रैक्शन (Abstraction): जटिलता को छिपाना
आप पेडल दबाकर और स्टीयरिंग घुमाकर कार चलाते हैं। आपको फ्यूल इंजेक्शन या पिस्टन की गति को समझने की आवश्यकता नहीं है। कार इन विवरणों को आपसे छिपा देती है। आप केवल एक सरल इंटरफ़ेस का उपयोग करते हैं।
सॉफ्टवेयर भी इसी तरह काम करता है।
ईमेल भेजने के बारे में सोचें। आपका कोड संभवतः ऐसा दिखता है:
emailService.send(email);
यह सरल दिखता है। पर्दे के पीछे, सिस्टम कई कार्य करता है:
- एड्रेस को वैलिडेट (validate) करता है।
- SMTP सर्वर से कनेक्ट करता है।
- यूजर को ऑथेंटिकेट (authenticate) करता है।
- मैसेज तैयार करता है।
- रिट्राइज़ (retries) को हैंडल करता है।
- एरर्स को लॉग (log) करता है।
आपको इन चरणों को देखने की आवश्यकता नहीं है। आपको केवल इस बात से मतलब है कि ईमेल चला जाए।
यदि आप हर चरण को उजागर करते हैं, तो आप समस्याएँ पैदा करते हैं। कल्पना कीजिए कि यदि प्रत्येक डेवलपर को मैन्युअल रूप से कॉल करना पड़े:
connect()authenticate()buildMessage()sendMessage()disconnect()
यह आपके कोड को नाजुक (fragile) बना देता है। यदि आप अपना ईमेल प्रदाता बदलते हैं, तो आपको अपने ऐप में हर एक जगह अपडेट करना होगा। आपका कोड इम्प्लीमेंटेशन (implementation) के साथ मजबूती से जुड़ (tightly coupled) जाता है।
एब्स्ट्रैक्शन इसे हल करता है।
एब्स्ट्रैक्शन यह दर्शाता है कि एक ऑब्जेक्ट क्या करता है। यह यह छिपा देता है कि वह इसे कैसे करता है। आप यूजर को केवल वही दिखाते हैं जिसकी उन्हें आवश्यकता है।
यूजर एक स्थिर इंटरफ़ेस के साथ इंटरैक्ट करता है। उन्हें आपके ऑथेंटिकेशन लॉजिक या आपकी रिट्राइ स्ट्रैटेजी से कोई फर्क नहीं पड़ता। वे विवरण छिपे रहते हैं।
कई लोग एब्स्ट्रैक्शन को एनकैप्सुलेशन (Encapsulation) के साथ भ्रमित कर देते हैं। यहाँ अंतर दिया गया है:
एनकैप्सुलेशन पूछता है: इस ऑब्जेक्ट की स्थिति (state) को कौन बदल सकता है? यह डेटा की रक्षा करता है।
एब्स्ट्रैक्शन पूछता है: यूजर को कौन से विवरण देखने चाहिए? यह जटिलता को छिपाता है।
वे बेहतर सिस्टम बनाने के लिए मिलकर काम करते हैं।
आगे, हम इनहेरिटेंस (Inheritance) पर चर्चा करेंगे। हम देखेंगे कि एक ही कोड को दो बार लिखे बिना साझा व्यवहार (shared behavior) को कैसे संभालें।