Sungguh menakjubkan betapa banyak kebingungan yang muncul tentang perbedaan antara konsep asosiasi sebagian-keseluruhan - agregasi dan komposisi . Masalah utamanya adalah kesalahpahaman yang meluas (bahkan di antara para pengembang perangkat lunak ahli dan di antara para penulis UML) bahwa konsep komposisi menyiratkan ketergantungan siklus-hidup antara keseluruhan dan bagian-bagiannya sehingga bagian-bagian tersebut tidak dapat ada tanpa keseluruhan. Tetapi pandangan ini mengabaikan fakta bahwa ada juga kasus asosiasi sebagian-keseluruhan dengan bagian-bagian yang tidak dapat dibagikan di mana bagian-bagian tersebut dapat dilepaskan, dan bertahan dari kehancuran, keseluruhan.
Dalam dokumen spesifikasi UML, definisi istilah "komposisi" selalu menyiratkan bagian yang tidak dapat dibagikan, tetapi belum jelas apa yang mendefinisikan karakteristik dari "komposisi", dan apa yang hanya merupakan karakteristik opsional. Bahkan dalam versi baru (per 2015), UML 2.5, setelah upaya untuk meningkatkan definisi istilah "komposisi", masih tetap ambigu dan tidak memberikan panduan bagaimana memodelkan sebagian-seluruh-asosiasi dengan non- bagian-bagian yang dapat dibagikan di mana bagian-bagian tersebut dapat dilepaskan, dan bertahan dari kehancuran, keseluruhan sebagai lawan dari kasus di mana bagian-bagian tersebut tidak dapat dilepaskan dan dihancurkan bersama-sama dengan keseluruhan. Mereka bilang
Jika objek komposit dihapus, semua bagiannya yang merupakan objek juga akan terhapus.
Tapi di saat yang sama mereka juga bilang
Objek bagian dapat dihapus dari objek gabungan sebelum objek gabungan dihapus, dan dengan demikian tidak akan dihapus sebagai bagian dari objek gabungan.
Kebingungan ini menunjukkan ketidaklengkapan definisi UML, yang tidak memperhitungkan ketergantungan siklus hidup antara komponen dan komposit. Oleh karena itu, penting untuk memahami bagaimana definisi UML dapat ditingkatkan dengan memperkenalkan stereotipe UML untuk komposisi << tak terpisahkan >> di mana komponen tidak dapat dilepaskan dari kompositnya, dan, karenanya, harus dihancurkan setiap kali kompositnya dihancurkan.
1) Komposisi
Sebagaimana dijelaskan oleh Martin Fowler , masalah utama untuk mengkarakterisasi komposisi adalah bahwa "sebuah objek hanya dapat menjadi bagian dari satu hubungan komposisi". Ini juga dijelaskan dalam posting blog yang sangat baik Komposisi UML vs Agregasi vs Asosiasi oleh Geert Bellekens. Selain karakteristik komposisi yang menentukan ini (memiliki bagian yang eksklusif , atau tidak dapat dibagikan ), komposisi mungkin juga datang dengan ketergantungan siklus-hidup antara komposit dan komponennya. Sebenarnya, ada dua macam dependensi seperti itu:
- Kapan pun sebuah komponen harus selalu dilampirkan ke komposit, atau, dengan kata lain, jika memiliki komposit wajib , seperti yang dinyatakan oleh kelipatan "persis satu" di sisi komposit garis komposisi, maka komponen tersebut harus digunakan kembali di (atau dipasang kembali ke) komposit lain, atau dimusnahkan, bila komposit saat ini dihancurkan. Ini dicontohkan oleh komposisi antara
Person
dan Heart
, ditunjukkan pada diagram di bawah. Hati bisa hancur atau dipindahkan ke orang lain, ketika pemiliknya telah meninggal.
- Setiap kali sebuah komponen tidak dapat dilepaskan dari kompositnya, atau dengan kata lain, jika tidak dapat dipisahkan , maka, dan hanya setelah itu, komponen tersebut harus dimusnahkan, saat kompositnya dihancurkan. Contoh komposisi seperti itu dengan bagian yang tidak dapat dipisahkan adalah komposisi antara
Person
dan Brain
.
Singkatnya, ketergantungan siklus-hidup hanya berlaku untuk kasus-kasus komposisi tertentu, tetapi tidak secara umum, oleh karena itu mereka bukanlah karakteristik yang menentukan.
Spesifikasi UML menyatakan: "Sebuah bagian dapat dihapus dari contoh komposit sebelum contoh komposit dihapus, dan dengan demikian tidak dihapus sebagai bagian dari contoh komposit." Dalam contoh Car
- Engine
komposisi, seperti yang ditunjukkan dalam diagram berikut, itu jelas kasus bahwa mesin dapat terlepas dari mobil sebelum mobil hancur, dalam hal mesin tidak hancur dan dapat digunakan kembali. Ini tersirat oleh nol atau satu kelipatan pada sisi komposit dari garis komposisi.
The multiplisitas akhir asosiasi komposisi ini di sisi komposit 1 atau 0..1, tergantung pada fakta jika komponen memiliki komposit wajib (harus melekat pada komposit) atau tidak. Jika komponen tidak dapat dipisahkan , ini menyiratkan bahwa mereka memiliki komposit wajib.
2) Agregasi
Agregasi adalah bentuk asosiasi khusus lainnya dengan makna yang dimaksudkan dari hubungan sebagian-keseluruhan, di mana bagian-bagian dari keseluruhan dapat dibagi dengan keutuhan lainnya. Misalnya, kita dapat memodelkan agregasi antara kelas DegreeProgram
dan Course
, seperti yang ditunjukkan pada diagram berikut, karena kursus adalah bagian dari program gelar dan kursus dapat dibagi di antara dua atau lebih program gelar (misalnya gelar teknik dapat berbagi C kursus pemrograman dengan gelar ilmu komputer).
Namun, konsep agregasi dengan bagian yang dapat dibagikan tidak berarti banyak, sungguh, jadi tidak memiliki implikasi apa pun pada penerapannya dan oleh karena itu banyak pengembang memilih untuk tidak menggunakan berlian putih dalam diagram kelas mereka, tetapi hanya membuat model asosiasi biasa sebagai gantinya. Spesifikasi UML mengatakan: "Semantik akurat dari agregasi bersama bervariasi menurut area aplikasi dan pemodel".
The multiplisitas akhir asosiasi agregasi ini di seluruh sisi mungkin sejumlah (*) karena bagian mungkin milik, atau bersama antara, sejumlah keutuhan.