Các ký hiệu sơ đồ lớp UML: Sự khác biệt giữa Hiệp hội, Tập hợp và Thành phần


39

Tôi bối rối về một số ký hiệu của sơ đồ lớp UML.

nhập mô tả hình ảnh ở đây

Khá chắc chắn tôi biết Hiệp hội có nghĩa là gì. Bất kỳ mối quan hệ nào giữa các thể hiện của hai lớp, trong đó một thể hiện của một lớp cần biết về một thể hiện của lớp thứ hai để thực hiện công việc của nó - là mối quan hệ Hiệp hội. Một Hiệp hội thường có nghĩa là lớp A có một tham chiếu (trường) đến một thể hiện của lớp B.

Tuy nhiên, tôi gặp khó khăn trong việc hiểu mũi tên Tổng hợpThành phần nghĩa là gì. Một phần của sự nhầm lẫn của tôi là do gặp phải các định nghĩa khác nhau về các ký hiệu này.

Hai định nghĩa của ký hiệu Tập hợp :

Định nghĩa 1: Ký hiệu tập hợp giữa hai lớp là phù hợp bất cứ khi nào một thể hiện của lớp A chứa một tập hợp các thể hiện của lớp B (ví dụ: Danh sách, Mảng, bất cứ điều gì).

Định nghĩa 2: Liên kết tập hợp giữa hai lớp là phù hợp nếu một thể hiện của lớp A giữ tham chiếu đến một thể hiện của lớp B và thể hiện B phụ thuộc vào vòng đời của cá thể A. Ý nghĩa: Khi thể hiện của lớp A bị xóa, thì thể hiện của lớp B. Trường hợp của lớp B hoàn toàn được chứa bởi thể hiện của lớp A, trái ngược với thể hiện của lớp A chỉ đơn giản là sở hữu một tham chiếu đến thể hiện của lớp B (là hội thường xuyên).

Về ý nghĩa của ký hiệu Thành phần và nó khác với ký hiệu Tập hợp như thế nào, tôi không chắc chắn.

Hãy làm rõ các định nghĩa và giúp tôi hiểu. Ví dụ cụ thể sẽ được hoan nghênh.


Định nghĩa 2 nghe giống như định nghĩa cho Thành phần hơn là Tổng hợp. Định nghĩa 1 nghe khá đúng.
jbx

Câu trả lời:


32

Ba liên kết Hiệp hội, Tập hợp và Thành phần tạo thành một loại thang đo về mức độ chặt chẽ của hai lớp có liên quan với nhau.

Ở một đầu của thang đo, có Hiệp hội, nơi các đối tượng của hai lớp có thể biết về nhau, nhưng chúng không ảnh hưởng đến nhau suốt đời. Các đối tượng có thể tồn tại độc lập và đối tượng lớp A nào biết về đối tượng lớp B nào có thể thay đổi theo thời gian.

Ở đầu kia của thang đo, có Thành phần. Thành phần đại diện cho một phần - toàn bộ mối quan hệ sao cho lớp B là một phần không thể thiếu của lớp A. Mối quan hệ này thường được sử dụng nếu các đối tượng của lớp A không thể tồn tại một cách hợp lý mà không có đối tượng lớp B.

Mối quan hệ Tập hợp nằm ở đâu đó giữa hai đầu đó, nhưng dường như không ai đồng ý chính xác ở đâu, do đó, cũng không có định nghĩa thống nhất chung về ý nghĩa của Tập hợp. Theo nghĩa đó, cả hai định nghĩa mà bạn tìm thấy đều đúng và nếu bạn hỏi 10 người, bạn có nguy cơ nhận được 11 định nghĩa khác nhau.


1
Cảm ơn câu trả lời của bạn. Đây là cách tôi hiểu mọi thứ, xin vui lòng nói nếu đây là một định nghĩa hợp lý. 1- Hiệp hội là bất cứ khi nào một đối tượng A cần biết về đối tượng B để thực hiện chức năng của nó. 2- Cả Tập hợp và Thành phần xác định mối quan hệ 'quyền sở hữu' - một thể hiện của lớp A về mặt khái niệm sở hữu một thể hiện của lớp B. Nhưng thời gian tồn tại của thể hiện B độc lập với thời gian tồn tại của thể hiện A. Ví dụ, một bộ phận với nhân viên. Bộ phận 'sở hữu' שמ nhân viên, nhưng nó sẽ tiếp tục sống mà không có bộ phận. Thành phần giống như Tập hợp, nhưng
Aviv Cohn

