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

From alpha
Jump to navigation Jump to search

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

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

अर्थ

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेजेज और अन्य संबंधित क्षेत्रों में, इनकैप्सुलेशन दो संबंधित किन्तु अलग-अलग धारणाओं में से एक को संदर्भित करता है, और कभी-कभी इसके संयोजन को संदर्भित करता है:[3][4]

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

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

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

इनकैप्सुलेशन और इनहेरिटेंस

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

इनफार्मेशन हाईडिंग

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

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

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

उदाहरण

डेटा फ़ील्ड को प्रतिबंधित करना

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

नीचे C# में एक उदाहरण दिया गया है जो दिखाता है कि कैसे एक private कीवर्ड के उपयोग के माध्यम से डेटा फ़ील्ड तक पहुंच को प्रतिबंधित किया जा सकता है:

class Program
{
    public class Account
    {
        private decimal accountBalance = 500.00m;

        public decimal CheckBalance()
        {
            return this.accountBalance;
        }
    }

    static void Main()
    {
        Account myAccount = new Account();
        decimal myBalance = myAccount.CheckBalance();

        /* This Main method can check the balance via the public
         * "CheckBalance" method provided by the "Account" class 
         * but it cannot manipulate the value of "accountBalance" */
    }
}

नीचे जावा (प्रोग्रामिंग लैंग्वेज) में उदाहरण है:

public class Employee {
    private BigDecimal salary = new BigDecimal(50000.00);
    
    public BigDecimal getSalary() {
        return this.salary;
    }

    public static void main() {
        Employee e = new Employee();
        BigDecimal sal = e.getSalary();
    }
}

इनकैप्सुलेशन गैर-ऑब्जेक्ट-ओरिएंटेड लैंग्वेजेज में भी संभव है। सी (प्रोग्रामिंग लैंग्वेज) में, उदाहरण के लिए हेडर फ़ाइल के माध्यम से सार्वजनिक एपीआई में एक संरचना को उन कार्यों के एक सेट के लिए घोषित किया जा सकता है जो डेटा सदस्यों वाले डेटा के एक आइटम पर काम करते हैं जो extern कीवर्ड के साथ एपीआई के ग्राहकों के लिए सुलभ नहीं हैं।[9][10]

// Header file "api.h"

struct Entity;          // Opaque structure with hidden members

// API functions that operate on 'Entity' objects
extern struct Entity *  open_entity(int id);
extern int              process_entity(struct Entity *info);
extern void             close_entity(struct Entity *info);
// extern keywords here are redundant, but don't hurt.
// extern defines functions that can be called outside the current file, the default behavior even without the keyword

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

// Implementation file "api.c"

#include "api.h"

struct Entity {
    int     ent_id;         // ID number
    char    ent_name[20];   // Name
    ... and other members ...
};

// API function implementations
struct Entity * open_entity(int id)
{ ... }

int process_entity(struct Entity *info)
{ ... }

void close_entity(struct Entity *info)
{ ... }

नेम मैंगलिंग

नीचे पायथन (प्रोग्रामिंग लैंग्वेज) का उदाहरण दिया गया है, जो वेरिएबल एक्सेस प्रतिबंधों का समर्थन नहीं करता है। यद्यपि, सम्मेलन यह है कि वेरिएबल जिसका नाम अंडरस्कोर द्वारा प्रीफिक्स किया गया है, को प्राइवेट माना जाना चाहिए।[11]

class Car: 
    def __init__(self) -> None:
        self._maxspeed = 200
 
    def drive(self) -> None:
        print(f"Maximum speed is {self._maxspeed}.")
 
redcar = Car()
redcar.drive()  # This will print 'Maximum speed is 200.'

redcar._maxspeed = 10
redcar.drive()  # This will print 'Maximum speed is 10.'

यह भी देखें

संदर्भ

  1. 1.0 1.1 Rogers, Wm. Paul (18 May 2001). "Encapsulation is not information hiding". JavaWorld. Retrieved 2020-07-20.
  2. Pierce 2002, § 24.2 Data Abstraction with Existentials
  3. Scott, Michael Lee (2006). Programming language pragmatics (2 ed.). Morgan Kaufmann. p. 481. ISBN 978-0-12-633951-2. Encapsulation mechanisms enable the programmer to group data and the subroutines that operate on them together in one place, and to hide irrelevant details from the users of an abstraction
  4. Dale, Nell B.; Weems, Chip (2007). Programming and problem solving with Java (2nd ed.). Jones & Bartlett. p. 396. ISBN 978-0-7637-3402-2.
  5. Mitchell, John C. (2003). Concepts in programming languages. Cambridge University Press. p. 522. ISBN 978-0-521-78098-8.
  6. 6.0 6.1 Pierce, Benjamin (2002). Types and Programming Languages. MIT Press. p. 266. ISBN 978-0-262-16209-8.
  7. Connolly, Thomas M.; Begg, Carolyn E. (2005). "Ch. 25: Introduction to Object DMBS § Object-oriented concepts". Database systems: a practical approach to design, implementation, and management (4th ed.). Pearson Education. p. 814. ISBN 978-0-321-21025-8.
  8. Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994). Design Patterns. Addison-Wesley. ISBN 978-0-201-63361-0.
  9. King, K. N. (2008). C Programming: A Modern Approach (PDF) (2nd ed.). W. W. Norton & Company. p. 464. ISBN 978-0393979503. Retrieved 1 November 2019.
  10. King, Kim N. C programming: a modern approach. WW Norton & Company, 2008. Ch. 18, p. 464, ISBN 0393979504
  11. Bader, Dan. "The Meaning of Underscores in Python". Improve Your Python Skills. Retrieved 1 November 2019.