เครื่องหมายแผนภาพคลาส UML: ความแตกต่างระหว่างสมาคมการรวมและการจัดองค์ประกอบ


39

ฉันสับสนเกี่ยวกับสัญลักษณ์บางอย่างของแผนภาพคลาส UML

ป้อนคำอธิบายรูปภาพที่นี่

ค่อนข้างแน่ใจว่าฉันรู้ว่าสมาคมหมายถึงอะไร ความสัมพันธ์ระหว่างอินสแตนซ์ของสองคลาสที่อินสแตนซ์ของคลาสหนึ่งจำเป็นต้องทราบเกี่ยวกับอินสแตนซ์ของคลาสที่สองเพื่อที่จะทำงานได้ - เป็นความสัมพันธ์ของสมาคม สมาคมมักหมายถึงคลาส A มีการอ้างอิง (ฟิลด์) กับอินสแตนซ์ของคลาส B

อย่างไรก็ตามฉันมีปัญหาในการทำความเข้าใจว่าลูกศรการรวมและการจัดองค์ประกอบหมายถึงอะไร ความสับสนส่วนหนึ่งของฉันเกิดจากการเผชิญหน้ากับคำจำกัดความต่าง ๆ ของสัญลักษณ์เหล่านี้

คำจำกัดความสองประการของสัญลักษณ์การรวม :

คำจำกัดความที่ 1:สัญกรณ์การรวมตัวระหว่างสองคลาสนั้นเหมาะสมเมื่อใดก็ตามที่อินสแตนซ์ของคลาส A เก็บชุดอินสแตนซ์ของคลาส B (เช่น List, Array หรืออะไรก็ตาม)

คำจำกัดความที่ 2:ลิงค์รวมระหว่างสองคลาสนั้นเหมาะสมถ้าอินสแตนซ์ของคลาส A มีการอ้างอิงถึงอินสแตนซ์ของคลาส B และอินสแตนซ์ B นั้นขึ้นอยู่กับวงจรชีวิตของอินสแตนซ์ A ความหมาย: เมื่ออินสแตนซ์ของคลาส A ถูกลบดังนั้นอินสแตนซ์ของคลาส B อินสแตนซ์ของคลาส B จะมีอยู่ทั้งหมดโดยอินสแตนซ์ของคลาส A ซึ่งตรงข้ามกับอินสแตนซ์ของคลาส A เพียงเป็นเจ้าของการอ้างอิงถึงอินสแตนซ์ของ คลาส B (ซึ่งเป็นสมาคมปกติ)

เกี่ยวกับความหมายของการจัดองค์ประกอบและความแตกต่างจากสัญกรณ์การรวมฉันไม่แน่ใจ

โปรดอธิบายคำจำกัดความและช่วยฉันเข้าใจ ตัวอย่างคอนกรีตยินดีต้อนรับ


คำจำกัดความ 2 ฟังดูเหมือนคำจำกัดความขององค์ประกอบมากกว่าการรวม นิยาม 1 ฟังดูค่อนข้างถูกต้อง
jbx

คำตอบ:


32

การเชื่อมโยงทั้งสามสมาคมการรวมและการจัดองค์ประกอบเป็นชนิดของระดับความสัมพันธ์ที่ใกล้ชิดกันระหว่างสองคลาส

ที่ปลายด้านหนึ่งของมาตราส่วนจะมีสมาคมซึ่งวัตถุของสองชั้นสามารถรู้เกี่ยวกับกันและกัน แต่มันไม่ส่งผลกระทบต่ออายุการใช้งานของกันและกัน วัตถุสามารถมีอยู่อย่างอิสระและวัตถุคลาส A รู้เกี่ยวกับวัตถุคลาส B ที่สามารถเปลี่ยนแปลงได้ตลอดเวลา

อีกด้านหนึ่งของเครื่องชั่งมีองค์ประกอบ องค์ประกอบหมายถึงความสัมพันธ์ส่วนหนึ่ง - ทั้งหมดซึ่งคลาส B เป็นส่วนสำคัญของคลาส A โดยทั่วไปแล้วความสัมพันธ์นี้จะใช้หากวัตถุของคลาส A ไม่สามารถมีอยู่จริงโดยไม่ต้องมีวัตถุคลาส B

ความสัมพันธ์ในการรวมตัวกันอยู่ระหว่างปลายทั้งสองด้าน แต่ดูเหมือนว่าจะไม่มีใครเห็นด้วยที่จะทำเช่นนั้นดังนั้นจึงไม่มีคำจำกัดความที่ยอมรับกันโดยทั่วไปเกี่ยวกับความหมายของการรวม ในความหมายนั้นทั้งคำจำกัดความที่คุณพบว่าถูกต้องและถ้าคุณถาม 10 คนคุณมีความเสี่ยงที่ได้รับ 11 คำนิยามที่แตกต่างกัน