1
thời gian tồn tại của cá thể B phụ thuộc vào thời gian tồn tại của cá thể A. Một mối quan hệ 'sở hữu' mạnh mẽ hơn. Ví dụ: Một chiếc xe hơi và một bánh xe. Chiếc xe 'hoàn toàn chứa' bánh xe. Phiên bản Wheel sẽ không tiếp tục sống mà không có phiên bản Xe có chứa nó. Đây có phải là một sự khác biệt hợp lý?
Aviv Cohn

@Prog: Vâng, đó là một định nghĩa hợp lý. Chỉ cần nhớ rằng những người khác có thể không chia sẻ định nghĩa đó và bạn có thể cần phải giải thích việc sử dụng tổng hợp của bạn cho họ.
Bart van Ingen Schenau

Bạn sẽ nói gì là định nghĩa phổ biến nhất cho ký hiệu Tập hợp? Định nghĩa tôi đang sử dụng? 'Có một bộ sưu tập định nghĩa'? Thứ gì khác?
Aviv Cohn

Việc tham khảo tiêu chuẩn OMG dưới đây mang tính hướng dẫn. Hiệp hội và thành phần khá đơn giản. Tập hợp là một sự chao đảo. Trong thực tế, tôi thấy rằng 'phần của' thử nghiệm hoạt động tốt ('quyền sở hữu' là một cách tối ưu để suy nghĩ về nó). Một người có thể là một phần của câu lạc bộ, do đó, một câu lạc bộ tập hợp mọi người (nó không sở hữu họ). Khi câu lạc bộ bị phá hủy, mọi người tiếp tục tồn tại.
Huliax

10

Thành phần là khi một object Achứa object Bobject Acũng chịu trách nhiệm tạo ra object B.

Mối quan hệ thành phần

Chúng tôi có một lớp A sẽ được sử dụng bởi lớp B.

final class A
{
}

Có nhiều lựa chọn như cách bố cục có thể trông.

Thành phần khởi tạo trực tiếp:

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

Thành phần khởi tạo xây dựng

