एसोसिएशन, एकत्रीकरण और संरचना का उपयोग क्या है?


20

मैं इनकैप्सुलेशन और इसे लागू करने की तीन तकनीकों के बारे में बहुत सारे सिद्धांतों से गुजरा हूं, जो एसोसिएशन, एग्रीगेशन और कंपोजिशन हैं।

मैंने जो पाया वह है :

encapsulation

एनकैप्सुलेशन एक कक्षा को निजी बनाने और सार्वजनिक तरीकों के माध्यम से खेतों तक पहुंच प्रदान करने की तकनीक है। यदि किसी क्षेत्र को निजी घोषित किया जाता है, तो उसे कक्षा के बाहर किसी के द्वारा भी एक्सेस नहीं किया जा सकता है, जिससे कक्षा के भीतर के क्षेत्र छिप जाते हैं। इस कारण से, एनकैप्सुलेशन को डेटा छिपाना भी कहा जाता है।

एनकैप्सुलेशन को एक सुरक्षात्मक बाधा के रूप में वर्णित किया जा सकता है जो कोड और डेटा को कक्षा के बाहर परिभाषित अन्य कोड द्वारा यादृच्छिक रूप से एक्सेस करने से रोकता है। डेटा और कोड तक पहुंच को एक इंटरफ़ेस द्वारा कसकर नियंत्रित किया जाता है।

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

संगति

एसोसिएशन एक ऐसा संबंध है जहां सभी ऑब्जेक्ट का अपना जीवनचक्र होता है और कोई मालिक नहीं होता है। आइए टीचर और स्टूडेंट का उदाहरण लेते हैं। एकाधिक छात्र एकल शिक्षक के साथ जुड़ सकते हैं और एक अकेला छात्र कई शिक्षकों के साथ जुड़ सकता है, लेकिन वस्तुओं के बीच कोई स्वामित्व नहीं होता है और दोनों का अपना जीवनचक्र होता है। दोनों स्वतंत्र रूप से बना और हटा सकते हैं।

एकत्रीकरण

एकत्रीकरण एसोसिएशन का एक विशेष रूप है जहां सभी वस्तुओं का अपना जीवनचक्र होता है, लेकिन स्वामित्व होता है और एक बच्चे की वस्तु किसी अन्य मूल वस्तु से संबंधित नहीं हो सकती। आइए एक विभाग और शिक्षक का उदाहरण लें। एक एकल शिक्षक कई विभागों से संबंधित नहीं हो सकता है, लेकिन यदि हम विभाग को हटाते हैं तो शिक्षक ऑब्जेक्ट नष्ट नहीं होगा। हम इसे "एक" संबंध के रूप में सोच सकते हैं।

रचना

रचना फिर से एकत्रीकरण का एक विशेष रूप है और हम इसे "मृत्यु" रिश्ते के रूप में कह सकते हैं। यह एक मजबूत प्रकार का एकत्रीकरण है। चाइल्ड ऑब्जेक्ट में उनका जीवनचक्र नहीं होता है और अगर पैरेंट ऑब्जेक्ट डिलीट करता है तो सभी चाइल्ड ऑब्जेक्ट भी डिलीट हो जाएंगे। आइए फिर से घर और कमरे के बीच संबंधों का एक उदाहरण लेते हैं। घर में कई कमरे हो सकते हैं लेकिन एक कमरे का स्वतंत्र जीवन नहीं है और कोई भी कमरा दो अलग-अलग घरों से संबंधित नहीं हो सकता है। अगर हम घर को हटा देते हैं, तो कमरा अपने आप डिलीट हो जाएगा।

प्रश्न है:

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


1
कृपया ध्यान दें कि एकत्रीकरण को लागू करने के लिए एकत्रीकरण, रचना और संघ तकनीक नहीं हैं। एक एनकैप्सुलेशन भी मौजूद हो सकता है भले ही सिर्फ एक वर्ग / वस्तु हो। अपने ऑब्जेक्ट के डेटा को छिपाने के लिए ऑब्जेक्ट ओरिएंटेशन में एनकैप्सुलेशन केवल एक आवश्यक विशेषता है।
21

