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 startedclass 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.
Tantangan
MudahMari 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 classProcessoryang merepresentasikan CPU. Gunakan promosi konstruktor untuk mendefinisikan$modelprivat bertipe string dan$coresprivat bertipe bilangan bulat. Tambahkan methodgetSpecs()yang mengembalikan"[model] ([cores] cores)".Memory.php: Buat classMemoryyang merepresentasikan RAM. Gunakan promosi konstruktor untuk mendefinisikan$sizeprivat bertipe bilangan bulat yang mewakili GB. Tambahkan methodgetCapacity()yang mengembalikan"[size]GB RAM".main.php: Sertakan kedua file komponen dan buat classComputeryang menggunakan komposisi.Computerharus:- Menyimpan object
Processordan objectMemorysebagai 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
Computerdengan spesifikasi tersebut dan cetak hasil pemanggilandescribe().- Menyimpan object
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()
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa10Konsep OOP Lanjutan
Komposisi vs PewarisanInjeksi Dependensiclass AnonimEnum (PHP 8.1)Fiber (PHP 8.1)Pendalaman Kloning objectGenerator dan Iterator2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online