final class B
{
    private $a;

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

Thành phần khởi tạo lười biếng

final class B
{
    private $a = null;

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

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

Bạn thấy điều này tạo ra một mối quan hệ chặt chẽ giữa các lớp AB. Lớp Bchỉ đơn giản là không thể tồn tại mà không có A. Đây là một vi phạm lớn của nguyên tắc tiêm phụ thuộc , trong đó nói:

Một phụ thuộc là một đối tượng có thể được sử dụng (một dịch vụ). Một mũi tiêm là việc truyền một phụ thuộc vào một đối tượng phụ thuộc (một khách hàng) sẽ sử dụng nó. Dịch vụ này là một phần của trạng thái của khách hàng. Truyền dịch vụ cho khách hàng, thay vì cho phép khách hàng xây dựng hoặc tìm dịch vụ, là yêu cầu cơ bản của mẫu.

Thành phần đôi khi có ý nghĩa, chẳng hạn như gọi new DateTimebằng php hoặc new std::vector<int>trong C ++. Nhưng thường xuyên hơn không, đó là một cảnh báo, rằng thiết kế mã của bạn là sai.

Trong trường hợp, trong đó class Ađối tượng sẽ là một đối tượng đặc biệt được sử dụng để lưu vào bộ đệm, thì đối tượng class Bđó sẽ luôn được lưu trong bộ đệm khi sử dụng class Avà bạn sẽ không có quyền kiểm soát để thay đổi động nó, điều này rất tệ.

Ngoài ra, nếu bạn sử dụng thành phần khởi tạo lười biếng , có nghĩa là bạn sẽ có một tác phẩm object B, được gọi là useA()phương thức và việc tạo ra object Asẽ thất bại, bạn object Bđột nhiên vô dụng.


Tập hợp, mặt khác, là một cách của mối quan hệ, theo nguyên tắc DI . object Bnhu cầu để sử dụng object A, sau đó bạn phải vượt qua đã tạo thể hiện của object Ađể object B, và cần sự sáng tạo của object AFail, không có gì sẽ được thông qua ở nơi đầu tiên.

Nói tóm lại, Uẩn là đại diện UML cho nguyên tắc tiêm phụ thuộc , có thể là tiêm xây dựng, tiêm setter hoặc tiêm sở hữu công cộng.

Đây là tất cả các Uẩn

Các tiêm xây dựng chặt chẽ nhất ( object Bkhông thể tồn tại mà không có object A).

final class B
{
    private $a;

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

Looser (bạn có thể hoặc không thể sử dụng object Abên trong object B, nhưng nếu bạn làm vậy, có lẽ bạn nên đặt nó trước).

Qua setter:

final class B
{
    private $a;

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

Thông qua tài sản công cộng:

final class B
{
    public $a;
}

Thực sự không có cách nào tuyệt vời để biện minh cho việc sử dụng Tập hợp trên Thành phần, nếu tất cả những gì bạn đang sử dụng là triển khai cụ thể các lớp, nhưng một khi bạn bắt đầu tiêm giao diện hoặc trong trường hợp các lớp trừu tượng C ++, đột nhiên Tập hợp sẽ là cách duy nhất để thực hiện hợp đồng của bạn


1
Xem các ví dụ mã thực sự có ích! Giải thích bằng tiếng Anh mà không có mã tất cả có vẻ rất mơ hồ và chủ quan.
Niko Bellic

1

Ngoài ra một đoạn trích của tiêu chuẩn UML hiện tại:

11.5.4 Hiệp hội - Ngữ nghĩa - Ký hiệu

[...] Một hiệp hội nhị phân có thể có một kết thúc với tập hợp = AggregationKind :: shared hoặc tổng hợp = AggregationKind :: composite. Khi một đầu có tập hợp = AggregationKind :: đã chia sẻ một viên kim cương rỗng được thêm vào như một trang trí đầu cuối ở cuối dòng Hiệp hội đối diện với đầu được đánh dấu bằng tập hợp = AggregationKind :: shared. Viên kim cương sẽ nhỏ hơn đáng kể so với ký hiệu kim cương cho các Hiệp hội. Một hiệp hội có tập hợp = AggregationKind :: composite tương tự có một viên kim cương ở đầu tương ứng, nhưng khác ở chỗ có viên kim cương được điền vào.

9.5.4 Phân loại - Thuộc tính - Ký hiệu

[Vắc] Đôi khi một Thuộc tính được sử dụng để mô hình hóa các trường hợp trong đó một trường hợp được sử dụng để nhóm lại một tập hợp các trường hợp; điều này được gọi là tổng hợp. Để thể hiện các trường hợp như vậy, Tài sản có thuộc tính tổng hợp, thuộc loại Tổng hợp; phiên bản đại diện cho toàn bộ nhóm được phân loại bởi chủ sở hữu Tài sản và các phiên bản đại diện cho các cá nhân được nhóm được phân loại theo loại Tài sản. AggregationKind là một bảng liệt kê với các giá trị theo nghĩa đen sau đây:

  • none : Cho biết rằng Tài sản không có ngữ nghĩa tổng hợp.
  • Được chia sẻ : Cho biết rằng Tài sản đã chia sẻ ngữ nghĩa tổng hợp. Ngữ nghĩa chính xác của tập hợp chia sẻ khác nhau tùy theo khu vực ứng dụng và nhà mô hình hóa.
  • Hợp chất : Biểu thị rằng Thuộc tính được tổng hợp một cách tổng hợp, tức là, đối tượng tổng hợp có trách nhiệm cho sự tồn tại và lưu trữ của các đối tượng cấu thành (xem định nghĩa của các bộ phận trong 11.2.3). Tập hợp tổng hợp là một hình thức tổng hợp mạnh đòi hỏi một đối tượng bộ phận được đưa vào tối đa một đối tượng tổng hợp tại một thời điểm. Nếu một đối tượng tổng hợp bị xóa, tất cả các thể hiện phần của nó là các đối tượng sẽ bị xóa cùng với nó.

[Càng]


0

Tôi đã đăng một câu trả lời trên Stackoverflow .

Về cơ bản, một tập hợp mạnh hơn một liên kết đơn giản nhưng các đối tượng tổng hợp có thể tiếp tục "sống" mà không có nhau như với một liên kết đơn giản.

Một thành phần thậm chí còn mạnh hơn một tập hợp vì lớp tổng hợp không thể được tổng hợp bởi các lớp khác. "Cuộc sống" của nó phụ thuộc vào container.

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.