1
"एक शिक्षक वास्तव में कई विभागों से संबंधित नहीं हो सकता है"? क्या आपने देखा कि आपके संसाधन ने सामग्री को संशोधित नहीं किया है?
KNU

डोमेन-डिज़ाइन डिज़ाइन करते समय DDD सकल रूट और उनकी संस्थाओं की पहचान करने के लिए मैंने कंपोज़िशन का उपयोग करने में कामयाबी हासिल की है। एक पुराने सम्मेलन के लिए एक नया उपयोग।
जोन

जवाबों:


12

एसोसिएशन, एकत्रीकरण और रचना के बीच का अंतर जैसा कि आप वर्णन करते हैं कि यह एक विरासत है जो मैनुअल मेमोरी प्रबंधन के पुराने समय में वापस जा रही है। उदाहरण के लिए C ++ में ऑब्जेक्ट्स द्वारा उपयोग की जाने वाली मेमोरी को मैन्युअल रूप से रिलीज़ करना होता है और इस प्रकार से कंपोजिट ऑब्जेक्ट्स के जीवनचक्र को ध्यान से डिजाइन करना सर्वोपरि होता है। जबकि एकत्रीकरण और रचना के बीच अंतर अभी भी कई पाठ पुस्तकों द्वारा पढ़ाया जा रहा है, यह अनिवार्य रूप से अप्रासंगिक है जब स्वचालित स्मृति प्रबंधन के साथ वातावरण में प्रोग्रामिंग। यदि आपके पास कचरा संग्रह है, तो वे सभी केवल रचना, अवधि हैं।

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

यहाँ एनकैप्सुलेशन का एक उदाहरण दिया गया है

public class Counter {
    private int n = 0;
    public int inc() { return n++; }
}

या लाम्बा कार्यों का उपयोग कर एक ही

var counter = (function() {
    var n = 0;
    var inc = function() { return n++; }
    return inc;
})();

दोनों मामलों में, डेटा, जो चर है n, उस पर चलने वाले फ़ंक्शन के साथ एक साथ बंडल किया incगया है। और कोई तरीका नहीं है कि कोई अन्य फ़ंक्शन कभी भी एक्सेस कर सके n, इस प्रकार हमारे पास एक एनकैप्सुलेटेड मॉड्यूल है जो सेवा के रूप में गिनती प्रदान करता है।

NB: एक्सेसरों के माध्यम से किसी वस्तु की आंतरिक स्थिति को उजागर करना वास्तव में एनकैप्सुलेशन का उल्लंघन है। काश, यह इतना आम उल्लंघन है कि कई इसे अच्छी वस्तु उन्मुख डिजाइन के साथ भ्रमित करेंगे।


2
स्वचालित मेमोरी प्रबंधन का वस्तु संबंधों से कोई लेना-देना नहीं है। ऑब्जेक्ट आरेख स्वयं प्रोग्रामर को बताता है कि सिस्टम की आवश्यकताओं के अनुसार वर्गों, उनके इंटरफेस और उनके तरीकों को कैसे कोडित किया जाए।
21

2
स्मृति के बाहर भी एक विचार है। डेटा डिजाइन या शायद क्रमांकन में। रचना में, आपको RDBMS में अलग-अलग विदेशी कुंजी अवरोधों की आवश्यकता हो सकती है, या संभवतः किसी ऑब्जेक्ट के क्रमांकन को कैसे बदल सकते हैं यदि इसमें समग्र बच्चे बनाम समग्र बच्चे या संबंधित ऑब्जेक्ट हैं।
क्रिस

8

