โ Kembali ke Konsep OOP
๐งฑ
Relasi
Composition (Komposisi)
Relasi "has-a" yang kuat di mana siklus hidup bagian terikat pada keseluruhannya; saat container dihapus, bagian-bagiannya ikut terhapus.
Masalahnya
Beberapa objek tidak bermakna tanpa pemiliknya; sebuah Engine tidak masuk akal jika terlepas dari Car-nya. Memodelkannya dengan referensi bersama biasa tidak menggambarkan ketergantungan siklus hidup tersebut.
Cara Kerja
- โบObjek yang dimiliki dibuat dan dihapus bersama pemiliknya
- โบBagian biasanya tidak punya identitas mandiri di luar keseluruhannya
- โบUtamakan composition dibanding inheritance untuk desain yang fleksibel dan loosely-coupled
- โบBiasanya diimplementasikan dengan membuat instance bagian langsung di constructor pemiliknya
Kapan Digunakan
โSebuah objek memiliki komponen yang menjadi bagian integral darinya (Car โ Engine, House โ Rooms)
โMembangun perilaku kompleks dengan menggabungkan objek-objek kecil, bukan subclassing
โSaat "part" tidak boleh dipakai bersama oleh beberapa "whole"
Contoh di Dunia Nyata
๐
iOS
View controller yang memiliki dan mengelola siklus hidup child view-nya
๐ค
Android
Activity yang memiliki Fragment yang dibuat dan dihapus bersamanya
๐
Web
Class Car yang membuat instance Engine-nya sendiri di constructor
Contoh Kode
Swift
class Engine {
let horsepower: Int
init(horsepower: Int) { self.horsepower = horsepower }
func start() -> String { "Engine roaring with \(horsepower) hp" }
}
class Car {
private let engine: Engine // owned โ created and destroyed with the Car
init(horsepower: Int) {
engine = Engine(horsepower: horsepower)
}
func start() -> String {
engine.start()
}
}
let car = Car(horsepower: 300)
print(car.start()) // "Engine roaring with 300 hp"