Tổng hợp so với thành phần


206

Tôi hiểu thành phần nào trong OOP, nhưng tôi không thể có được một ý tưởng rõ ràng về Uẩn là gì. Ai đó có thể giải thích?

Câu trả lời:


322

Quy tắc đơn giản:

  1. A "sở hữu" B = Thành phần: B không có ý nghĩa hoặc mục đích trong hệ thống mà không có A
  2. A "sử dụng" B = Tập hợp: B tồn tại độc lập (về mặt khái niệm) từ A

Ví dụ 1:

Một công ty là một tập hợp của người dân. Công ty là một thành phần của Tài khoản. Khi một Công ty ngừng hoạt động, Tài khoản của Công ty không còn tồn tại nhưng Mọi người vẫn tiếp tục tồn tại.

Ví dụ 2: (rất đơn giản)

Trình soạn thảo văn bản sở hữu bộ đệm (thành phần). Trình soạn thảo văn bản sử dụng tệp (tổng hợp). Khi Trình soạn thảo văn bản được đóng, Bộ đệm bị hủy nhưng Bản thân tệp không bị hủy.


11
Vì vậy, một chiếc xe là một tổng hợp hoặc một thành phần của các bộ phận của nó?
Revierpost

2
Và tập hợp khác với bất kỳ mối quan hệ khác giữa hai loại thực thể như thế nào?
Revierpost

55
@reinierpost Trong thực tế , một chiếc xe hơi là tập hợp của các bộ phận và các bộ phận chỉ đơn giản là một tập hợp các phân tử ... Tuy nhiên, trong một mô hình , tất cả phụ thuộc vào yêu cầu của bạn. Có quan trọng để coi động cơ là một thực thể riêng biệt để bạn có thể theo dõi tuổi thọ của nó độc lập với chiếc xe? Bạn có thể tái sử dụng chính xác động cơ trong một chiếc xe khác? Nếu vậy, thì bạn có thể muốn tổng hợp. Mặt khác, bạn muốn có một tác phẩm vì bạn không quan tâm đến động cơ không phải là một phần của ô tô, bạn cũng không quan tâm đến việc tái sử dụng động cơ.
Curtis Batt

3
những gì còn thiếu là một ví dụ triển khai cho sự hiểu biết hoàn toàn ...
Chesnokov Yuriy

1
Còn nhân viên khi một công ty ngừng kinh doanh thì sao? Nhân viên và mọi người là những thực thể khác nhau phải không? Vì vậy, tôi có thể nói công ty là thành phần của nhân viên?
arjun

36

Từ http://en.wikipedia.org/wiki/Object_cysis

Tập hợp khác với thành phần thông thường ở chỗ nó không bao hàm quyền sở hữu. Trong thành phần, khi đối tượng sở hữu bị phá hủy, các đối tượng được chứa cũng vậy. Tóm lại, điều này không nhất thiết đúng. Ví dụ, một trường đại học sở hữu nhiều khoa khác nhau (ví dụ: hóa học) và mỗi khoa có một số giáo sư. Nếu trường đại học đóng cửa, các khoa sẽ không còn tồn tại, nhưng các giáo sư trong các khoa đó sẽ tiếp tục tồn tại. Do đó, một trường đại học có thể được coi là một thành phần của các khoa, trong khi các khoa có một tập hợp các giáo sư. Ngoài ra, một giáo sư có thể làm việc ở nhiều bộ phận, nhưng một bộ phận không thể là một phần của nhiều trường đại học.

Vì vậy - trong khi bạn có mối quan hệ sở hữu với thành phần, đối tượng sở hữu cũng bị hủy khi chủ sở hữu - một tập hợp (và các đối tượng được chứa) có thể tồn tại độc lập.

-

Cập nhật: Lời xin lỗi - câu trả lời này quá đơn giản trong nhận thức muộn màng.

c.batt cung cấp một định nghĩa xuất sắc trong câu trả lời của ông: Tổng hợp so với Thành phần