एनकैप्सुलेशन एक कक्षा को निजी बनाने और सार्वजनिक तरीकों के माध्यम से खेतों तक पहुंच प्रदान करने की तकनीक है। यदि किसी क्षेत्र को निजी घोषित किया जाता है, तो उसे कक्षा के बाहर किसी के द्वारा भी एक्सेस नहीं किया जा सकता है, जिससे कक्षा के भीतर के क्षेत्र छिप जाते हैं। इस कारण से, एनकैप्सुलेशन को डेटा छिपाना भी कहा जाता है।

    public class Test{

    private String name;

       private int age;

       public int getAge(){
          return age;
       }

       public String getName(){
          return name;
       }
    }

इस प्रश्न को भी देखें ।

एसोसिएशन वस्तुओं के बीच संबंध को इंगित करता है। उदाहरण: कंप्यूटर कीबोर्ड का उपयोग इनपुट डिवाइस के रूप में करता है।

एक संघ का उपयोग तब किया जाता है जब एक वस्तु किसी अन्य वस्तु को इसके लिए एक सेवा करना चाहती है।

एकत्रीकरण संघ का एक विशेष मामला है। वस्तुओं के बीच एक दिशात्मक जुड़ाव। जब एक वस्तु में 'एक' एक अन्य वस्तु होती है, तो आपको उनके बीच एक एकत्रीकरण मिला है।

उदाहरण: कमरे में एक टेबल है, लेकिन टेबल कमरे के बिना भी मौजूद हो सकती है।

    class Room {

      private Table table;

      void setTable(Table table) {
        this.table = table;
      }

    }

रचना एकत्रीकरण का एक विशेष मामला है। रचना अधिक प्रतिबंधक है। जब दो वस्तुओं के बीच कोई रचना होती है, तो दूसरी वस्तु के बिना रचना नहीं हो सकती है। एकत्रीकरण में यह प्रतिबंध नहीं है। उदाहरण: एक घर में कमरे, जो घर के जीवनकाल के बाद मौजूद नहीं हो सकते।

    class House {

      private  Room room;

      House(Room roomSpecs) {
        room = new Room(roomSpecs);
      }

    }

रचना एक डिजाइन तकनीक है जिसे कार्यान्वित करने के लिए कक्षाओं में एक संबंध है, या तो कोड पुन: उपयोग के लिए विरासत या वस्तु संरचना द्वारा।

जावा प्रोग्रामिंग में सबसे अच्छा अभ्यास विरासत में से अधिक रचना का उपयोग करना है


यह पूछे गए प्रश्न का उत्तर कैसे देता है?
gnat

1

उन तकनीकों का उपयोग करने से आमतौर पर SOLID या विभिन्न डिजाइन पैटर्न जैसे डिजाइन प्रथाओं का परिणाम होता है ।

पैटर्न, प्रथाओं और इस तरह का उपयोग करने का बिंदु एक विशिष्ट समस्या के समाधान का वर्णन करना है जो कि बनाए रखने योग्य और विस्तार योग्य भी है। आपको केवल यह बताने के लिए पर्याप्त अनुभव प्राप्त करने की आवश्यकता है कि किस पैटर्न या तकनीक का उपयोग करना है।


1

मुझे स्पष्ट रूप से लगता है कि अकादमिक स्तर पर सिखाई जा रही इन धारणाओं का वस्तु अभिविन्यास और वर्ग डिजाइन के संदर्भों में अपना महत्व है। जब ये सिस्टम स्क्रैच से मॉडलिंग करने लगता है तो ये कॉन्सेप्ट हमारी बहुत मदद करते हैं। एसोसिएशन, एकत्रीकरण और संरचना विशेष रूप से यूएमएल के वर्ग आरेख से संबंधित हैं और स्मृति मुद्दों जैसे प्रौद्योगिकी बाधाओं से पूरी तरह से स्वतंत्र हैं।

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

