Composition ve Kalıtım
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 56 / 91.
Önceki bölümde, trait'lerin "has-a" yeteneği sağladığını, kalıtımın ise bir "is-a" ilişkisi kurduğunu öğrendin. Kompozisyon, karmaşık nesneleri daha basit nesnelerden oluşturarak ve onları kalıtım yoluyla almak yerine özellik olarak saklayarak "has-a" kavramını daha ileri taşır.
Kalıtımla, bir Car Vehicle sınıfını genişletebilir. Bileşimle, bir Car bir Engine nesnesi içerir:
<?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();
Çıktı:
Engine startedCar sınıfı Engine sınıfından miras almaz; bir tanesine sahiptir. Bu yaklaşım önemli avantajlar sunar: motoru farklı bir uygulamayla değiştirebilirsiniz, sınıflar gevşek bağlı kalır ve derin kalıtımın oluşturduğu katı hiyerarşilerden kaçınırsınız.
OOP'ta yaygın bir kılavuz "kalıtım yerine bileşimi tercih edin." şeklindedir. Kalıtım, gerçek tür hiyerarşileri için (bir Dog gerçekten bir Animal'dır) iyi çalışır; ancak bağımsız parçalardan işlevsellik oluşturduğunuzda bileşim öne çıkar. Birden fazla nesneyi birleştirebilir, bunları çalışma zamanında değiştirebilir ve bileşenleri yalıtılmış olarak test edebilirsiniz.
Sonraki ders, nesnelerin bağımlılıklarını nasıl alacağını kontrol ederek doğrudan bileşim üzerine kurulan bağımlılık enjeksiyonunu ele alır.
Görev
KolayBir Computer nesnesinin bileşenlerden kalıtım almak yerine ayrı bileşen nesnelerinden oluşturulduğu, composition kullanarak bir bilgisayar sistemi oluşturalım. Bu, composition'ın karmaşık nesneleri daha basit ve bağımsız parçalardan oluşturmanı nasıl sağladığını gösterir.
Kodunuzu üç dosyaya ayıracaksınız:
Processor.php: Bir CPU'yu temsil eden birProcessorsınıfı oluşturun. Özel bir$model(string) ve özel bir$cores(integer) tanımlamak için kurucu destekli özellik tanımlamayı kullanın."[model] ([cores] cores)"döndüren birgetSpecs()metodu ekleyin.Memory.php: RAM'i temsil eden birMemorysınıfı oluşturun. GB'yi temsil eden özel bir$size(integer) tanımlamak için kurucu destekli özellik tanımlamayı kullanın."[size]GB RAM"döndüren birgetCapacity()metodu ekleyin.main.php: Her iki bileşen dosyasını dahil edin ve composition kullanan birComputersınıfı oluşturun.Computerşunları yapmalıdır:- Bir
Processornesnesini ve birMemorynesnesini özel özellikler olarak saklamak - Kurucusunda bir işlemci modeli, çekirdek sayısı ve bellek boyutu kabul etmek
- Kurulum sırasında bileşen nesnelerini dahili olarak oluşturmak
"Computer with [processor specs] and [memory capacity]"döndüren birdescribe()metoduna sahip olmak
Üç girdi alacaksınız: bir işlemci modeli, çekirdek sayısı ve GB cinsinden bellek boyutu. Bu özelliklerle bir
Computeroluşturun vedescribe()çağrısının sonucunu yazdırın.- Bir
Computer sınıfının Processor veya Memory sınıfını genişletmediğine dikkat edin. Bunları içerir. Composition aracılığıyla kurulan bu "has-a" ilişkisi, Computer gerektiğinde parçalarına görev devrederken her bileşenin bağımsız ve yeniden kullanılabilir kalmasını sağlar.
Kendin dene
<?php
require_once 'Processor.php';
require_once 'Memory.php';
class Computer
{
// TODO: Processor ve Memory nesnelerini saklamak için private özellikler tanımla
// TODO: Constructor işlemci modeli, çekirdek sayısı ve bellek boyutunu kabul etmeli
// ve bileşen nesnelerini dahili olarak oluşturmalı
public function __construct()
{
// TODO: Processor ve Memory nesnelerini oluştur ve sakla
}
// TODO: Şunu döndüren describe() metodunu uygula
// "Computer with [processor specs] and [memory capacity]"
public function describe(): string
{
// TODO: Bileşen nesnelerine devret ve biçimlendirilmiş dizeyi döndür
}
}
// Girdiyi oku
$processorModel = trim(fgets(STDIN));
$cores = intval(fgets(STDIN));
$memorySize = intval(fgets(STDIN));
// TODO: Verilen özelliklerle bir Computer oluştur ve describe() sonucunu yazdır
?>Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi