Agregasi versus Komposisi [tertutup]

90

Saya mengalami kesulitan untuk memahami perbedaan antara komposisi dan agregasi di UML. Bisakah seseorang memberi saya perbandingan dan kontras yang bagus di antara mereka? Saya juga ingin belajar mengenali perbedaan di antara keduanya dalam kode dan / atau melihat contoh perangkat lunak / kode singkat.

Sunting: Sebagian dari alasan mengapa saya bertanya adalah karena kegiatan dokumentasi terbalik yang kami lakukan di tempat kerja. Kami telah menulis kodenya, tetapi kami harus kembali dan membuat diagram kelas untuk kodenya. Kami hanya ingin menangkap asosiasi dengan benar.

Dave
sumber
Silakan, periksa contoh berbasis kode di: stackoverflow.com/questions/731802/…
Almir Campos
UML 2.5 telah menjelaskan perbedaannya. Lihat kotak di hal. 110. Jadi saya memilih untuk membuka kembali ini.
qwerty_so
Tidak, UML 2.5 tidak mengklarifikasi definisi komposisi, melainkan tetap ambigu tentangnya, karena UML 2.5 juga mengatakan "Objek bagian dapat dihapus dari objek gabungan sebelum objek gabungan dihapus, dan karenanya tidak dihapus sebagai bagian dari objek komposit. " Lihat jawaban saya di bawah ( stackoverflow.com/questions/734891/… ) di mana saya mencoba menjelaskan arti komposisi. Tolong beri suara positif pada jawaban saya untuk menunjukkan bahwa dalam SO, jawaban yang benar menang pada akhirnya :-) [atau kurangi semua jawaban yang salah]
Gerd Wagner

Jawaban:

91

Perbedaan antara agregasi dan komposisi bergantung pada konteksnya.

Ambil contoh mobil yang disebutkan di jawaban lain - ya, memang benar knalpot mobil dapat berdiri "sendiri" jadi mungkin tidak sesuai dengan mobil - tetapi tergantung pada aplikasinya. Jika Anda membangun aplikasi yang benar-benar harus berurusan dengan knalpot mobil yang berdiri sendiri (aplikasi manajemen toko mobil?), Agregasi akan menjadi pilihan Anda. Tetapi jika ini adalah permainan balapan sederhana dan knalpot mobil hanya berfungsi sebagai bagian dari mobil - yah, komposisinya akan cukup bagus.

Papan catur? Permasalahan yang sama. Bidak catur tidak ada tanpa papan catur hanya pada aplikasi tertentu. Di negara lain (seperti pabrik mainan), bidak catur pasti tidak bisa digubah menjadi papan catur.

Segalanya menjadi lebih buruk ketika mencoba memetakan komposisi / agregasi ke bahasa pemrograman favorit Anda. Dalam beberapa bahasa, perbedaan bisa lebih mudah untuk diperhatikan ("berdasarkan referensi" vs. "berdasarkan nilai", jika semuanya sederhana) tetapi di bahasa lain mungkin tidak ada sama sekali.

Dan satu nasihat terakhir? Jangan buang terlalu banyak waktu untuk masalah ini. Itu tidak layak. Perbedaan ini hampir tidak berguna dalam praktiknya (meskipun Anda memiliki "komposisi" yang benar-benar jelas, Anda mungkin masih ingin menerapkannya sebagai agregasi karena alasan teknis - misalnya, cache).

Segi enam
sumber
1
Saya mengatakan catur persegi daripada bidak catur, tetapi semua poin yang valid.
David M
2
Saya jelas mempermasalahkan pola pikir "Itu tidak layak". Jika Anda tidak memikirkan siapa yang "memiliki" suatu objek dan bertanggung jawab atas masa pakainya, Anda akan mendapatkan kode yang sangat jelek yang terkait dengan CRUD objek, terutama pembersihan, dengan petunjuk Null terbang ke mana-mana karena hierarki objek dibiarkan dalam keadaan buruk.
Chris Kessel
9
Ya, Anda tidak perlu membuang banyak waktu untuk masalah ini: UML adalah bahasa OOA / OOD; Agregasi / Komposisi biasanya keputusan terbaik ditangguhkan sampai OOP. Jika Anda mencoba memasukkan terlalu banyak detail ke dalam model UML Anda, Anda berisiko mengalami kelumpuhan analisis.
simpanse
13
1 untuk "jangan buang terlalu banyak waktu untuk ini". Itulah yang perlu saya dengar!
Ronnie
8
"jangan buang terlalu banyak waktu untuk ini" Mengapa pewawancara tidak memahami ini?
titogeo
97

