Saya bingung tentang beberapa notasi diagram kelas UML.
Cukup yakin saya tahu apa arti Asosiasi . Setiap hubungan antara instance dari dua kelas, di mana sebuah instance dari satu kelas perlu tahu tentang instance dari kelas kedua untuk melakukan pekerjaannya - adalah hubungan Asosiasi. Asosiasi seringkali berarti kelas A memiliki referensi (bidang) ke turunan kelas B.
Namun, saya mengalami kesulitan memahami apa arti panah Agregasi dan Komposisi . Bagian dari kebingungan saya disebabkan oleh menemukan definisi yang berbeda dari notasi ini.
Dua definisi dari notasi Agregasi :
Definisi 1: Notasi Agregasi antara dua kelas cocok setiap kali instance kelas A menyimpan kumpulan instance kelas B (misalnya Daftar, Array, apa pun).
Definisi 2: Tautan agregasi antara dua kelas cocok jika instance kelas A menyimpan referensi ke instance kelas B, dan instance B bergantung pada siklus hidup instance A. Artinya: Ketika instance dari kelas A dihapus, begitu juga instance dari kelas B. Contoh dari kelas B seluruhnya dikandung oleh instance dari kelas A, sebagai lawan dari instance dari kelas A hanya memiliki referensi ke instance dari kelas A. kelas B (yang merupakan Asosiasi reguler).
Mengenai apa arti notasi Komposisi dan bagaimana perbedaannya dari notasi Agregasi, saya tidak yakin.
Tolong jelaskan definisi dan bantu saya mengerti. Contoh nyata akan diterima.
sumber
Jawaban:
Tiga tautan, Asosiasi, Agregasi dan Komposisi membentuk semacam skala pada seberapa dekat dua kelas terkait satu sama lain.
Di salah satu ujung skala, ada Asosiasi, di mana objek dari dua kelas dapat saling mengenal, tetapi mereka tidak mempengaruhi satu sama lain seumur hidup. Objek dapat eksis secara independen dan objek kelas A mana yang mengetahui objek kelas B mana yang dapat bervariasi dari waktu ke waktu.
Di ujung lain skala, ada Komposisi. Komposisi mewakili bagian - seluruh hubungan sehingga kelas B adalah bagian integral dari kelas A. Hubungan ini biasanya digunakan jika objek kelas A tidak dapat secara logis ada tanpa memiliki objek kelas B.
Relasi Agregasi ada di antara kedua ujung itu, tetapi tampaknya tidak ada yang sepakat di mana tepatnya, sehingga tidak ada definisi yang disepakati secara universal tentang apa arti Agregasi. Dalam pengertian itu, kedua definisi yang Anda temukan itu benar dan jika Anda bertanya kepada 10 orang, Anda berisiko mendapatkan 11 definisi yang berbeda.
sumber
Komposisi adalah ketika suatu
object A
mengandungobject B
danobject A
juga bertanggung jawab untuk menciptakanobject B
.Hubungan komposisi
Kami memiliki kelas A yang akan digunakan oleh kelas B.
Ada beberapa pilihan bagaimana komposisi dapat terlihat.
Komposisi inisialisasi langsung:
Komposisi inisialisasi konstruktor
Komposisi inisialisasi malas
Anda melihat ini menciptakan hubungan yang erat antara kelas
A
danB
. KelasB
tidak bisa ada tanpaA
. Ini adalah pelanggaran besar prinsip injeksi ketergantungan , yang mengatakan:Komposisi terkadang masuk akal, seperti memanggil
new DateTime
dalam php ataunew std::vector<int>
dalam C ++. Tetapi lebih sering daripada tidak, itu adalah peringatan, bahwa desain kode Anda salah.Dalam kasus, di mana
class A
objek khusus akan digunakan untuk caching, ituclass B
akan selalu di-cache menggunakan implementasiclass A
, dan Anda tidak akan memiliki kontrol untuk mengubahnya secara dinamis, yang buruk.Juga, jika Anda menggunakan komposisi inisialisasi malas , berarti Anda akan memiliki sebuah karya
object B
, yang disebutuseA()
metode dan penciptaanobject A
akan gagal, Andaobject B
tiba-tiba tidak berguna.Agregasi, di sisi lain, adalah cara hubungan, yang mengikuti prinsip DI .
object B
perlu digunakanobject A
, maka Anda harus melewati contoh yang sudah dibuatobject A
untukobject B
, dan harus pembuatanobject A
gagal, tidak ada yang akan berlalu di tempat pertama.Singkatnya, Agregasi adalah representasi UML untuk prinsip injeksi ketergantungan , baik injeksi konstruktor, injeksi setter, atau injeksi properti publik.
Ini semua adalah Agregasi
Injeksi konstruktor yang paling kencang (
object B
tidak bisa ada tanpaobject A
).Looser (Anda mungkin atau mungkin tidak menggunakan
object A
di dalamobject B
, tetapi jika Anda melakukannya, Anda mungkin harus mengaturnya terlebih dahulu).Melalui setter:
Melalui properti publik:
Sebenarnya tidak ada cara yang bagus untuk membenarkan penggunaan Agregasi atas Komposisi, jika semua yang Anda gunakan adalah implementasi konkret dari kelas, tetapi begitu Anda mulai menyuntikkan antarmuka atau dalam kasus kelas abstrak C ++, tiba-tiba Agregasi akan menjadi satu-satunya cara untuk memenuhi kontrak Anda.
sumber
Selain itu kutipan dari standar UML saat ini:
11.5.4 Asosiasi - Semantik - Notasi
9.5.4 Klasifikasi - Properti - Notasi
sumber
Saya sudah memposting jawaban di Stackoverflow .
Pada dasarnya, suatu agregasi lebih kuat daripada asosiasi sederhana tetapi objek-objek teragregasi dapat terus "hidup" tanpa satu sama lain seperti dengan asosiasi sederhana.
Komposisi bahkan lebih kuat daripada agregasi karena kelas teragregasi tidak dapat diagregasi oleh kelas lain. "Kehidupan" nya tergantung pada wadah.
sumber