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

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

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

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

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

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

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

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

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

नीचे C Sharp (प्रोग्रामिंग लैंग्वेज)|C# में एक उदाहरण दिया गया है जो दिखाता है कि किसी डेटा फ़ील्ड तक पहुंच को एक के उपयोग के माध्यम से कैसे प्रतिबंधित किया जा सकता है  कीवर्ड: <वाक्यविन्यास प्रकाश लैंग = csharp> वर्ग कार्यक्रम {   सार्वजनिक वर्ग खाता {       निजी दशमलव खाता शेष = 500.00m;

सार्वजनिक दशमलव चेकबैलेंस {           इसे वापस करें। खाता संतुलन; }   }

स्थिर शून्य मुख्य {       खाता myAccount = नया खाता ; दशमलव myBalance = myAccount.CheckBalance ;

/* यह मुख्य विधि जनता के माध्यम से शेष राशि की जांच कर सकती है * चेकबैलेंस विधि खाता वर्ग द्वारा प्रदान की जाती है * लेकिन यह अकाउंटबैलेंस के मूल्य में हेरफेर नहीं कर सकता */ } } 

नीचे जावा (प्रोग्रामिंग भाषा) में एक उदाहरण है: <वाक्यविन्यास प्रकाश लैंग = जावा>

सार्वजनिक वर्ग कर्मचारी { निजी बड़ा दशमलव वेतन = नया बड़ा दशमलव (50000.00); पब्लिक बिगडिसीमल गेटसैलरी { इसे वापस करो। वेतन; }

सार्वजनिक स्थैतिक शून्य मुख्य { कर्मचारी ई = नया कर्मचारी ; बिगडिसीमल साल = e.getSalary ; } } 

एनकैप्सुलेशन गैर-ऑब्जेक्ट-ओरिएंटेड भाषाओं में भी संभव है। सी (प्रोग्रामिंग भाषा) में, उदाहरण के लिए, सार्वजनिक एपीआई में हेडर फ़ाइल के माध्यम से एक संरचना को कार्यों के एक सेट के लिए घोषित किया जा सकता है जो डेटा सदस्यों वाले डेटा के एक आइटम पर काम करता है जो एपीआई के ग्राहकों के लिए सुलभ नहीं है।  कीवर्ड। <वाक्यविन्यास प्रकाश लैंग = सी> // हैडर फ़ाइल api.h

संरचना इकाई; // छिपे हुए सदस्यों के साथ अपारदर्शी संरचना

// एपीआई फ़ंक्शंस जो 'एंटिटी' ऑब्जेक्ट्स पर काम करते हैं बाहरी संरचना इकाई * open_entity (इंट आईडी); बाहरी int process_entity (संरचना इकाई * जानकारी); बाहरी शून्य बंद_एंटिटी (संरचना इकाई * जानकारी); // यहां बाहरी कीवर्ड बेमानी हैं, लेकिन नुकसान नहीं पहुंचाते। // बाहरी उन कार्यों को परिभाषित करता है जिन्हें वर्तमान फ़ाइल के बाहर बुलाया जा सकता है, कीवर्ड के बिना भी डिफ़ॉल्ट व्यवहार 

ग्राहक एक अपारदर्शी डेटा प्रकार की वस्तुओं को आवंटित करने, संचालित करने और हटाने के लिए एपीआई कार्यों को कहते हैं। इस प्रकार की सामग्री केवल एपीआई कार्यों के कार्यान्वयन के लिए ज्ञात और सुलभ है; ग्राहक सीधे इसकी सामग्री तक नहीं पहुँच सकते। इन कार्यों के लिए स्रोत कोड संरचना की वास्तविक सामग्री को परिभाषित करता है: <वाक्यविन्यास प्रकाश लैंग = सी> // कार्यान्वयन फ़ाइल api.c


 * 1) शामिल एपीआई.एच

संरचना इकाई { int ent_id; // आईडी नंबर चार ent_name [20]; // नाम ... और अन्य सदस्य ... };

// एपीआई फ़ंक्शन कार्यान्वयन संरचना इकाई * open_entity (इंट आईडी) {...}

int process_entity (संरचना इकाई * जानकारी) {...}

शून्य क्लोज़_एंटिटी (संरचना इकाई * जानकारी) {...} 

नाम मंगलिंग
नीचे पायथन (प्रोग्रामिंग लैंग्वेज) का एक उदाहरण दिया गया है, जो वेरिएबल एक्सेस प्रतिबंधों का समर्थन नहीं करता है। हालाँकि, सम्मेलन यह है कि एक चर जिसका नाम एक अंडरस्कोर द्वारा उपसर्ग किया गया है, को निजी माना जाना चाहिए। <वाक्यविन्यास लैंग = अजगर> क्लास कार: def __init__(self) -> कोई नहीं: स्वयं._मैक्सस्पीड = 200 डीईएफ़ ड्राइव (स्वयं) -> कोई नहीं: प्रिंट (f अधिकतम गति {self._maxspeed} है।) रेडकार = कार redcar.drive # यह 'अधिकतम गति 200 है' प्रिंट करेगा।

रेडकार._मैक्सस्पीड = 10 redcar.drive # यह 'अधिकतम गति 10 है' प्रिंट करेगा। 

यह भी देखें

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