Sebagai aturan praktis: masukkan deskripsi gambar di sini

class Person {
    private Heart heart;
    private List<Hand> hands;
}

class City {
    private List<Tree> trees;
    private List<Car> cars
}

Dalam komposisi (Person, Heart, Hand), "sub object" (Heart, Hand) akan dihancurkan segera setelah Person dihancurkan.

Dalam agregasi (Kota, Pohon, Mobil) "objek sub" (Pohon, Mobil) TIDAK akan dihancurkan ketika Kota dihancurkan.

Intinya adalah, komposisi menekankan pada keberadaan timbal balik, dan secara agregat, properti ini TIDAK diperlukan.

Hoa Nguyen
sumber
2
keberadaan bersama, baik B-)
jxramos
Menghargai usaha Anda. Penjelasan yang sangat bagus dan setiap orang awam bisa mengerti ini.
Ravindran Kanniah
Penjelasan paling sederhana dan terbaik yang saya temui.
Akash Raghav
penjelasan terbaik :)
Xiabili
UML 2.5 telah menjelaskan perbedaannya. Lihat kotak di hal. 110. Jadi jawaban Anda salah sekarang,
qwerty_so
51

Komposisi dan Agregasi adalah jenis asosiasi. Mereka sangat erat kaitannya dan dalam hal pemrograman tampaknya tidak banyak perbedaan di antara keduanya. Saya akan mencoba menjelaskan perbedaan antara keduanya dengan contoh kode java

Agregasi : Objek berada di luar yang lain, dibuat di luar, sehingga diteruskan sebagai argumen (misalnya) ke konstruktor. Mis: Orang - mobil. Mobil dibuat dalam konteks yang berbeda dan kemudian menjadi milik perseorangan.

// code example for Aggregation:
// reference existing HttpListener and RequestProcessor
public class WebServer {
  private HttpListener listener;
  private RequestProcessor processor;
  public WebServer(HttpListener listener, RequestProcessor processor) {
    this.listener = listener;
    this.processor = processor;
  }
}

Komposisi : Objek hanya ada, atau hanya masuk akal di dalam yang lain, sebagai bagian dari yang lain. Contoh: Orang - hati. Anda tidak menciptakan hati dan kemudian memberikannya kepada seseorang. Sebaliknya, hati tercipta saat manusia diciptakan.

// code example for composition:
// create own HttpListener and RequestProcessor
public class WebServer {
  private HttpListener listener;
  private RequestProcessor processor;
  public WebServer() {
    this.listener = new HttpListener(80);
    this.processor = new RequestProcessor(“/www/root”);
  }
}

Dijelaskan di sini dengan contoh Perbedaan antara Agregasi dan Komposisi

vsingh
sumber
5
Salah satu jawaban terbaik sejauh ini. Rapi :)
Rohit Singh
6
Contoh kode Java terbaik yang menunjukkan kapan objek bisa ada dengan (komposisi) atau tanpa (agregasi) objek lain.
Michał Dobi Dobrzański
tolong, saya ingin tahu apakah kita harus menggunakan final untuk Komposisi atau tidak?
Outreagous ONE
36

Komposisi menyiratkan bahwa objek turunan berbagi umur dengan induknya. Agregasi tidak. Misalnya, papan catur terdiri dari kotak catur - kotak catur tidak benar-benar ada tanpa papan. Namun, mobil adalah kumpulan bagian - knalpot mobil tetap merupakan knalpot mobil jika bukan bagian dari mobil pada saat itu.

David M
sumber
18

Contoh yang saya pelajari adalah jari ke tangan. Tangan Anda terdiri dari jari-jari. Itu memiliki mereka. Jika tangan mati, jari-jarinya mati. Anda tidak bisa "mengumpulkan" jari. Anda tidak bisa begitu saja mengambil jari ekstra dan memasang serta melepaskannya dari tangan Anda sesuka hati.