1
ขอบคุณสำหรับคำตอบ. นี่คือวิธีที่ฉันเข้าใจสิ่งต่าง ๆ โปรดบอกว่านี่เป็นคำจำกัดความที่สมเหตุสมผล 1- การเชื่อมโยงคือเมื่อใดก็ตามที่วัตถุ A ต้องทราบเกี่ยวกับวัตถุ B เพื่อให้สามารถใช้งานได้ 2- ทั้งการรวมและองค์ประกอบกำหนดความสัมพันธ์ 'ความเป็นเจ้าของ' - อินสแตนซ์ของคลาส A เป็นเจ้าของแนวคิดของอินสแตนซ์ของคลาส B แต่อายุการใช้งานของอินสแตนซ์ B เป็นอิสระจากอายุการใช้งานของอินสแตนซ์ A ตัวอย่างเช่นแผนกที่มีพนักงาน แผนก 'เป็นเจ้าของ' שמพนักงาน แต่มันจะดำเนินต่อไปหากไม่มีแผนก การประพันธ์เป็นเหมือนการรวมตัว แต่
Aviv Cohn

1
อายุการใช้งานของอินสแตนซ์ B จะขึ้นอยู่กับอายุการใช้งานของอินสแตนซ์ A ความสัมพันธ์ 'ความเป็นเจ้าของ' ที่แข็งแกร่งขึ้น ตัวอย่างเช่น: รถยนต์และล้อ รถ 'มีทั้งหมด' ล้อ อินสแตนซ์ Wheel จะไม่ใช้งานต่อไปหากไม่มีอินสแตนซ์ Car ที่บรรจุอยู่ นี่เป็นความแตกต่างที่สมเหตุสมผลหรือไม่?
Aviv Cohn

@Prog: ใช่นั่นคือคำจำกัดความที่สมเหตุสมผล เพียงจำไว้ว่าคนอื่นอาจไม่ใช้คำจำกัดความนั้นและคุณอาจจำเป็นต้องอธิบายการใช้การรวมตัวกับพวกเขา
Bart van Ingen Schenau

สิ่งที่คุณจะพูดว่าเป็นคำจำกัดความที่พบบ่อยที่สุดสำหรับสัญกรณ์การรวม? คำจำกัดความที่ฉันใช้อยู่ คำนิยาม 'มีชุดของ'? อื่น ๆ อีก?
Aviv Cohn

การอ้างอิงถึงมาตรฐาน OMG ด้านล่างเป็นคำแนะนำ ความสัมพันธ์และองค์ประกอบนั้นค่อนข้างตรงไปตรงมา การรวมตัวเป็นสิ่งที่สั่นคลอน ในทางปฏิบัติฉันพบว่าการทดสอบ 'ส่วนหนึ่งของ' นั้นใช้งานได้ดี ('ความเป็นเจ้าของ' เป็นวิธีที่ดีที่สุดในการคิดเรื่องนี้) บุคคลสามารถเป็นส่วนหนึ่งของสโมสรได้ดังนั้นสโมสรจึงรวมคนเข้าด้วยกัน เมื่อสโมสรถูกทำลายผู้คนก็ยังคงมีอยู่
Huliax

10

องค์ประกอบคือเมื่อobject Aมีobject Bและยังเป็นผู้รับผิดชอบสำหรับการสร้างobject Aobject B

ความสัมพันธ์ขององค์ประกอบ

เรามีคลาส A ซึ่งจะถูกใช้โดยคลาส B

final class A
{
}

มีหลายตัวเลือกว่าองค์ประกอบอาจมีลักษณะเป็นอย่างไร

องค์ประกอบการเริ่มต้นโดยตรง:

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

องค์ประกอบการเริ่มต้นของตัวสร้าง

