การรวมตัวกับองค์ประกอบ


206

ฉันเข้าใจว่าองค์ประกอบใดที่อยู่ใน OOP แต่ฉันไม่สามารถเข้าใจอย่างชัดเจนว่าการรวมคืออะไร มีคนอธิบายได้ไหม

คำตอบ:


322

กฎง่าย ๆ :

  1. "เจ้าของ" B = องค์ประกอบ: B ไม่มีความหมายหรือวัตถุประสงค์ในระบบโดยไม่มี
  2. A "ใช้" B = การรวม: B มีอยู่อย่างอิสระ (ตามแนวคิด) จาก A

ตัวอย่างที่ 1:

บริษัท คือการรวมกลุ่มของผู้คน บริษัท เป็นองค์ประกอบของบัญชี เมื่อ บริษัท หยุดทำธุรกิจบัญชีของตนหยุดอยู่ แต่ผู้คนยังคงมีอยู่

ตัวอย่างที่ 2: (ประยุกต์ง่ายมาก)

ตัวแก้ไขข้อความเป็นเจ้าของบัฟเฟอร์ (องค์ประกอบ) Text Editor ใช้ไฟล์ (การรวม) เมื่อตัวแก้ไขข้อความถูกปิดบัฟเฟอร์จะถูกทำลาย แต่ตัวไฟล์เองจะไม่ถูกทำลาย


11
ดังนั้นรถยนต์คือการรวมหรือส่วนประกอบของมัน
reinierpost

2
และการรวมตัวแตกต่างจากความสัมพันธ์อื่นระหว่างหน่วยงานสองประเภทอย่างไร
reinierpost

55
@reinierpost ในความเป็นจริงแล้วรถยนต์คือการรวมชิ้นส่วนและชิ้นส่วนเป็นเพียงการรวมตัวของโมเลกุล ... อย่างไรก็ตามในแบบจำลองทุกอย่างขึ้นอยู่กับความต้องการของคุณ จำเป็นหรือไม่ที่จะต้องรักษาเครื่องยนต์เป็นเอนทิตีแยกต่างหากเพื่อให้คุณสามารถติดตามอายุการใช้งานของเครื่องยนต์ได้อย่างอิสระ? คุณสามารถนำเครื่องยนต์เดียวกันกลับมาใช้ในรถคันอื่นได้หรือไม่? ถ้าเป็นเช่นนั้นคุณอาจต้องการรวม มิฉะนั้นคุณต้องการองค์ประกอบเนื่องจากคุณไม่สนใจเครื่องยนต์ที่ไม่ได้เป็นส่วนหนึ่งของรถยนต์และคุณไม่สนใจเครื่องยนต์ที่ใช้ซ้ำ
Curtis Batt

3
สิ่งที่ขาดหายเป็นตัวอย่างการดำเนินงานเพื่อความเข้าใจที่สมบูรณ์ ...
Chesnokov Yuriy

1
เมื่อพนักงาน บริษัท หยุดทำธุรกิจอะไร พนักงานและผู้คนต่างกันใช่มั้ย ดังนั้นฉันสามารถพูดได้ว่า บริษัท เป็นองค์ประกอบของพนักงาน?
arjun

36

จากhttp://en.wikipedia.org/wiki/Object_composition

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

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

-

อัปเดต: ขอโทษ - คำตอบนี้ง่ายเกินไปในการเข้าใจถึงปัญหาหลังเหตุการณ์

c.batt ให้คำจำกัดความที่ยอดเยี่ยมในคำตอบของเขา: การรวมตัวกับองค์ประกอบ


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

1
มันไม่มีอะไรเกี่ยวข้องกับการทำลายล้าง! UML ไม่ได้กำหนดระบบการรวบรวมขยะ
ชื่อที่ปรากฏ

2
ฉันคิดว่าลิงก์วิกิพีเดียกำลังได้รับการสะท้อนกลับอย่างรวดเร็ว แต่นี่เป็นคำจำกัดความที่แย่มาก - เนื่องจาก @bold ชี้ให้เห็นว่าความสัมพันธ์เหล่านี้ไม่มีส่วนเกี่ยวข้องกับ GC สิ่งนี้ยังแยกออกจากกันเมื่อวัตถุคือองค์ประกอบของวัตถุอื่นสองชิ้นเช่นลูกบอลในการเชื่อมต่อลูกร่วมแขนขาเทียมที่สอง ความสัมพันธ์ขององค์ประกอบเกี่ยวกับการพึ่งพาการทำงาน
Steven A. Lowe

1
ฉันเห็นด้วยว่าคำตอบของฉันขาดอย่างรุนแรง - แต่บทความ
WikiPedia

ความแตกต่างระหว่างองค์ประกอบและการรวมมีความชัดเจน ปัญหาของการรวมตัวกันคือมันไม่ชัดเจนว่ามันแตกต่างจากการเชื่อมโยงทั่วไป
reinierpost

20

ไม่มีคำอธิบายเดียว ผู้เขียนที่แตกต่างกันหมายถึงสิ่งต่าง ๆ โดยรวม ส่วนใหญ่ไม่ได้หมายถึงอะไรที่เฉพาะเจาะจงจริงๆ


4
นี่คือคำตอบที่ถูกต้อง ผมเคยอ่านในหนังสือสองเล่มหนึ่งของพวกเขาถูกมาร์ตินฟาวเลอร์ของUML กลั่น
davidhaskins


17
  • องค์ประกอบเป็นสมาคม

  • การรวมตัวเป็นสมาคม

  • องค์ประกอบเป็นสมาคมที่แข็งแกร่ง (ถ้าชีวิตของวัตถุที่มีอยู่ทั้งหมดขึ้นอยู่กับวัตถุภาชนะมันจะเรียกว่าสมาคมที่แข็งแกร่ง)

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

