एनकैप्सुलेशन (कंप्यूटर प्रोग्रामिंग)

सॉफ्टवेयर प्रणाली में, एनकैप्सुलेशन डेटा के बंडलिंग को उन तंत्रों या विधियों के साथ संदर्भित करता है जो डेटा पर काम करते हैं। यह उस डेटा में से कुछ तक सीधी पहुंच को सीमित करने का भी उल्लेख कर सकता है, जैसे किसी वस्तु के घटक। एनकैप्सुलेशन डेवलपर्स को सुसंगत और प्रयोग करने योग्य इंटरफ़ेस प्रस्तुत करने की अनुमति देता है जो इस बात से स्वतंत्र है कि प्रणाली को आंतरिक रूप से कैसे प्रायुक्त किया जाता है। उदाहरण के रूप में, एनकैप्सुलेशन (कंप्यूटर प्रोग्रामिंग) का उपयोग एक वर्ग के अंदर एक संरचित डेटा वस्तु के मानों या स्थिति को छिपाने के लिए किया जा सकता है, जिससे ग्राहकों द्वारा उन तक सीधी पहुंच को रोका जा सकता है जो छिपे हुए कार्यान्वयन विवरणों को उजागर कर सकता है या विधियों द्वारा बनाए गए अवस्था के परिवर्तन का उल्लंघन कर सकता है।

सभी वस्तु ओरिएंटेड प्रोग्रामिंग (OOP) प्रणाली एनकैप्सुलेशन का समर्थन करते हैं, किन्तु एनकैप्सुलेशन OOP के लिए अद्वितीय नहीं है। अमूर्त डेटा प्रकारों, मॉड्यूल (प्रोग्रामिंग), और पुस्तकालय (कंप्यूटिंग) के कार्यान्वयन, अन्य प्रणालियों के बीच, एनकैप्सुलेशन भी प्रदान करते हैं। प्रोग्रामिंग भाषा सिद्धांतकारों द्वारा समानता को अस्तित्वगत प्रकारों के संदर्भ में समझाया गया है।

अर्थ
वस्तु-उन्मुख प्रोग्रामिंग भाषाओं और अन्य संबंधित क्षेत्रों में, एनकैप्सुलेशन दो संबंधित किन्तु अलग-अलग धारणाओं में से को संदर्भित करता है, और कभी-कभी इसके संयोजन को संदर्भित करता है: कुछ प्रोग्रामिंग भाषा के शोधकर्ता और शिक्षाविद पहले अर्थ का एकल या एक दूसरे के साथ संयोजन में वस्तु-ओरिएंटेड प्रोग्रामिंग की विशिष्ट विशेषता के रूप में उपयोग करते हैं, चूँकि कुछ प्रोग्रामिंग भाषा जो क्लोजर (कंप्यूटर प्रोग्रामिंग) प्रदान करती हैं, वे एनकैप्सुलेशन को भाषा ओर्थोगोनल से वस्तु ओरिएंटेशन की विशेषता के रूप में देखती हैं।
 * कुछ वस्तु (कंप्यूटर विज्ञान) के घटकों तक सीधी पहुंच को प्रतिबंधित करने के लिए भाषा तंत्र का उपयोग करता हैं।
 * भाषा निर्माण जो उन डेटा पर काम करने वाली विधियों (कंप्यूटर प्रोग्रामिंग) (या अन्य कार्यों) के साथ डेटा के बंडल की सुविधा प्रदान करता है।।

दूसरी परिभाषा इस तथ्य से प्रेरित है कि कई वस्तु-उन्मुख भाषाओं और अन्य संबंधित क्षेत्रों में, घटक स्वचालित रूप से छिपे नहीं होते हैं और इसे ओवरराइड किया जा सकता है; इस प्रकार, सूचना छिपाने को उन लोगों द्वारा अलग धारणा के रूप में परिभाषित किया जाता है जो दूसरी परिभाषा पसंद करते हैं।

एनकैप्सुलेशन की विशेषताएं अधिकांश वस्तु-ओरिएंटेड भाषाओं में वर्ग (कंप्यूटर प्रोग्रामिंग) का उपयोग करके समर्थित हैं, चूँकि अन्य विकल्प भी मौजूद हैं।

एनकैप्सुलेशन और उत्तराधिकार
डिजाइन पैटर्न्स के लेखक उत्तराधिकार (वस्तु-उन्मुख प्रोग्रामिंग) और इनकैप्सुलेशन के बीच तनाव पर चर्चा करते हैं और कहते हैं कि उनके अनुभव में, डिज़ाइनर इनहेरिटेंस का अधिक उपयोग करते हैं। वे प्रमाणित करते हैं कि उत्तराधिकार अधिकांश इनकैप्सुलेशन को तोड़ता है, यह देखते हुए कि उत्तराधिकार उपवर्ग को उसके माता-पिता के कार्यान्वयन के विवरण के लिए उजागर करता है। जैसा कि यो-यो समस्या द्वारा वर्णित किया गया है, उत्तराधिकार का अत्यधिक उपयोग और इसलिए इनकैप्सुलेशन, बहुत जटिल और डिबग करने में कठिन हो सकता है।