final class B
{
    private $a;

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

องค์ประกอบการเริ่มต้น Lazy

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 DateTimeใน php หรือ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ล้มเหลวจะไม่มีการส่งผ่านในตอนแรก

ในระยะสั้นการรวมตัวกันเป็นตัวแทนของ UML สำหรับหลักการฉีดพึ่งพาไม่ว่าจะเป็นการสร้างคอนสตรัคเตอร์ฉีด setter หรือฉีดทรัพย์สินสาธารณะ

เหล่านี้คือการรวมตัวทั้งหมด

ตัวสร้างคอนสตรัคที่แน่นที่สุด ( object Bไม่มีอยู่จริงหากไม่มีobject A)

final class B
{
    private $a;

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

Looser (คุณอาจใช้หรือไม่ใช้object Aภายในobject Bแต่ถ้าคุณทำคุณควรตั้งค่าไว้ก่อน)

ผ่านตัวตั้งค่า:

final class B
{
    private $a;

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

ผ่านทรัพย์สินสาธารณะ:

final class B
{
    public $a;
}

ไม่มีวิธีที่ดีที่จะพิสูจน์การใช้งานของการรวมผ่านการประพันธ์ถ้าทุกสิ่งที่คุณกำลังใช้คือการใช้งานที่เป็นรูปธรรมของคลาส แต่เมื่อคุณเริ่มการฉีดอินเทอร์เฟซหรือในกรณีของคลาสนามธรรม C ++ ทันใดนั้น ปฏิบัติตามสัญญาของคุณ


1
การดูตัวอย่างโค้ดช่วยได้จริงๆ! คำอธิบายเป็นภาษาอังกฤษโดยไม่ต้องใช้รหัสดูเหมือนจะคลุมเครือและเป็นอัตนัย
Niko Bellic

1

นอกจากข้อความที่ตัดตอนมาของมาตรฐาน UML ปัจจุบัน:

11.5.4 สมาคม - ความหมาย - สัญกรณ์

[... ] ความสัมพันธ์แบบไบนารีอาจมีปลายด้านหนึ่งที่มีการรวม = AggregationKind :: shared หรือ aggregation = AggregationKind :: composite เมื่อปลายด้านหนึ่งมีการรวม = AggregationKind :: ร่วมกันเพชรกลวงจะถูกเพิ่มเป็นเครื่องประดับขั้วที่ปลายของเส้นตรงข้ามสมาคมท้ายที่มีเครื่องหมายรวม = AggregationKind ฯ :: ที่ใช้ร่วมกัน เพชรจะมีขนาดเล็กกว่าสัญกรณ์เพชรสำหรับสมาคมอย่างเห็นได้ชัด สมาคมที่มีการรวม = AggregationKind :: คอมโพสิตก็มีเพชรที่ปลายที่สอดคล้องกัน แต่แตกต่างกันในการเติมเพชร [... ]

9.5.4 การจำแนกประเภท - คุณสมบัติ - สัญกรณ์

[…] บางครั้งคุณสมบัติใช้เพื่อจำลองสถานการณ์ซึ่งอินสแตนซ์หนึ่งถูกใช้เพื่อจัดกลุ่มชุดอินสแตนซ์ร่วมกัน สิ่งนี้เรียกว่าการรวมตัว เพื่อเป็นตัวแทนของสถานการณ์ดังกล่าวสถานที่ให้บริการมีคุณสมบัติการรวมของประเภท AggregationKind; อินสแตนซ์ที่เป็นตัวแทนของกลุ่มทั้งหมดถูกจัดประเภทโดยเจ้าของคุณสมบัติและอินสแตนซ์ที่แสดงถึงกลุ่มที่จัดกลุ่มถูกจำแนกตามประเภทของคุณสมบัติ AggregationKind เป็นการแจงนับที่มีค่าตามตัวอักษรต่อไปนี้:

  • none : ระบุว่าทรัพย์สินไม่มีความหมายของการรวม
  • ใช้ร่วมกัน : ระบุว่าทรัพย์สินมีความหมายรวมที่ใช้ร่วมกัน ซีแมนทิกส์ที่แม่นยำของการรวมที่ใช้ร่วมกันนั้นแตกต่างกันไปตามพื้นที่แอพพลิเคชันและตัวสร้างโมเดล
  • Composite : บ่งชี้ว่า Property ถูกรวม compositely นั่นคือวัตถุคอมโพสิตมีความรับผิดชอบต่อการดำรงอยู่และการเก็บรักษาของวัตถุประกอบ (ดูคำจำกัดความของชิ้นส่วนใน 11.2.3) การรวมคอมโพสิตเป็นรูปแบบที่แข็งแกร่งของการรวมที่ต้องมีวัตถุส่วนหนึ่งจะรวมอยู่ในวัตถุคอมโพสิตมากที่สุดครั้งละ ถ้าวัตถุคอมโพสิตถูกลบอินสแตนซ์ส่วนหนึ่งของทั้งหมดที่เป็นวัตถุจะถูกลบด้วย

[ ... ]


0

ฉันโพสต์คำตอบไว้ที่ Stackoverflowแล้ว

โดยพื้นฐานแล้วการรวมกันนั้นแข็งแกร่งกว่าการรวมตัวแบบง่าย ๆ แต่การรวมตัวกันของวัตถุนั้นสามารถดำเนินต่อไปได้ "ที่มีชีวิต" โดยที่ไม่มีการรวมตัวกันเหมือนกับการเชื่อมโยงแบบธรรมดา

การแต่งเพลงนั้นแข็งแกร่งกว่าการรวมเนื่องจากคลาสที่รวมนั้นไม่สามารถรวมได้โดยคลาสอื่น "ชีวิต" ของมันขึ้นอยู่กับภาชนะบรรจุ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.