ตัวอย่าง:

class Contained {
    public void disp() {
        System.out.println("disp() of Contained A");
    }
}

public class Container {
    private Contained c;

    //Composition
    Container() {
        c = new Contained(); 
    }

    //Association 
    public Contained getC() {
        return c;
    }

    public void setC(Contained c) {
        this.c = c;
    }     

    public static void main(String[] args) {
        Container container = new Container();
        Contained contained = new Contained();
        container.setC(contained);
    } 
}

2
อะไรคือความแตกต่างระหว่างการรวมตัวและการรวมกลุ่มที่ไม่ใช่การรวมตัวกันหรือการรวมตัว?
reinierpost

11

องค์ประกอบ (ส่วนประสม) เป็นวิธีการรวมวัตถุหรือประเภทข้อมูลที่เรียบง่ายเข้ากับวัตถุที่ซับซ้อนมากขึ้น องค์ประกอบเป็นหน่วยการสร้างที่สำคัญของโครงสร้างข้อมูลพื้นฐานจำนวนมาก

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

╔═══════════╦═════════════════════════╦═══════════════════════╗
║           ║       Aggregation       ║      Composition      ║
╠═══════════╬═════════════════════════╬═══════════════════════╣
║ Life time ║ Have their own lifetime ║ Owner's life time     ║
║ Relation  ║ Has                     ║ part-of               ║
║ Example   ║ Car has driver          ║ Engine is part of Car ║
╚═══════════╩═════════════════════════╩═══════════════════════╝

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

สัญลักษณ์ UML สำหรับการพึ่งพาชนิดต่าง ๆ ระหว่างสองคลาส ป้อนคำอธิบายรูปภาพที่นี่

ส่วนประกอบ : เนื่องจากเครื่องยนต์เป็นส่วนหนึ่งของรถยนต์ความสัมพันธ์ระหว่างพวกเขาคือองค์ประกอบ นี่คือวิธีการใช้งานระหว่างคลาส Java

public class Car {
    //final will make sure engine is initialized
    private final Engine engine;  

    public Car(){
       engine  = new Engine();
    }
}

class Engine {
    private String type;
}

การรวม : เนื่องจากองค์กรมีบุคคลในฐานะพนักงานความสัมพันธ์ระหว่างพวกเขาคือการรวม นี่คือลักษณะที่ปรากฏในแง่ของคลาส Java

public class Organization {
    private List employees;
}


public class Person {
    private String name;   
}

แหล่ง


นี้ไม่ได้ดูเหมือนจะนำเสนออะไรที่สำคัญกว่าจุดทำและอธิบายในก่อน 12 คำตอบ
ริ้น

ค่อนข้างมั่นใจว่าหนังสือจะมีอยู่ได้หากไม่มีห้องสมุด ตัวอย่างที่ไม่ดี!
T Blank

ที่นี่รายชื่อพนักงานเป็นส่วนหนึ่งของวัตถุองค์กร สิ่งนี้จะเป็นการรวมตัวกันได้อย่างไร
Salman Muhammad Ayub

การเชื่อมโยงแตกต่างจากการรวมตัวอย่างไร
reinierpost

ฉันรักคำตอบนี้ ในที่สุดก็อธิบายให้ฉันอย่างถูกต้องว่าความแตกต่างระหว่างการรวมและองค์ประกอบคืออะไร
PandasRocks

6

การรวมเป็นคอลเลคชันที่เรียบง่ายเหมือนถุงหินอ่อน

องค์ประกอบหมายถึงการพึ่งพาภายใน / การทำงานเช่นบานพับบนกล่อง

รถยนต์รวมผู้โดยสาร พวกเขาเข้าและออกโดยไม่ทำลายฟังก์ชั่นของรถ

ยางเป็นส่วนประกอบ ลบหนึ่งและรถไม่ทำงานอย่างถูกต้อง

[หมายเหตุ: ยางอะไหล่รวมกัน!]


1

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


0

ความหมายชุดทั้งหมดทำจากชุดย่อยใช่มั้ย ดังนั้น:

  • การรวมตัวกันคือเมื่อส่วนย่อยเหล่านั้นมีอยู่เป็นอิสระจากชุดพ่อ ในฐานะที่เป็นจอภาพสามารถถอดปลั๊กจากคอมพิวเตอร์เพื่อเชื่อมต่อกับอีก

  • องค์ประกอบคือเมื่อส่วนย่อยเหล่านั้นขึ้นอยู่กับการดำรงอยู่ของพ่อตั้ง ใบเป็นส่วนหนึ่งของต้นไม้หรือตับเป็นส่วนหนึ่งของร่างกาย

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


-1

ตัวอย่างง่ายๆเกี่ยวกับวิธีนี้:

อาร์เรย์ของวัตถุเป็นองค์ประกอบ อาร์เรย์ของพอยน์เตอร์ไปยังวัตถุคือการรวม

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


3
นี้ดูเหมือนจะไม่เพิ่มอะไรที่สำคัญกว่าจุดทำและอธิบายในก่อน 11 คำตอบ
ริ้น

ไม่เห็นด้วยด้วยความนับถือ @gnat นี่เป็นตัวอย่างที่มีประโยชน์เกี่ยวกับวิธีการใช้งานทั้งสองอย่าง ผู้คนเรียนรู้ได้ดีขึ้นด้วยตัวอย่าง (ฉันมาที่นี่เพื่อตรวจสอบความเข้าใจของฉันว่าสมาชิกตัวชี้น่าจะเป็นการรวมตัวและเป็นสมาชิกของออบเจกต์เป็นคำตอบเดียวที่จะตอบคำถามนี้โดยตรง)
Bob Stein
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.