यूएमएल वर्ग आरेख संकेतन: एसोसिएशन, एकत्रीकरण और संरचना के बीच अंतर


39

मैं यूएमएल श्रेणी के आरेखों में से कुछ के बारे में उलझन में हूं।

यहाँ छवि विवरण दर्ज करें

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

हालाँकि, मुझे यह समझने में परेशानी हो रही है कि एग्रीगेशन और रचना के तीर का क्या मतलब है। इन भ्रमों की विभिन्न परिभाषाओं का सामना करने के कारण मेरी उलझन का एक हिस्सा था।

एकत्रीकरण संकेतन की दो परिभाषाएँ :

परिभाषा 1: दो वर्गों के बीच एक एकत्रीकरण अंकन तब उपयुक्त होता है जब कक्षा A का उदाहरण वर्ग B के उदाहरणों (जैसे एक सूची, सरणी, जो भी हो) का संग्रह रखता है

परिभाषा 2: दो वर्गों के बीच एक एकत्रीकरण लिंक उपयुक्त है यदि वर्ग A का उदाहरण कक्षा B की आवृत्ति के संदर्भ में है, और B उदाहरण A उदाहरण के जीवनचक्र पर निर्भर है। अर्थ: जब कक्षा ए का उदाहरण हटा दिया जाता है, तो कक्षा बी का उदाहरण कक्षा बी का उदाहरण पूरी तरह से कक्षा ए के उदाहरण से निहित होता है, क्योंकि कक्षा ए के उदाहरण के विपरीत केवल उदाहरण के उदाहरण के संदर्भ में। वर्ग बी (जो नियमित एसोसिएशन है)।

रचना संकेतन का क्या अर्थ है और यह एकत्रीकरण संकेतन से कैसे भिन्न है, मुझे यकीन नहीं है।

कृपया परिभाषाएँ स्पष्ट करें और मुझे समझने में मदद करें। ठोस उदाहरणों का स्वागत होगा।


परिभाषा 2 एग्रीगेशन के बजाय रचना के लिए परिभाषा की तरह लगती है। परिभाषा 1 काफी सही लगती है।
jbx

जवाबों:


32

तीन लिंक एसोसिएशन, एकत्रीकरण और रचना एक तरह का पैमाना है कि दो वर्ग एक दूसरे से कितने निकट से संबंधित हैं।

पैमाने के एक छोर पर, एसोसिएशन है, जहां दो वर्गों की वस्तुएं एक-दूसरे के बारे में जान सकती हैं, लेकिन वे जीवन भर एक-दूसरे को प्रभावित नहीं करते हैं। ऑब्जेक्ट स्वतंत्र रूप से मौजूद हो सकते हैं और कौन सी क्लास ए ऑब्जेक्ट के बारे में जानती है कि कौन सी क्लास बी ऑब्जेक्ट्स समय के साथ अलग-अलग हो सकती हैं।

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

एकत्रीकरण का संबंध कहीं न कहीं उन दो सिरों के बीच है, लेकिन कोई भी सहमत नहीं दिखता है कि वास्तव में कहां है, इसलिए एक सार्वभौमिक रूप से सहमत परिभाषा का कोई मतलब नहीं है। इस लिहाज से, आपको मिली दोनों परिभाषाएँ सही हैं और यदि आप 10 लोगों से पूछते हैं, तो आपको 11 अलग-अलग परिभाषाएँ मिलने का जोखिम है।


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

1
बी इंस्टेंस का जीवनकाल ए इंस्टेंस के जीवनकाल पर निर्भर है। एक मजबूत 'स्वामित्व' संबंध। उदाहरण के लिए: एक कार और एक पहिया। कार में 'पूरी तरह से पहिया' होता है। व्हील इंस्टेंस उस कार उदाहरण के बिना रहना जारी नहीं रखेगा। क्या यह एक उचित भेदभाव है?
अविव कोहन

@ प्रोग: हाँ, यह एक उचित परिभाषा है। बस याद रखें कि अन्य लोग उस परिभाषा को साझा नहीं कर सकते हैं और आपको उनके एकत्रीकरण के उपयोग की व्याख्या करने की आवश्यकता हो सकती है।
बार्ट वैन इनगेन शेनौ

आप क्या कहेंगे कि एग्रीगेशन नोटेशन के लिए सबसे आम परिभाषा क्या है? जो परिभाषा मैं उपयोग कर रहा हूं? 'परिभाषा का एक संग्रह है? कुछ और?
अविव कोहन

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

10

रचना तब होती है जब एक object Aसम्‍मिलित होता है object Bऔर इसे object Aबनाने के लिए भी ज़िम्मेदार होता है object B

रचना संबंध

हमारे पास एक वर्ग ए है जो कक्षा बी द्वारा उपयोग किया जाएगा।

final class A
{
}

रचना के रूप में कई विकल्प हो सकते हैं।

प्रत्यक्ष आरंभीकरण रचना:

final class B
{
    private $a = new A();
}

रचनाकार आरंभीकरण रचना

final class B
{
    private $a;

    public function __construct()
    {
        $this->a = new A();
    }
}

आलसी आरंभीकरण रचना

final class B
{
    private $a = null;

    public function useA()
    {
        if ($this->a === null) {
            $this->a = new A();
        }

        /* Use $this->a */
    }
}

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

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

