Thật đáng ngạc nhiên là có bao nhiêu sự nhầm lẫn tồn tại về sự phân biệt giữa tổng thể - tổng thể các khái niệm liên kết và thành phần . Vấn đề chính là sự hiểu lầm phổ biến (ngay cả giữa các nhà phát triển phần mềm chuyên nghiệp và giữa các tác giả của UML) rằng khái niệm thành phần bao hàm sự phụ thuộc vòng đời giữa tổng thể và các bộ phận của nó sao cho các bộ phận không thể tồn tại mà không có tổng thể. Nhưng quan điểm này bỏ qua thực tế là cũng có những trường hợp liên kết một phần với các bộ phận không thể chia sẻ, nơi các bộ phận có thể tách rời và tồn tại sau sự phá hủy toàn bộ.
Trong tài liệu đặc tả UML, định nghĩa của thuật ngữ "thành phần" luôn ngụ ý các phần không thể chia sẻ, nhưng vẫn chưa rõ ràng đâu là đặc tính xác định của "thành phần" và đâu chỉ là đặc tính tùy chọn. Ngay cả trong phiên bản mới (tính đến năm 2015), UML 2.5, sau khi cố gắng cải thiện định nghĩa của thuật ngữ "thành phần", nó vẫn còn mơ hồ và không cung cấp bất kỳ hướng dẫn nào về cách lập mô hình liên kết một phần với không các bộ phận có thể chia sẻ được trong đó các bộ phận có thể được tách rời và tồn tại sau sự phá hủy, toàn bộ trái ngược với trường hợp các bộ phận không thể tách rời và bị phá hủy cùng với toàn bộ. Họ nói
Nếu một đối tượng tổng hợp bị xóa, tất cả các thể hiện bộ phận của nó là đối tượng sẽ bị xóa cùng với nó.
Nhưng đồng thời họ cũng nói
Một đối tượng bộ phận có thể bị xóa khỏi đối tượng tổng hợp trước khi đối tượng kết hợp bị xóa và do đó không bị xóa như một phần của đối tượng tổng hợp.
Sự nhầm lẫn này chỉ ra sự không đầy đủ của định nghĩa UML, định nghĩa này không tính đến sự phụ thuộc vòng đời giữa các thành phần và vật liệu tổng hợp. Do đó, điều quan trọng là phải hiểu cách định nghĩa UML có thể được nâng cao bằng cách giới thiệu một khuôn mẫu UML cho các thành phần << không thể tách rời >> trong đó các thành phần không thể tách rời khỏi tổng hợp của chúng và do đó, phải bị phá hủy bất cứ khi nào tổ hợp của chúng bị phá hủy.
1) Thành phần
Như Martin Fowler đã giải thích , vấn đề chính để xác định đặc điểm của bố cục là "một đối tượng chỉ có thể là một phần của một mối quan hệ bố cục". Điều này cũng được giải thích trong bài đăng blog tuyệt vời Thành phần UML so với Tổng hợp và Hiệp hội của Geert Bellekens. Ngoài đặc điểm xác định này của một chế phẩm (có các bộ phận độc quyền hoặc không thể chia sẻ ), một chế phẩm cũng có thể đi kèm với sự phụ thuộc vòng đời giữa hỗn hợp và các thành phần của nó. Trên thực tế, có hai loại phụ thuộc như vậy:
- Bất cứ khi nào một thành phần phải luôn được gắn vào một tổng hợp, hoặc nói cách khác, khi nó có một tổng hợp bắt buộc , được thể hiện bằng sự đa dạng "chính xác một" ở cạnh tổng hợp của đường thành phần, thì nó phải được sử dụng lại trong (hoặc gắn lại vào) một tổ hợp khác, hoặc bị phá hủy, khi tổ hợp hiện tại của nó bị phá hủy. Điều này được minh họa bởi thành phần giữa
Person
và Heart
, được hiển thị trong sơ đồ bên dưới. Trái tim bị phá hủy hoặc được cấy ghép cho người khác khi chủ nhân của nó đã chết.
- Bất cứ khi nào một thành phần không thể tách rời khỏi tổ hợp của nó, hay nói cách khác, khi nó không thể tách rời , thì và chỉ khi đó, thành phần đó phải bị phá hủy, khi tổ hợp của nó bị phá hủy. Một ví dụ về bố cục như vậy với các phần không thể tách rời là bố cục giữa
Person
và Brain
.
Tóm lại, sự phụ thuộc vòng đời chỉ áp dụng cho các trường hợp cụ thể của thành phần, nhưng không áp dụng chung, do đó chúng không phải là một đặc tính xác định.
Thông số kỹ thuật của UML nêu rõ: "Một phần có thể bị xóa khỏi thể hiện hỗn hợp trước khi đối tượng tổng hợp bị xóa và do đó không bị xóa như một phần của đối tượng tổng hợp." Trong ví dụ về a Car
- Engine
thành phần, như được hiển thị trong sơ đồ sau, rõ ràng là trường hợp động cơ có thể được tách ra khỏi ô tô trước khi ô tô bị phá hủy, trong trường hợp này động cơ không bị phá hủy và có thể được sử dụng lại. Điều này được ngụ ý bởi số không hoặc một số ở cạnh tổng hợp của đường bố cục.
Sự đa dạng của liên kết của một thành phần kết thúc ở phía kết hợp là 1 hoặc 0..1, tùy thuộc vào thực tế nếu các thành phần có một kết hợp bắt buộc (phải được gắn vào một tổng hợp) hay không. Nếu các thành phần không thể tách rời , điều này ngụ ý rằng chúng có một tổ hợp bắt buộc.
2) Tổng hợp
Tập hợp là một dạng liên kết đặc biệt khác với ý nghĩa dự định của mối quan hệ một phần, trong đó các phần của tổng thể có thể được chia sẻ với các phần tử khác. Ví dụ: chúng ta có thể lập mô hình tổng hợp giữa các lớp DegreeProgram
và Course
, như được hiển thị trong sơ đồ sau, vì một khóa học là một phần của chương trình cấp bằng và một khóa học có thể được chia sẻ giữa hai hoặc nhiều chương trình cấp bằng (ví dụ: bằng kỹ sư có thể chia sẻ điểm C. khóa học lập trình với bằng khoa học máy tính).
Tuy nhiên, khái niệm tập hợp với các phần có thể chia sẻ thực sự không có nhiều ý nghĩa, vì vậy nó không có bất kỳ tác động nào đến việc triển khai và do đó, nhiều nhà phát triển không muốn sử dụng hình thoi trắng trong sơ đồ lớp của họ, mà chỉ mô hình hóa một liên kết đơn giản. thay thế. Thông số kỹ thuật của UML cho biết: "Ngữ nghĩa chính xác của tập hợp được chia sẻ thay đổi tùy theo khu vực ứng dụng và trình tạo mô hình".
Đa số liên kết của một tập hợp kết thúc ở toàn bộ phía có thể là bất kỳ số nào (*) bởi vì một phần có thể thuộc về hoặc được chia sẻ giữa bất kỳ số sỉ nào.