एक और उदाहरण एक बाग और कुछ विशेष प्रकार के फलों का हो सकता है। कहते हैं कि मैं केवल एक बाग पर विचार कर सकता हूं जब मेरे पास सेब के पेड़ हों। लब्बोलुआब यह है कि समग्र प्रणाली की आवश्यकताएं बहुत मायने रखती हैं।

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

यहाँ इन अवधारणाओं को कोड पर कैसे लागू किया जाता है:

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

रचना: यदि एक वस्तु किसी अन्य वस्तु का अभिन्न अंग है, तो मुझे इस संबंध को दूसरी वस्तु के निर्माता में इंगित करना पड़ सकता है। उदाहरण के लिए, सदनों और कमरों के आपके परिदृश्य में हम निम्नलिखित कोड लिख सकते हैं यदि हम जानना चाहते हैं कि कौन सा कमरा किस घर के प्रकार का है।

class House{
          string _HouseType;   
     public:    
    void setHouseType(string house_type)
     {
        this. _HouseType = house_type;
     } 

     string getHouseType()
    {
       return _HouseType;
    }
};



 House HouseObject = new House();


class Room{

 public: 
 Room(string HouseType) {
       this._HouseType = HouseObject.getHouseType();  //as in my system a room cannot exist without a house

 } 

};

लागू जबकि प्रोग्रामर भी सुनिश्चित करेगा विनाशकर्ता वस्तु की, कि अन्य वस्तु के destuctor भी लागू हो जाता है। यह महत्वपूर्ण है।

AGGREGATION: आइए हम कहते हैं कि यदि वस्तुओं के बीच संबंध कमजोर है, तो हम प्रोग्रामर के लिए, इसका मतलब रिश्ते को इंगित करने के बजाय एक आवृत्ति चर का उपयोग करना होगा। और फिर एक दूसरे से उस वस्तु को मूल्य प्रदान करने के लिए एक म्यूटेटर फंक्शनलॉन (सेटर) लिखें।

class Department{

 string dept_name;

public:
   void setDeptName(string name)
   {
        this.dept_name=name;
   }

   string getDeptName()
   {
        return dept_name; 
   }

};



 Department DepartmentObject = new Department();

class Teacher{

 string dept_name;

public:

  setDeptName(string name)
  {
     this.dept_name = DepartmentObject.getDeptName();  //You only need to invoje this method when needed (aggregation)
  }
}

};

1

ठीक है, इसे अमूर्त अवधारणाओं के बजाय कुछ मुख्य गुणों के लिए मानचित्रित करें जो केवल एक बार समझ में आते हैं कि आप क्या मतलब है। कुछ टिप्पणीकारों की तरह मैं स्वीकृत जवाब से सहमत नहीं हूं, मैं कहता हूं कि ये अवधारणाएं स्मृति प्रबंधन से स्वतंत्र हैं।

encapsulation

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

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

संगति

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

रोकथाम

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

एकत्रीकरण

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

रचना

ऐसा लगता है कि यह समसामयिकता के लिए अधिक समकालीन शब्द है, संभवतः इसलिए कि इसे अपेक्षाकृत हाल ही की एक लोकप्रिय पुस्तक में गढ़ा गया था। जहां वस्तु संबंधों के तकनीकी पहलुओं पर ध्यान केंद्रित किया जाता है, रचना आमतौर पर डिजाइन निर्णयों के संदर्भ में उपयोग की जाती है, विशेष रूप से विरासत के लिए अधिक लचीले विकल्प के रूप में।

यह वस्तु संबंधों या स्वामित्व की प्रकृति के बारे में बहुत कुछ नहीं कहता है, यह केवल इंगित करता है कि कार्यक्षमता मौजूदा कक्षाओं की कार्यक्षमता को मिलाकर लागू की गई है। इसलिए मैं तर्क दूंगा कि यह इस श्रृंखला में नहीं है क्योंकि यह कार्यान्वयन के तकनीकी पहलुओं के बारे में कुछ नहीं कहता है जहां अन्य करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.