Menu
CoddyTech

Komposisi vs Pewarisan

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 56 dari 91.

Di bab sebelumnya, kamu telah mempelajari bahwa trait memberikan kemampuan "has-a", sedangkan pewarisan membentuk hubungan "is-a". Komposisi mengembangkan konsep "has-a" lebih jauh dengan membangun object yang kompleks dari object yang lebih sederhana, lalu menyimpannya sebagai property alih-alih mewarisinya.

Dengan pewarisan, Car dapat memperluas Vehicle. Dengan komposisi, Car memiliki object Engine:

<?php
class Engine {
    public function start(): string {
        return "Engine started";
    }
}

class Car {
    private Engine $engine;
    
    public function __construct() {
        $this->engine = new Engine();
    }
    
    public function start(): string {
        return $this->engine->start();
    }
}

$car = new Car();
echo $car->start();

Keluaran:

Engine started

class Car tidak mewarisi Engine, class ini memiliki satu Engine. Pendekatan ini menawarkan keuntungan besar: kamu bisa mengganti engine dengan implementasi yang berbeda, class tetap memiliki keterkaitan yang longgar, dan kamu terhindar dari hierarki kaku yang dihasilkan oleh pewarisan mendalam.

Panduan umum dalam OOP adalah "utamakan komposisi daripada pewarisan." Pewarisan cocok untuk hierarki tipe yang memang sesuai (seekor Dog benar-benar merupakan Animal), tetapi komposisi lebih unggul saat kamu merangkai fungsionalitas dari bagian-bagian independen. Kamu dapat menggabungkan beberapa object, menggantinya saat program berjalan, dan menguji komponen secara terpisah.

Pelajaran berikutnya membahas injeksi dependensi, yang dibangun langsung dari komposisi dengan mengontrol cara object menerima dependensinya.

challenge icon

Tantangan

Mudah

Mari kita bangun sistem komputer menggunakan komposisi, dengan merakit Computer dari object komponen terpisah, bukan mewarisi dari komponen tersebut. Ini menunjukkan bagaimana komposisi memungkinkan kamu membangun object kompleks dari bagian-bagian sederhana yang independen.

Kamu akan mengatur kodemu dalam tiga file:

  • Processor.php: Buat class Processor yang merepresentasikan CPU. Gunakan promosi konstruktor untuk mendefinisikan $model privat bertipe string dan $cores privat bertipe bilangan bulat. Tambahkan method getSpecs() yang mengembalikan "[model] ([cores] cores)".
  • Memory.php: Buat class Memory yang merepresentasikan RAM. Gunakan promosi konstruktor untuk mendefinisikan $size privat bertipe bilangan bulat yang mewakili GB. Tambahkan method getCapacity() yang mengembalikan "[size]GB RAM".
  • main.php: Sertakan kedua file komponen dan buat class Computer yang menggunakan komposisi. Computer harus:
    • Menyimpan object Processor dan object Memory sebagai property privat
    • Menerima model prosesor, jumlah core, dan ukuran memori di konstruktornya
    • Membuat object komponen secara internal selama konstruksi
    • Memiliki method describe() yang mengembalikan "Computer with [processor specs] and [memory capacity]"

    Kamu akan menerima tiga input: model prosesor, jumlah core, dan ukuran memori dalam GB. Buat Computer dengan spesifikasi tersebut dan cetak hasil pemanggilan describe().

Perhatikan bahwa Computer tidak memperluas Processor atau Memory. Computer tersebut berisi keduanya. Hubungan "has-a" melalui komposisi ini menjaga setiap komponen tetap independen dan dapat digunakan kembali, sekaligus memungkinkan Computer mendelegasikan tugas kepada bagian-bagiannya saat diperlukan.

Coba sendiri

<?php
require_once 'Processor.php';
require_once 'Memory.php';

class Computer
{
    // TODO: Tentukan property private untuk menyimpan object Processor dan Memory

    // TODO: Constructor harus menerima model prosesor, jumlah inti, dan ukuran memori
    // dan membuat object komponen di dalamnya
    public function __construct()
    {
        // TODO: Buat object Processor dan Memory, lalu simpan keduanya
    }

    // TODO: Implementasikan method describe() yang mengembalikan
    // "Computer with [processor specs] and [memory capacity]"
    public function describe(): string
    {
        // TODO: Serahkan tugas ke object komponen dan kembalikan string yang sudah diformat
    }
}

// Baca input
$processorModel = trim(fgets(STDIN));
$cores = intval(fgets(STDIN));
$memorySize = intval(fgets(STDIN));

// TODO: Buat Computer dengan spesifikasi yang diberikan, lalu cetak hasil describe()

?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online