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.
Jawaban:
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).
sumber
Sebagai aturan praktis:
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.
sumber
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
sumber
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.
sumber
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.
sumber
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
Tapi di saat yang sama mereka juga bilang
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:
Person
danHeart
, ditunjukkan pada diagram di bawah. Hati bisa hancur atau dipindahkan ke orang lain, ketika pemiliknya telah meninggal.Person
danBrain
.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
danCourse
, 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.
sumber
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!
sumber
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.
sumber
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.
sumber
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
sumber
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:
Jadi, asosiasi universitas ke cathedras adalah sebuah komposisi, karena cathedra tidak ada di luar universitas (IMHO)
Yaitu, semua asosiasi lainnya dapat ditarik sebagai agregasi bersama, jika Anda hanya mengikuti beberapa prinsip Anda atau orang lain. Lihat juga di sini .
sumber
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.
sumber