रचना कभी-कभी समझ में आती है, जैसे कि new DateTimephp या new std::vector<int>C ++ में कॉल करना । लेकिन अधिक बार नहीं, यह एक चेतावनी है, कि आपके कोड का डिज़ाइन गलत है।

एक मामले में, जहां class Aकैशिंग के लिए उपयोग की जाने वाली एक विशेष वस्तु class Bहोगी, हमेशा के कार्यान्वयन का उपयोग करके कैश किया जाएगा class A, और आपको इसे गतिशील रूप से बदलने के लिए कोई नियंत्रण नहीं होगा, जो खराब है।

इसके अलावा, यदि आप आलसी आरंभीकरण रचना का उपयोग करते हैं, तो इसका मतलब है कि आपके पास एक काम होगा object B, जिसे useA()विधि कहा जाता है और निर्माण object Aविफल हो जाएगा, आपका object Bअचानक बेकार है।


दूसरी ओर, एकत्रीकरण, रिश्ते का एक तरीका है, जो DI सिद्धांत का अनुसरण करता हैobject Bउपयोग करने के लिए की जरूरत है object A, तो आप पहले ही बना उदाहरण के पास करना चाहिए object Aकरने के लिए object B, और के सृजन करना चाहिए object Aविफल, कुछ भी पहली जगह में पारित हो जाएगा।

संक्षेप में, एग्रीगेशन निर्भरता इंजेक्शन सिद्धांत के लिए यूएमएल प्रतिनिधित्व है , यह कंस्ट्रक्टर इंजेक्शन, सेटर इंजेक्शन या सार्वजनिक संपत्ति इंजेक्शन है।

ये सभी एग्रीगेशन हैं

सबसे तंग, कंस्ट्रक्टर इंजेक्शन ( object Bबिना मौजूद नहीं हो सकता object A)।

final class B
{
    private $a;

    public function __construct(A $a)
    {
        $this->a = $a;
    }
}

लोसर (आप object Aअंदर उपयोग कर सकते हैं या नहीं भी कर सकते हैं object B, लेकिन यदि आप करते हैं, तो आपको संभवतः इसे पहले सेट करना चाहिए)।

वाया सेटर:

final class B
{
    private $a;

    public function setA(A $a)
    {
        $this->a = $a;
    }
}

सार्वजनिक संपत्ति:

final class B
{
    public $a;
}

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


1
कोड उदाहरण देखकर वास्तव में मदद मिलती है! अंग्रेजी में बिना कोड के स्पष्टीकरण सभी इतने अस्पष्ट और व्यक्तिपरक लगते हैं।
निको बेलिक

1

वर्तमान यूएमएल मानक के एक अंश के अलावा:

11.5.4 संघ - शब्दार्थ - अंकन

[...] एक बाइनरी एसोसिएशन का एकत्रीकरण = एकत्रीकरण के साथ एक छोर हो सकता है :: साझा या एकत्रीकरण = एकत्रीकरण हिंद: समग्र। जब एक छोर में एकत्रीकरण होता है = एकत्रीकरण किंड :: साझा किए गए एक खोखले हीरे को संघ लाइन के अंत में एक टर्मिनल अलंकरण के रूप में जोड़ा जाता है, जो एकत्रीकरण = एकत्रीकरण के साथ चिह्नित अंत के विपरीत होता है। संघों के लिए हीरा हीरे के अंकन से कहीं अधिक छोटा होगा। एकत्रीकरण के साथ एक संघ = एकत्रीकरण किंड :: इसी तरह समग्र अंत में एक हीरा होता है, लेकिन हीरे में भरा होने में भिन्न होता है। […]

9.5.4 वर्गीकरण - गुण - संकेतन

[…] कभी-कभी किसी संपत्ति का उपयोग उन परिस्थितियों को मॉडल करने के लिए किया जाता है जिसमें एक उदाहरण का उपयोग एक समूह को एक उदाहरण के समूह के साथ करने के लिए किया जाता है; इसे एकत्रीकरण कहा जाता है। ऐसी परिस्थितियों का प्रतिनिधित्व करने के लिए, एक संपत्ति में एक एकत्रीकरण संपत्ति होती है, प्रकार की एकत्रीकरण; पूरे समूह का प्रतिनिधित्व करने वाले उदाहरण को संपत्ति के मालिक द्वारा वर्गीकृत किया जाता है, और समूह के व्यक्तियों का प्रतिनिधित्व करने वाले उदाहरणों को संपत्ति के प्रकार द्वारा वर्गीकृत किया जाता है। एग्रीगेशन किंड निम्नलिखित शाब्दिक मूल्यों के साथ एक गणना है:

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

[...]


0

मैंने पहले ही स्टाकेवरफ्लो पर जवाब पोस्ट कर दिया है

मूल रूप से, एक एकत्रीकरण एक साधारण संघ की तुलना में अधिक मजबूत होता है, लेकिन एकत्रित वस्तुएं एक साधारण संघ के साथ एक दूसरे के बिना "जीवित" चल सकती हैं।

एक रचना एक एकत्रीकरण से भी अधिक मजबूत है क्योंकि एकत्रित वर्ग को अन्य वर्गों द्वारा एकत्र नहीं किया जा सकता है। इसका "जीवन" कंटेनर पर निर्भर करता है।

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