โ† 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"