Nilai di sini, dari sudut pandang desain, sering kali terkait dengan umur objek seperti yang dikatakan poster lain. Katakanlah Anda memiliki Pelanggan dan mereka memiliki Akun. Akun itu adalah objek pelanggan yang "terdiri" (setidaknya, dalam banyak konteks yang dapat saya pikirkan). Jika Anda menghapus Pelanggan, Akun tersebut tidak memiliki nilai sehingga akan dihapus juga. Kebalikannya sering kali benar pada pembuatan objek. Karena Akun hanya memiliki arti dalam konteks Pelanggan, Anda akan membuat pembuatan Akun terjadi sebagai bagian dari pembuatan Pelanggan (atau, jika Anda melakukannya dengan malas, itu akan menjadi bagian dari beberapa transaksi Pelanggan).

Berguna dalam desain untuk memikirkan tentang objek apa yang memiliki (menyusun) objek lain vs. objek yang hanya mereferensikan (menggabungkan) objek lain. Ini dapat membantu menentukan di mana tanggung jawab terletak untuk pembuatan / pembersihan / pembaruan objek.

Sejauh dalam kode, seringkali sulit untuk dikatakan. Hampir semua yang ada dalam kode adalah referensi objek sehingga mungkin tidak jelas apakah objek yang direferensikan itu terdiri (dimiliki) atau digabungkan.

Chris Kessel
sumber
15

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:

  1. 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 Persondan Heart, ditunjukkan pada diagram di bawah. Hati bisa hancur atau dipindahkan ke orang lain, ketika pemiliknya telah meninggal.
  2. 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 Persondan Brain.

masukkan deskripsi gambar di sini

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- Enginekomposisi, 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.

masukkan deskripsi gambar di sini

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 DegreeProgramdan 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).

masukkan deskripsi gambar di sini

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.

Gerd Wagner
sumber
2
Komposisi tidak sepenuhnya terkait dengan siklus hidup, tetapi di sebagian besar masalah dunia nyata, siklus hidup adalah motivator utama apakah Anda akan menulis atau menggabungkan. Saya melakukan lindung nilai dalam jawaban saya, dengan mengatakan siklus hidup "sering" terkait daripada selalu terkait. Sebaiknya perhatikan siklus hidup tidak diperlukan, tetapi menyatakan bahwa tampilan adalah "masalah utama" dan salah (dengan huruf tebal yang bagus) menurut saya tidak membantu dan mengurangi pertimbangan penggunaan praktis.
Chris Kessel
Saya sangat tidak setuju. Pertimbangan siklus hidup tidak dapat menjadi "motivator utama apakah Anda akan menulis atau menggabungkan", karena Anda memilikinya dalam banyak kasus asosiasi terlepas dari fakta jika mereka mewakili jenis realisasi sebagian-keseluruhan (agregasi atau komposisi). Kapan pun pengaitan berakhir dengan kelipatan batas bawah lebih besar dari 0, sesuai dengan properti referensi wajib, Anda akan mendapatkan ketergantungan siklus proses.
Gerd Wagner
8

Dalam istilah kode, komposisi biasanya menunjukkan bahwa objek yang memuat bertanggung jawab untuk membuat instance komponen *, dan objek yang memuatnya menyimpan satu-satunya referensi yang berumur panjang. Jadi, jika objek induk dide-referensi dan dikumpulkan sampahnya, begitu pula anak.

jadi kode ini ...

Class Order
   private Collection<LineItem> items;
   ...
   void addOrderLine(Item sku, int quantity){
         items.add(new LineItem(sku, quantity));
   }
}

menyarankan bahwa LineItem adalah komponen Order - LineItems tidak ada di luar urutan yang memuatnya. Tetapi objek Item tidak dibuat dalam urutan - mereka diteruskan sesuai kebutuhan, dan terus ada, bahkan jika toko tidak memiliki pesanan. jadi mereka terkait, bukan komponen.

* nb container bertanggung jawab untuk instanciating komponen, tetapi mungkin sebenarnya tidak memanggil new ... () itu sendiri - ini adalah java, biasanya ada satu atau dua pabrik yang harus dilalui terlebih dahulu!

Chris May
sumber
0

Ilustrasi konseptual yang diberikan dalam jawaban lain berguna, tetapi saya ingin membagikan poin lain yang menurut saya berguna.

