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

From Vigyanwiki
No edit summary
Line 6: Line 6:


== अर्थ ==
== अर्थ ==
वस्तु-उन्मुख प्रोग्रामिंग भाषाओं और अन्य संबंधित क्षेत्रों में, <!-- [[object-oriented programming language]]--> <!-- and related fields, like [[OODMBS]],--> एनकैप्सुलेशन दो संबंधित लेकिन अलग-अलग धारणाओं में से एक को संदर्भित करता है, और कभी-कभी इसके संयोजन को संदर्भित करता है:<ref>{{cite book |first=Michael Lee |last=Scott |title=Programming language pragmatics |edition= 2 |publisher=Morgan Kaufmann |year=2006 |isbn=978-0-12-633951-2 |page=481 |quote=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}}</ref><ref name="Dale">{{cite book |first1=Nell B. |last1=Dale |first2=Chip |last2=Weems |title=Programming and problem solving with Java |edition= 2nd |publisher=Jones & Bartlett |year=2007 |isbn=978-0-7637-3402-2 |page=396}}</ref>
वस्तु-उन्मुख प्रोग्रामिंग भाषाओं और अन्य संबंधित क्षेत्रों में,   एनकैप्सुलेशन दो संबंधित लेकिन अलग-अलग धारणाओं में से एक को संदर्भित करता है, और कभी-कभी इसके संयोजन को संदर्भित करता है:<ref>{{cite book |first=Michael Lee |last=Scott |title=Programming language pragmatics |edition= 2 |publisher=Morgan Kaufmann |year=2006 |isbn=978-0-12-633951-2 |page=481 |quote=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}}</ref><ref name="Dale">{{cite book |first1=Nell B. |last1=Dale |first2=Chip |last2=Weems |title=Programming and problem solving with Java |edition= 2nd |publisher=Jones & Bartlett |year=2007 |isbn=978-0-7637-3402-2 |page=396}}</ref>
* कुछ [[वस्तु (कंप्यूटर विज्ञान)]] के घटकों तक सीधी पहुंच को प्रतिबंधित करने के लिए एक भाषा तंत्र।<ref>{{cite book |author-link=John C. Mitchell |first=John C. |last=Mitchell |title=Concepts in programming languages |publisher=Cambridge University Press |year=2003 |isbn=978-0-521-78098-8 |page=522}}</ref><ref name=Pierce>{{cite book |last=Pierce |first=Benjamin |author-link=Benjamin C. Pierce |title=Types and Programming Languages |publisher=MIT Press |year=2002 |isbn=978-0-262-16209-8 |page=266 |title-link=Types and Programming Languages }}</ref>
* कुछ [[वस्तु (कंप्यूटर विज्ञान)]] के घटकों तक सीधी पहुंच को प्रतिबंधित करने के लिए एक भाषा तंत्र।<ref>{{cite book |author-link=John C. Mitchell |first=John C. |last=Mitchell |title=Concepts in programming languages |publisher=Cambridge University Press |year=2003 |isbn=978-0-521-78098-8 |page=522}}</ref><ref name=Pierce>{{cite book |last=Pierce |first=Benjamin |author-link=Benjamin C. Pierce |title=Types and Programming Languages |publisher=MIT Press |year=2002 |isbn=978-0-262-16209-8 |page=266 |title-link=Types and Programming Languages }}</ref>
* एक भाषा निर्माण जो डेटा को [[विधि (कंप्यूटर प्रोग्रामिंग)]] के साथ बंडल करने की सुविधा प्रदान करता है <!-- I object to the word method being used here because in lisp languages programmers cannot distinguish methods from normal functions at the [[call site]]. Behavior equivalent to methods may be implemented as normal functions. encapsulation is not dependent on implementation but on behavior--> (या अन्य कार्य) उन डेटा पर काम कर रहे हैं।<ref name=Rogers01>{{cite web |last1=Rogers |first1=Wm. Paul |date=2001-05-18 |df=dmy |url=https://www.infoworld.com/article/2075271/encapsulation-is-not-information-hiding.html |title=Encapsulation is not information hiding |work=[[JavaWorld]] |access-date=2020-07-20}}</ref><ref>{{cite book |first1=Thomas M. |last1=Connolly |first2=Carolyn E. |last2=Begg |title=Database systems: a practical approach to design, implementation, and management |edition=  4th |publisher=Pearson Education |year=2005 |isbn=978-0-321-21025-8 |chapter=Ch. 25: Introduction to Object DMBS § Object-oriented concepts |page=814}}</ref>
* एक भाषा निर्माण जो डेटा को [[विधि (कंप्यूटर प्रोग्रामिंग)]] के साथ बंडल करने की सुविधा प्रदान करता है  (या अन्य कार्य) उन डेटा पर काम कर रहे हैं।<ref name=Rogers01>{{cite web |last1=Rogers |first1=Wm. Paul |date=2001-05-18 |df=dmy |url=https://www.infoworld.com/article/2075271/encapsulation-is-not-information-hiding.html |title=Encapsulation is not information hiding |work=[[JavaWorld]] |access-date=2020-07-20}}</ref><ref>{{cite book |first1=Thomas M. |last1=Connolly |first2=Carolyn E. |last2=Begg |title=Database systems: a practical approach to design, implementation, and management |edition=  4th |publisher=Pearson Education |year=2005 |isbn=978-0-321-21025-8 |chapter=Ch. 25: Introduction to Object DMBS § Object-oriented concepts |page=814}}</ref>
कुछ प्रोग्रामिंग भाषा के शोधकर्ता और शिक्षाविद पहले अर्थ का अकेले या दूसरे के साथ संयोजन में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की एक विशिष्ट विशेषता के रूप में उपयोग करते हैं, जबकि कुछ प्रोग्रामिंग लैंग्वेज जो [[क्लोजर (कंप्यूटर प्रोग्रामिंग)]] प्रदान करती हैं, वे एनकैप्सुलेशन को भाषा की एक विशेषता के रूप में देखते हैं #कंप्यूटर विज्ञान ऑब्जेक्ट ओरिएंटेशन के लिए।
कुछ प्रोग्रामिंग भाषा के शोधकर्ता और शिक्षाविद पहले अर्थ का अकेले या दूसरे के साथ संयोजन में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की एक विशिष्ट विशेषता के रूप में उपयोग करते हैं, जबकि कुछ प्रोग्रामिंग लैंग्वेज जो [[क्लोजर (कंप्यूटर प्रोग्रामिंग)]] प्रदान करती हैं, वे एनकैप्सुलेशन को भाषा की एक विशेषता के रूप में देखते हैं #कंप्यूटर विज्ञान ऑब्जेक्ट ओरिएंटेशन के लिए।


दूसरी परिभाषा इस तथ्य से प्रेरित है कि कई वस्तु-उन्मुख भाषाओं और अन्य संबंधित क्षेत्रों में, घटक स्वचालित रूप से छिपे नहीं होते हैं और इसे ओवरराइड किया जा सकता है; इस प्रकार, सूचना छिपाने को उन लोगों द्वारा एक अलग धारणा के रूप में परिभाषित किया जाता है जो दूसरी परिभाषा पसंद करते हैं।<!-- this is based on all the refs given above, so no inline cite here-->
दूसरी परिभाषा इस तथ्य से प्रेरित है कि कई वस्तु-उन्मुख भाषाओं और अन्य संबंधित क्षेत्रों में, घटक स्वचालित रूप से छिपे नहीं होते हैं और इसे ओवरराइड किया जा सकता है; इस प्रकार, सूचना छिपाने को उन लोगों द्वारा एक अलग धारणा के रूप में परिभाषित किया जाता है जो दूसरी परिभाषा पसंद करते हैं।
एनकैप्सुलेशन की विशेषताएं अधिकांश ऑब्जेक्ट-ओरिएंटेड भाषाओं में क्लास (कंप्यूटर प्रोग्रामिंग) का उपयोग करके समर्थित हैं, हालांकि अन्य विकल्प भी मौजूद हैं।
एनकैप्सुलेशन की विशेषताएं अधिकांश ऑब्जेक्ट-ओरिएंटेड भाषाओं में क्लास (कंप्यूटर प्रोग्रामिंग) का उपयोग करके समर्थित हैं, हालांकि अन्य विकल्प भी मौजूद हैं।


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


नीचे C Sharp (प्रोग्रामिंग लैंग्वेज)|C# में एक उदाहरण दिया गया है जो दिखाता है कि किसी डेटा फ़ील्ड तक पहुंच को एक के उपयोग के माध्यम से कैसे प्रतिबंधित किया जा सकता है <code>private</code> कीवर्ड:
नीचे C Sharp (प्रोग्रामिंग लैंग्वेज)|C# में एक उदाहरण दिया गया है जो दिखाता है कि किसी डेटा फ़ील्ड तक पहुंच को एक के उपयोग के माध्यम से कैसे प्रतिबंधित किया जा सकता है <code>private</code> कीवर्ड:<syntaxhighlight lang="d">
<वाक्यविन्यास प्रकाश लैंग = csharp>
class Program
वर्ग कार्यक्रम
{
{
     सार्वजनिक वर्ग खाता
     public class Account
     {
     {
         निजी दशमलव खाता शेष = 500.00m;
         private decimal accountBalance = 500.00m;


         सार्वजनिक दशमलव चेकबैलेंस ()
         public decimal CheckBalance()
         {
         {
             इसे वापस करें। खाता संतुलन;
             return this.accountBalance;
         }
         }
     }
     }


     स्थिर शून्य मुख्य ()
     static void Main()
     {
     {
         खाता myAccount = नया खाता ();
         Account myAccount = new Account();
         दशमलव myBalance = myAccount.CheckBalance ();
         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" */
     }
     }
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>नीचे जावा (प्रोग्रामिंग भाषा) में एक उदाहरण है:<syntaxhighlight lang="d">
 
public class Employee {
नीचे जावा (प्रोग्रामिंग भाषा) में एक उदाहरण है:
     private BigDecimal salary = new BigDecimal(50000.00);
<वाक्यविन्यास प्रकाश लैंग = जावा>
 
सार्वजनिक वर्ग कर्मचारी {
     निजी बड़ा दशमलव वेतन = नया बड़ा दशमलव (50000.00);
      
      
     पब्लिक बिगडिसीमल गेटसैलरी () {
     public BigDecimal getSalary() {
         इसे वापस करो। वेतन;
         return this.salary;
     }
     }


     सार्वजनिक स्थैतिक शून्य मुख्य() {
     public static void main() {
         कर्मचारी ई = नया कर्मचारी ();
         Employee e = new Employee();
         बिगडिसीमल साल = e.getSalary ();
         BigDecimal sal = e.getSalary();
     }
     }
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>एनकैप्सुलेशन गैर-ऑब्जेक्ट-ओरिएंटेड भाषाओं में भी संभव है। [[सी (प्रोग्रामिंग भाषा)]] में, उदाहरण के लिए, सार्वजनिक एपीआई में हेडर फ़ाइल के माध्यम से एक संरचना को कार्यों के एक सेट के लिए घोषित किया जा सकता है जो डेटा सदस्यों वाले डेटा के एक आइटम पर काम करता है जो एपीआई के ग्राहकों के लिए सुलभ नहीं है। <code>extern</code> कीवर्ड।<ref>{{cite book |last1=King |first1=K. N. |title=C Programming: A Modern Approach |date=2008 |publisher=W. W. Norton & Company |isbn=978-0393979503 |page=464 |edition= 2nd |url=https://www.stormingrobots.com/prod/tutorial/pdf/kingBook-ch1to10.pdf |access-date=1 November 2019}}</ref><ref>King, Kim N. ''C programming: a modern approach''. WW Norton & Company, 2008. Ch. 18, p. 464, {{ISBN|0393979504}}</ref><syntaxhighlight lang="d">
// Header file "api.h"


<!--Below is an example in [[PHP]]:
struct Entity;          // Opaque structure with hidden members


<syntaxhighlight lang="php">
// API functions that operate on 'Entity' objects
class Account
extern struct Entity *  open_entity(int id);
{
extern int              process_entity(struct Entity *info);
    /**
extern void            close_entity(struct Entity *info);
    * How much money is currently in the account
// extern keywords here are redundant, but don't hurt.
    * @var float
// extern defines functions that can be called outside the current file, the default behavior even without the keyword
    */
</syntaxhighlight>ग्राहक एक [[अपारदर्शी डेटा प्रकार]] की वस्तुओं को आवंटित करने, संचालित करने और हटाने के लिए एपीआई कार्यों को कहते हैं। इस प्रकार की सामग्री केवल एपीआई कार्यों के कार्यान्वयन के लिए ज्ञात और सुलभ है; ग्राहक सीधे इसकी सामग्री तक नहीं पहुँच सकते। इन कार्यों के लिए स्रोत कोड संरचना की वास्तविक सामग्री को परिभाषित करता है:<syntaxhighlight lang="d">
    private $accountBalance;
// Implementation file "api.c"


    /**
#include "api.h"
    * @param float $currentAccountBalance Initialize account to this dollar amount
    */
    public function __construct($currentAccountBalance)
    {
        $this->accountBalance = $currentAccountBalance;
    }


     /**
struct Entity {
    * Add money to account
     int    ent_id;        // ID number
    * @param float $money Dollars to add to balance
     char    ent_name[20];   // Name
    * @return void
     ... and other members ...
    */
};
     public function deposit($money): null
    {
        $this->accountBalance += $money;
    }
 
    /**
    * Remove money from account
    * @param float $money Dollars to subtract from balance
    * @throws Exception
    * @return void
    */
     public function withdraw($money): null
    {
        if ($this->accountBalance < $money) {
            throw new Exception('Cannot withdraw $' . $money . ' from account as it contains $' . $this->accountBalance);
        }
        $this->accountBalance -= $money;
    }
 
    /**
    * Get current account balance, that takes all additions and subtractions into consideration.
    * @return float
    */
    public function getAccountBalance() {
        return $this->accountBalance;
    }
}
 
// Create a new object from the Account class with a starting balance of $500.00
$myAccount = new Account(500.00);


// We have clearly defined methods for adding and subtracting money from the Account
// API function implementations
// If we didn't have a method for withdraw(), nothing would prevent us from withdrawing more money than was available in the account
struct Entity * open_entity(int id)
$myAccount->deposit(10.24);
{ ... }
$myAccount->withdraw(4.45);


// Get the current balance
int process_entity(struct Entity *info)
$accountBalance = $myAccount->getAccountBalance();
{ ... }
echo 'My Account Balance: $' . $accountBalance; // 505.79


// Our code forbids us from withdrawing more than we have
void close_entity(struct Entity *info)
$myAccount->withdraw(600.00); // Exception Message: Cannot withdraw $600 from account as it contains $505.79
{ ... }
</syntaxhighlight>
</syntaxhighlight>
Below is an example in [[Swift (programming language)|Swift]]. The <code>balance</code> property cannot be accessed directly; a merchant can only check whether the requested amount is available for spending using the <code>isAvailable(_:)</code> method.
<syntaxhighlight lang="swift">
struct CreditCard {
   
    private var balance: Double
   
    init(withBalance balance: Double) {
        self.balance = balance
    }
   
    func isAvailable(_ amount: Double) -> Bool {
        return balance >= amount
    }
   
}
var myCard = CreditCard(withBalance: 100)
myCard.balance // Error: 'balance' is inaccessible due to 'private' protection level
myCard.isAvailable(100) // true
myCard.isAvailable(101) // false
</syntaxhighlight>-->
एनकैप्सुलेशन गैर-ऑब्जेक्ट-ओरिएंटेड भाषाओं में भी संभव है। [[सी (प्रोग्रामिंग भाषा)]] में, उदाहरण के लिए, सार्वजनिक एपीआई में हेडर फ़ाइल के माध्यम से एक संरचना को कार्यों के एक सेट के लिए घोषित किया जा सकता है जो डेटा सदस्यों वाले डेटा के एक आइटम पर काम करता है जो एपीआई के ग्राहकों के लिए सुलभ नहीं है। <code>extern</code> कीवर्ड।<ref>{{cite book |last1=King |first1=K. N. |title=C Programming: A Modern Approach |date=2008 |publisher=W. W. Norton & Company |isbn=978-0393979503 |page=464 |edition= 2nd |url=https://www.stormingrobots.com/prod/tutorial/pdf/kingBook-ch1to10.pdf |access-date=1 November 2019}}</ref><ref>King, Kim N. ''C programming: a modern approach''. WW Norton & Company, 2008. Ch. 18, p. 464, {{ISBN|0393979504}}</ref>
<वाक्यविन्यास प्रकाश लैंग = सी>
// हैडर फ़ाइल api.h
संरचना इकाई; // छिपे हुए सदस्यों के साथ अपारदर्शी संरचना
// एपीआई फ़ंक्शंस जो 'एंटिटी' ऑब्जेक्ट्स पर काम करते हैं
बाहरी संरचना इकाई * open_entity (इंट आईडी);
बाहरी int process_entity (संरचना इकाई * जानकारी);
बाहरी शून्य बंद_एंटिटी (संरचना इकाई * जानकारी);
// यहां बाहरी कीवर्ड बेमानी हैं, लेकिन नुकसान नहीं पहुंचाते।
// बाहरी उन कार्यों को परिभाषित करता है जिन्हें वर्तमान फ़ाइल के बाहर बुलाया जा सकता है, कीवर्ड के बिना भी डिफ़ॉल्ट व्यवहार
</वाक्यविन्यास हाइलाइट>
ग्राहक एक [[अपारदर्शी डेटा प्रकार]] की वस्तुओं को आवंटित करने, संचालित करने और हटाने के लिए एपीआई कार्यों को कहते हैं। इस प्रकार की सामग्री केवल एपीआई कार्यों के कार्यान्वयन के लिए ज्ञात और सुलभ है; ग्राहक सीधे इसकी सामग्री तक नहीं पहुँच सकते। इन कार्यों के लिए स्रोत कोड संरचना की वास्तविक सामग्री को परिभाषित करता है:
<वाक्यविन्यास प्रकाश लैंग = सी>
// कार्यान्वयन फ़ाइल api.c
#शामिल एपीआई.एच
संरचना इकाई {
    int ent_id; // आईडी नंबर
    चार ent_name [20]; // नाम
    ... और अन्य सदस्य ...
};
// एपीआई फ़ंक्शन कार्यान्वयन
संरचना इकाई * open_entity (इंट आईडी)
{...}
int process_entity (संरचना इकाई * जानकारी)
{...}
शून्य क्लोज़_एंटिटी (संरचना इकाई * जानकारी)
{...}
</वाक्यविन्यास हाइलाइट>


==== नाम मंगलिंग ====
==== नाम मंगलिंग ====
{{main|Name mangling}}
{{main|Name mangling}}
नीचे पायथन (प्रोग्रामिंग लैंग्वेज) का एक उदाहरण दिया गया है, जो वेरिएबल एक्सेस प्रतिबंधों का समर्थन नहीं करता है। हालाँकि, सम्मेलन यह है कि एक चर जिसका नाम एक अंडरस्कोर द्वारा उपसर्ग किया गया है, को निजी माना जाना चाहिए।<ref>{{cite web |last1=Bader |first1=Dan |title=The Meaning of Underscores in Python |url=https://dbader.org/blog/meaning-of-underscores-in-python |website=Improve Your Python Skills |access-date=1 November 2019}}</ref>
नीचे पायथन (प्रोग्रामिंग लैंग्वेज) का एक उदाहरण दिया गया है, जो वेरिएबल एक्सेस प्रतिबंधों का समर्थन नहीं करता है। हालाँकि, सम्मेलन यह है कि एक चर जिसका नाम एक अंडरस्कोर द्वारा उपसर्ग किया गया है, को निजी माना जाना चाहिए।<ref>{{cite web |last1=Bader |first1=Dan |title=The Meaning of Underscores in Python |url=https://dbader.org/blog/meaning-of-underscores-in-python |website=Improve Your Python Skills |access-date=1 November 2019}}</ref><syntaxhighlight lang="d">
<वाक्यविन्यास लैंग = अजगर>
class Car:  
क्लास कार:
     def __init__(self) -> None:
     def __init__(self) -> कोई नहीं:
         self._maxspeed = 200
         स्वयं._मैक्सस्पीड = 200
   
   
     डीईएफ़ ड्राइव (स्वयं) -> कोई नहीं:
     def drive(self) -> None:
         प्रिंट (f अधिकतम गति {self._maxspeed} है।)
         print(f"Maximum speed is {self._maxspeed}.")
   
   
रेडकार = कार ()
redcar = Car()
redcar.drive() # यह 'अधिकतम गति 200 है' प्रिंट करेगा।
redcar.drive() # This will print 'Maximum speed is 200.'


रेडकार._मैक्सस्पीड = 10
redcar._maxspeed = 10
redcar.drive() # यह 'अधिकतम गति 10 है' प्रिंट करेगा।
redcar.drive() # This will print 'Maximum speed is 10.'
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


== यह भी देखें ==
== यह भी देखें ==

Revision as of 18:17, 18 February 2023

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

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


अर्थ

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

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

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

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

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

सूचना छिपाना

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

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

उदाहरण

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

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

नीचे C Sharp (प्रोग्रामिंग लैंग्वेज)|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.