3
Trong ví dụ bạn trích dẫn bố cục là một-nhiều và tập hợp cũng có một mối quan hệ một-nhiều, mặc dù ở đây nó cũng có thể là một mối quan hệ nhiều-nhiều cho tập hợp (chúng ta có thể cho rằng có thể một giáo viên có thể dạy trong nhiều bộ phận). Trong khi đó một bộ phận không thể là một phần của nhiều trường đại học. Thành phần ngụ ý quyền sở hữu trong khi tập hợp không vượt quá mối quan hệ. Các trích dẫn là chính xác nhưng nhận xét là không.
Newtopian

1
nó không liên quan gì đến sự hủy diệt! UML không định nghĩa hệ thống thu gom rác.
Tên hiển thị

2
Tôi nghĩ rằng liên kết wikipedia đang nhận được các phản xạ phản xạ, nhưng đây là một định nghĩa khủng khiếp - như @bold chỉ ra những mối quan hệ này không liên quan gì đến GC. Điều này cũng sụp đổ khi một đối tượng là thành phần của hai đối tượng khác, chẳng hạn như quả bóng trong khớp nối nối hai chi giả. Mối quan hệ thành phần là về sự phụ thuộc chức năng.
Steven A. Lowe

1
Tôi đồng ý rằng câu trả lời của tôi rất thiếu - nhưng bài viết WikiPedia cũng vậy ...
HorusKol

Sự khác biệt giữa thành phần và tổng hợp là rõ ràng. Vấn đề với tập hợp là không rõ nó khác với hiệp hội thông thường như thế nào.
Revierpost

20

Không có lời giải thích duy nhất. Các tác giả khác nhau có nghĩa là những thứ khác nhau bằng cách tổng hợp. Hầu hết không thực sự có nghĩa là bất cứ điều gì cụ thể bởi nó.


4
Đây là câu trả lời chính xác. Tôi đã đọc nó trong hai cuốn sách, một trong số đó là UML chưng cất UML của Martin Fowler .
davidhaskins


17
  • Thành phần là một Hiệp hội

  • Tập hợp là một hiệp hội

  • Thành phần là một Hiệp hội mạnh (Nếu tuổi thọ của đối tượng chứa hoàn toàn phụ thuộc vào đối tượng chứa, thì nó được gọi là liên kết mạnh)

  • Tập hợp là một Hiệp hội yếu (Nếu tuổi thọ của đối tượng chứa không phụ thuộc vào đối tượng chứa, thì nó được gọi là liên kết yếu)

Thí dụ:

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
Sự khác biệt giữa tập hợp và liên kết không phải là thành phần cũng không phải là tập hợp?
Revierpost

11

Thành phần (hỗn hợp) là một cách để kết hợp các đối tượng đơn giản hoặc các kiểu dữ liệu thành các đối tượng phức tạp hơn. Các tác phẩm là một khối xây dựng quan trọng của nhiều cấu trúc dữ liệu cơ bản

Tập hợp (bộ sưu tập) khác với thành phần thông thường ở chỗ nó không bao hàm quyền sở hữu. Trong thành phần, khi đối tượng sở hữu bị phá hủy, các đối tượng được chứa cũng vậy. Tóm lại, điều này không nhất thiết đúng

╔═══════════╦═════════════════════════╦═══════════════════════╗
║           ║       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 ║
╚═══════════╩═════════════════════════╩═══════════════════════╝

Cả hai đều biểu thị mối quan hệ giữa các đối tượng và chỉ khác nhau về sức mạnh của họ. nhập mô tả hình ảnh ở đây

Các ký hiệu UML cho loại phụ thuộc khác nhau giữa hai lớp nhập mô tả hình ảnh ở đây

Thành phần : Vì Động cơ là một phần của Xe hơi, mối quan hệ giữa chúng là Thành phần. Đây là cách chúng được thực hiện giữa các lớp 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;
}

Tập hợp : Vì Tổ chức có Người là nhân viên, nên mối quan hệ giữa họ là Tập hợp. Đây là cách chúng trông giống như về các lớp Java

