Komposisi adalah ketika kelas menawarkan beberapa fungsionalitas dengan membuat instance kelas (mungkin internal) yang sudah mengimplementasikan fungsionalitas ini, alih-alih mewarisi dari kelas itu.
Jadi, misalnya, jika Anda memiliki kelas yang memodelkan sebuah kapal, dan Anda sekarang diberitahu bahwa kapal Anda harus menawarkan helipad, itu tidak wajar untuk menurunkan kapal Anda dari helipad, (ya!) Sebaliknya, Anda harus memiliki kapal Anda mengandung kelas helipad dan memaparkannya melalui beberapa Ship.getHelipad()
metode.
Pada tahun-tahun yang lalu (satu dekade yang lalu) orang biasa memandang pewarisan sebagai cara cepat dan mudah untuk menggabungkan fungsi, jadi ada banyak contoh jenis "kapal yang mewarisi helipad", yang tentu saja sangat timpang.
Tetapi diktum "Komposisi Yang Disukai atas Warisan" telah diucapkan dengan hati-hati untuk memperjelas bahwa ini hanyalah sebuah saran, bukan aturan. Penulis diktum itu cukup hati-hati untuk tidak mengatakan sesuatu seperti "kamu tidak akan pernah menggunakan warisan, hanya komposisi". Ini pada dasarnya membawa perhatian komunitas rekayasa perangkat lunak fakta bahwa warisan telah digunakan secara berlebihan, sementara dalam banyak kasus, komposisi menghasilkan desain yang lebih jelas, elegan, dan dapat dipertahankan daripada warisan.
Jadi, pada dasarnya, diktum "Komposisi Keberanian atas Warisan" menunjukkan bahwa setiap kali Anda dihadapkan dengan "mewarisi atau menulis?" pertanyaan, Anda harus berpikir keras apa strategi yang paling cocok, dan bahwa sebagian besar kemungkinan adalah bahwa strategi yang paling cocok akan berubah menjadi komposisi, bukan warisan.
Tetapi karena ini bukan aturan, Anda juga harus ingat bahwa ada banyak kasus di mana warisan lebih alami. Jika Anda menggunakan komposisi di sana di mana Anda seharusnya menggunakan warisan, banyak kejahatan akan menimpa kode Anda.
Untuk kembali ke contoh kapal, jika kapal Anda perlu menawarkan antarmuka untuk berinteraksi dengan FloatingMachine
, maka lebih alami untuk menurunkannya dari FloatingMachine
kelas abstrak , yang sangat mungkin pada gilirannya diturunkan dari Machine
kelas abstrak lain .
Berikut ini adalah aturan praktis untuk jawaban pertanyaan komposisi vs pewarisan:
Apakah kelas saya memiliki hubungan "adalah" dengan antarmuka yang perlu diungkapkan? Jika ya, gunakan warisan. Jika tidak, gunakan komposisi.
Kapal "adalah" mesin apung, dan mesin apung "adalah" mesin. Jadi, warisan baik-baik saja bagi mereka. Tapi kapal bukan, tentu saja, helipad. Jadi lebih baik menyusun fungsi helipad.