Menu
Coddy logo textTech

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 started

Car 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.

challenge icon

Görev

Kolay

Bir 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 bir Processor sı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 bir getSpecs() metodu ekleyin.
  • Memory.php: RAM'i temsil eden bir Memory sı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 bir getCapacity() metodu ekleyin.
  • main.php: Her iki bileşen dosyasını dahil edin ve composition kullanan bir Computer sınıfı oluşturun. Computer şunları yapmalıdır:
    • Bir Processor nesnesini ve bir Memory nesnesini ö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 bir describe() metoduna sahip olmak

    Üç girdi alacaksınız: bir işlemci modeli, çekirdek sayısı ve GB cinsinden bellek boyutu. Bu özelliklerle bir Computer oluşturun ve describe() çağrısının sonucunu yazdırın.

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

?>
quiz iconKendini test et

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

Kendi başına pratik yap: Online PHP derleyicisi