सूचना छिपाना
इस परिभाषा के अनुसार कि डेटा सदस्यों और सदस्य कार्यों को छिपाने के लिए एनकैप्सुलेशन का उपयोग किया जा सकता है, किसी वस्तु (कंप्यूटर विज्ञान) का आंतरिक प्रतिनिधित्व आम तौर पर वस्तु की परिभाषा के बाहर देखने से छिपा होता है। सामान्यतः, केवल वस्तु के अपने तरीके ही सीधे उसके क्षेत्रों का निरीक्षण या हेरफेर कर सकते हैं। वस्तु के आंतरिक भाग को छिपाने से उपयोगकर्ताओं को घटक के आंतरिक डेटा को अमान्य या असंगत स्थिति में सेट करने से रोका जा सकता है। एनकैप्सुलेशन का अनुमानित लाभ यह है कि यह प्रणाली की जटिलता को कम कर सकता है, और इस प्रकार डेवलपर को सॉफ्टवेयर घटकों के बीच परस्पर निर्भरता को सीमित करने की अनुमति देकर जटिलता (कंप्यूटर विज्ञान) को बढ़ा सकता है।

स्मॉलटाक और रूबी (प्रोग्रामिंग भाषा) जैसी कुछ भाषाएं केवल वस्तु विधियों के माध्यम से पहुंच की अनुमति देती हैं, किन्तु अधिकांश अन्य (जैसे, सी ++, सी शार्प (प्रोग्रामिंग भाषा), डेल्फी (प्रोग्रामिंग भाषा) या जावा (प्रोग्रामिंग भाषा)) प्रोग्रामर को   और  जैसे कीवर्ड के माध्यम से सामान्यतः छिपी हुई चीज़ों पर नियंत्रण की एक डिग्री प्रदान करती हैं। आईएसओ सी ++ मानक ,   और   कों एक्सेस स्पेसिफायर के रूप में संदर्भित करता है और वे किसी भी जानकारी कों नहीं छिपाते हैं। सूचना छिपाने को स्रोत कोड के संकलित संस्करण को प्रस्तुत करके पूरा किया जाता है जिसे हेडर फ़ाइल के माध्यम से इंटरफ़ेस किया जाता है।

लगभग हमेशा, इस प्रकार की सुरक्षा को सामान्यतः रिफ्लेक्शन (कंप्यूटर प्रोग्रामिंग) एपीआई (रूबी, जावा, सी #, आदि) के माध्यम से ओवरराइड करने का एक तरीका होता है, कभी-कभी तंत्र जैसे नाम मंगलिंग (पायथन (प्रोग्रामिंग भाषा)), या विशेष कीवर्ड उपयोग जैसे  सी ++ में। प्रणाली जो वस्तु-स्तरीय क्षमता-आधारित सुरक्षा प्रदान करते हैं (वस्तु-क्षमता मॉडल का पालन करना) जो की एक अपवाद हैं, और शक्तिशाली एनकैप्सुलेशन की गारंटी देते हैं।

डेटा फ़ील्ड को प्रतिबंधित करना
C++, C # (प्रोग्रामिंग भाषा), Java (प्रोग्रामिंग भाषा), पीएचपी, स्विफ्ट (प्रोग्रामिंग भाषा), और डेल्फी (प्रोग्रामिंग भाषा) जैसी भाषाएं डेटा फील्ड तक पहुंच को प्रतिबंधित करने के तरीके प्रदान करती हैं।

नीचे C# में एक उदाहरण दिया गया है जो दिखाता है कि कैसे एक  कीवर्ड के उपयोग के माध्यम से डेटा फ़ील्ड तक पहुंच को प्रतिबंधित किया जा सकता है: नीचे जावा (प्रोग्रामिंग भाषा) में उदाहरण है: एनकैप्सुलेशन गैर-वस्तु-ओरिएंटेड भाषाओं में भी संभव है। सी (प्रोग्रामिंग भाषा) में, उदाहरण के लिए हेडर फ़ाइल के माध्यम से सार्वजनिक एपीआई में एक संरचना को उन कार्यों के एक सेट के लिए घोषित किया जा सकता है जो डेटा सदस्यों वाले डेटा के एक आइटम पर काम करते हैं जो   कीवर्ड के साथ एपीआई के ग्राहकों के लिए सुलभ नहीं हैं।  ग्राहक अपारदर्शी डेटा प्रकार की वस्तुओं को आवंटित करने, संचालित करने और हटाने के लिए एपीआई कार्यों को कहते हैं। इस प्रकार की सामग्री केवल एपीआई कार्यों के कार्यान्वयन के लिए ज्ञात और सुलभ है; ग्राहक सीधे इसकी सामग्री तक नहीं पहुँच सकते। इन कार्यों के लिए स्रोत कोड संरचना की वास्तविक सामग्री को परिभाषित करता है:

नाम मंगलिंग
नीचे पायथन (प्रोग्रामिंग भाषा) का उदाहरण दिया गया है, जो वेरिएबल एक्सेस प्रतिबंधों का समर्थन नहीं करता है। चूँकि, सम्मेलन यह है कि चर जिसका नाम अंडरस्कोर द्वारा उपसर्ग किया गया है, को निजी माना जाना चाहिए।

यह भी देखें

 * उत्तराधिकार (वस्तु-उन्मुख प्रोग्रामिंग)
 * वस्तु ओरिएंटेड प्रोग्रामिंग
 * सॉफ्टवेयर डिजाइन पैटर्न
 * मुखौटा पैटर्न