public class Organization {
    private List employees;
}


public class Person {
    private String name;   
}

Nguồn


điều này dường như không cung cấp bất cứ điều gì đáng kể qua các điểm được thực hiện và giải thích trong 12 câu trả lời trước
gnat

Khá chắc chắn sách có thể tồn tại mà không cần thư viện. Ví dụ xấu!
T Trống

Ở đây Danh sách nhân viên là một phần của Tổ chức đối tượng. Làm thế nào điều này có thể được tổng hợp?
Salman Muhammad Ayub

Hiệp hội khác với tập hợp như thế nào?
Revierpost

Tôi thích câu trả lời này. Cuối cùng nó đã giải thích cho tôi chính xác sự khác biệt giữa tập hợp và thành phần là gì.
PandasRocks

6

tập hợp là một bộ sưu tập đơn giản, giống như một túi bi

thành phần ngụ ý phụ thuộc nội bộ / chức năng, như bản lề trên hộp

xe tổng hợp hành khách; họ vào và ra mà không phá vỡ chức năng của xe

Các lốp xe là thành phần; loại bỏ một và chiếc xe không còn hoạt động chính xác

[lưu ý: lốp dự phòng là tổng hợp!]


1

Tôi luôn xem thành phần là "cần một", tức là một chiếc xe cần một động cơ và tôi xem tổng hợp là "những thứ liên quan cho một mục đích". Vì vậy, với sự tương tự xe hơi, tổng hợp của tôi có thể là đại diện cho một hành trình có thể liên quan đến việc đưa một chiếc xe và hành khách lại với nhau. Hành trình không sở hữu xe hơi hay hành khách, tôi đang tổng hợp dữ liệu liên quan đến một kịch bản cụ thể. Khi hành trình hoàn thành chiếc xe và hành khách đi tiếp. Khi một chiếc xe kết thúc, chiếc xe và động cơ của nó thường bị phá hủy cùng nhau.


0

Về mặt ngữ nghĩa, tất cả các bộ được làm từ các tập hợp con, phải không? Vì thế:

  • Tập hợp là khi các tập con đó tồn tại độc lập với tập hợp cha. Vì một màn hình có thể được rút ra khỏi máy tính để kết nối với màn hình khác.

  • Thành phần là khi các tập con đó phụ thuộc vào sự tồn tại của tập hợp cha. Vì một chiếc lá là một phần của cây hoặc gan là một phần của cơ thể.

Những khái niệm này nói về loại phụ thuộc giữa hai đối tượng hoặc lớp, về mặt khái niệm. Trực tiếp trong một chương trình, trong một tập hợp, khi đối tượng cha xử lý, các đối tượng tổng hợp cũng nên được xử lý. Trong cùng một kịch bản cho một tác phẩm, các đối tượng con trai hỗn hợp sẽ tồn tại sau đó đối tượng cha phân tán.


-1

Làm thế nào về ví dụ đơn giản này:

Một mảng các đối tượng là một thành phần. Một mảng các con trỏ tới các đối tượng là một tập hợp.

Nếu tôi xóa cái đầu tiên, nội dung của nó sẽ biến mất cùng với nó. Mặt khác, cái thứ hai có thể biến mất mà không ảnh hưởng đến sự tồn tại của các thành viên trừ khi có một phương thức cụ thể xóa từng đối tượng khi con trỏ của nó bị xóa.


3
điều này dường như không thêm bất cứ điều gì đáng kể vào các điểm được thực hiện và giải thích trong 11 câu trả lời trước
gnat

Trân trọng không đồng ý, @gnat. Đây là một ví dụ hữu ích về cách hai người có thể được thực hiện. Mọi người học tốt hơn với các ví dụ. (. Tôi đến đây để kiểm tra hiểu biết của tôi rằng một thành viên con trỏ có khả năng sẽ là một tập hợp, và một thành viên đối tượng thành phần này là câu trả lời duy nhất để trực tiếp giải quyết điều đó.)
Bob Stein
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.