Notasi diagram kelas UML: Perbedaan antara Asosiasi, Agregasi dan Komposisi

39

Saya bingung tentang beberapa notasi diagram kelas UML.

masukkan deskripsi gambar di sini

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.

Aviv Cohn
sumber
Definisi 2 lebih mirip definisi untuk Komposisi daripada Agregasi. Definisi 1 terdengar benar.
jbx

Jawaban:

32

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.

Bart van Ingen Schenau
sumber
1
Terima kasih atas jawaban anda. Begini cara saya memahami sesuatu, tolong katakan apakah ini definisi yang masuk akal. 1- Asosiasi adalah setiap kali objek A perlu tahu tentang objek B untuk menjalankan fungsinya. 2- Agregasi dan Komposisi mendefinisikan hubungan 'kepemilikan' - turunan dari kelas A secara konseptual memiliki turunan dari kelas B. Namun, masa turunan B tidak tergantung pada masa turunan instance A. Misalnya, departemen dengan karyawan. Departemen memiliki 'contoh karyawan', tetapi akan tetap hidup tanpa departemen. Komposisi seperti Agregasi, tetapi
Aviv Cohn
1
masa hidup instance B bergantung pada masa hidup instance A. Hubungan 'kepemilikan' yang lebih kuat. Misalnya: Mobil dan roda. Mobil 'sepenuhnya berisi' roda. Contoh Roda tidak akan terus hidup tanpa instance Mobil yang memuatnya. Apakah ini perbedaan yang masuk akal?
Aviv Cohn
@ Kat: Ya, itu definisi yang masuk akal. Ingat saja bahwa orang lain mungkin tidak membagikan definisi itu dan bahwa Anda mungkin perlu menjelaskan penggunaan agregasi Anda kepada mereka.
Bart van Ingen Schenau
Apa yang akan Anda katakan adalah definisi paling umum untuk notasi Agregasi? Definisi yang saya gunakan? Definisi 'memiliki koleksi'? Sesuatu yang lain
Aviv Cohn
Referensi ke standar OMG di bawah ini bersifat instruktif. Asosiasi dan komposisi cukup mudah. Agregasi adalah yang goyah. Dalam praktiknya, saya menemukan bahwa 'bagian dari' tes berfungsi dengan baik ('kepemilikan' adalah cara yang kurang optimal untuk memikirkannya). Seseorang dapat menjadi bagian dari klub, sehingga klub mengumpulkan orang (bukan milik mereka). Ketika klub hancur, orang-orang terus eksis.
Huliax
10

Komposisi adalah ketika suatu object Amengandung object Bdan object Ajuga bertanggung jawab untuk menciptakan object B.

Hubungan komposisi

Kami memiliki kelas A yang akan digunakan oleh kelas B.

final class A
{
}

Ada beberapa pilihan bagaimana komposisi dapat terlihat.

Komposisi inisialisasi langsung:

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

Komposisi inisialisasi konstruktor

final class B
{
    private $a;

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

Komposisi inisialisasi malas

final class B
{
    private $a = null;

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

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

Anda melihat ini menciptakan hubungan yang erat antara kelas Adan B. Kelas Btidak bisa ada tanpa A. Ini adalah pelanggaran besar prinsip injeksi ketergantungan , yang mengatakan:

Ketergantungan adalah objek yang dapat digunakan (layanan). Suntikan adalah perpindahan ketergantungan ke objek dependen (klien) yang akan menggunakannya. Layanan ini menjadi bagian dari keadaan klien. Melewati layanan ke klien, alih-alih membiarkan klien membangun atau menemukan layanan, adalah persyaratan mendasar dari pola tersebut.

Komposisi terkadang masuk akal, seperti memanggil new DateTimedalam 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 Aobjek khusus akan digunakan untuk caching, itu class Bakan selalu di-cache menggunakan implementasi class 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 disebut useA()metode dan penciptaan object Aakan gagal, Andaobject B tiba-tiba tidak berguna.


Agregasi, di sisi lain, adalah cara hubungan, yang mengikuti prinsip DI . object Bperlu digunakan object A, maka Anda harus melewati contoh yang sudah dibuat object Auntuk object 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 Btidak bisa ada tanpa object A).

final class B
{
    private $a;

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

Looser (Anda mungkin atau mungkin tidak menggunakan object Adi dalam object B, tetapi jika Anda melakukannya, Anda mungkin harus mengaturnya terlebih dahulu).

Melalui setter:

final class B
{
    private $a;

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

Melalui properti publik:

final class B
{
    public $a;
}

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.

Andy
sumber
1
Melihat contoh kode sangat membantu! Penjelasan dalam bahasa Inggris tanpa kode semua tampak begitu kabur dan subyektif.
Niko Bellic
1

Selain itu kutipan dari standar UML saat ini:

11.5.4 Asosiasi - Semantik - Notasi

[...] Asosiasi biner mungkin memiliki satu ujung dengan agregasi = AggregationKind :: shared atau aggregation = AggregationKind :: composite. Ketika salah satu ujung memiliki agregasi = AggregationKind :: bersama sebuah berlian berongga ditambahkan sebagai perhiasan terminal pada akhir baris Asosiasi berlawanan akhir ditandai dengan agregasi = AggregationKind :: bersama. Berlian harus terasa lebih kecil daripada notasi berlian untuk Asosiasi. Asosiasi dengan agregasi = AggregationKind :: komposit juga memiliki berlian di ujungnya, tetapi berbeda dalam memiliki berlian yang diisi . [...]

9.5.4 Klasifikasi - Properti - Notasi

[...] Terkadang Properti digunakan untuk memodelkan keadaan di mana satu instance digunakan untuk mengelompokkan serangkaian instance; ini disebut agregasi. Untuk mewakili keadaan seperti itu, Properti memiliki properti agregasi, bertipe AggregationKind; mesin virtual yang mewakili seluruh kelompok diklasifikasikan oleh pemilik Properti, dan mesin virtual yang mewakili individu yang dikelompokkan diklasifikasikan berdasarkan jenis Properti. AggregationKind adalah enumerasi dengan nilai literal berikut:

  • tidak ada : Menunjukkan bahwa Properti tidak memiliki semantik agregasi.
  • Dibagikan : Menunjukkan bahwa Properti telah berbagi semantik agregasi. Semantik yang tepat dari agregasi bersama bervariasi berdasarkan area aplikasi dan pemodel.
  • Komposit : Menunjukkan bahwa Properti teragregasi secara komposit, yaitu, objek komposit memiliki tanggung jawab atas keberadaan dan penyimpanan objek yang dikomposisikan (lihat definisi bagian dalam 11.2.3). Agregasi komposit adalah bentuk agregasi yang kuat yang membutuhkan objek bagian untuk dimasukkan dalam paling banyak satu objek komposit sekaligus. Jika objek komposit dihapus, semua instance bagiannya yang berupa objek dihapus bersamanya.

[...]

ManuelSchneid3r
sumber
0

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.

C.Champagne
sumber