Saya telah mendapatkan beberapa jarak tempuh dari UML untuk pembuatan kode, untuk kode sumber atau DDL untuk database relasional. Di sana, saya telah menggunakan komposisi untuk menunjukkan bahwa tabel memiliki kunci asing non-nullable (dalam database), dan objek "induk" (dan seringkali "final") non-nullable, dalam kode saya. Saya menggunakan agregasi di mana saya bermaksud agar rekaman atau objek dapat ada sebagai "yatim piatu", tidak terikat pada objek induk, atau untuk "diadopsi" oleh objek induk yang berbeda.

Dengan kata lain, saya telah menggunakan notasi komposisi sebagai singkatan untuk menyiratkan beberapa batasan tambahan yang mungkin diperlukan saat menulis kode untuk model.

erickson
sumber
0

Contoh yang saya suka: Composition: Water is a part-of a Pond. (Kolam adalah komposisi air.) Agregasi: kolam memiliki bebek dan ikan (kolam agregat bebek dan ikan)

Seperti yang Anda lihat, saya telah menebalkan "bagian dari" dan "memiliki", karena 2 frasa ini biasanya dapat menunjukkan jenis hubungan apa yang ada di antara kelas.

Tetapi seperti yang ditunjukkan oleh orang lain, sering kali apakah koneksi itu sebuah komposisi atau agregasi bergantung pada aplikasinya.

Raj Rao
sumber
Tapi kadang-kadang ada istilah yang membingungkan dan sebagian. Misalnya, kelas Person "memiliki" nama, sehingga menunjukkan sebagai Person memiliki relasi agregasi dengan nama. Sebenarnya, itu adalah hubungan komposisi. Mengapa? Saat objek Person dihancurkan, begitu juga namanya. Dan istilah "nama adalah bagian dari orang", kedengarannya tidak wajar.
Asif Shahzad
0

Sangat sulit untuk melakukan perbedaan antara relasi agregat dan relasi komposit, tapi saya akan mengambil beberapa contoh, Kita punya rumah dan kamar, di sini kita punya relasi gabungan, kamar itu bagian dari rumah, dan kehidupan kamar dimulai dengan kehidupan rumah dan Akan selesai ketika kehidupan rumah selesai, ruangan itu bagian dari rumah, kita berbicara tentang komposisi, seperti negara dan ibu kota, buku dan halaman. Sebagai contoh relasi agregat, ambil tim dan pemain, pemain bisa ada tanpa tim, dan tim adalah sekelompok pemain, dan kehidupan pemain bisa dimulai sebelum kehidupan tim, jika kita berbicara tentang pemrograman, kita dapat membuat pemain dan setelah kita akan membuat tim, Tapi untuk komposisi no, kita buat ruangan di dalam rumah. Komposisi ----> komposit | menyusun. Agregasi -------> grup | elemen

Baca
sumber
0

Mari kita atur persyaratannya. Agregasi adalah metrik dalam standar UML, dan berarti komposisi KEDUA dan agregasi bersama, cukup dinamai bersama . Untuk sering itu salah dinamai "agregasi". BURUK, karena komposisi adalah agregasi juga. Seperti yang saya mengerti, yang Anda maksud adalah "berbagi".

Lebih jauh dari standar UML:

komposit - Menunjukkan bahwa properti diagregasi secara komposit, yaitu, objek gabungan memiliki tanggung jawab atas keberadaan dan penyimpanan objek yang disusun (bagian).

Jadi, asosiasi universitas ke cathedras adalah sebuah komposisi, karena cathedra tidak ada di luar universitas (IMHO)

Semantik akurat dari agregasi bersama bervariasi menurut area aplikasi dan pemodel.

Yaitu, semua asosiasi lainnya dapat ditarik sebagai agregasi bersama, jika Anda hanya mengikuti beberapa prinsip Anda atau orang lain. Lihat juga di sini .

Gangnus
sumber
0

Pertimbangkan bagian tubuh manusia seperti ginjal, hati, otak. Jika kita mencoba memetakan konsep komposisi dan agregasi di sini, akan seperti ini:

Sebelum adanya transplantasi bagian tubuh seperti ginjal dan hati, kedua bagian tubuh ini sudah ada dalam komposisi dengan tubuh manusia dan tidak mungkin ada isolasi dengan tubuh manusia.

Tetapi setelah munculnya transplantasi bagian tubuh, mereka dapat dipindahkan ke tubuh manusia lain, jadi bagian-bagian ini digabungkan dengan tubuh manusia karena keberadaannya dalam isolasi dengan tubuh manusia dimungkinkan sekarang.

Azfar Niaz
sumber