Bileşik Kalıp
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 80 / 91.
Composite Pattern, nesneleri ağaç yapılarına oluşturmanıza ve ardından bu yapılarla tek tek nesnelermiş gibi çalışmanıza olanak tanıyan yapısal bir tasarım kalıbıdır. Tek nesneleri ve nesne gruplarını aynı şekilde ele almak istediğiniz parça-bütün hiyerarşilerini temsil etmek için idealdir.
Bir dosya sistemi düşünün. Bir klasör dosyalar ve diğer klasörleri içerebilir.
Toplam boyutu hesapladığınızda, aynı yöntemi hem dosyalarda hem de klasörlerde çağırmak istersiniz; klasörler içeriklerinin boyutlarını yinelemeli olarak toplamalıdır. Composite Pattern, hem yapraklara (dosyalara) hem de bileşiklere (klasörlere) aynı arayüzü sağlayarak bunu sorunsuz hâle getirir.
<?php
interface FileSystemItem {
public function getName(): string;
public function getSize(): int;
}
class File implements FileSystemItem {
public function __construct(
private string $name,
private int $size
) {}
public function getName(): string {
return $this->name;
}
public function getSize(): int {
return $this->size;
}
}
class Folder implements FileSystemItem {
private array $items = [];
public function __construct(private string $name) {}
public function getName(): string {
return $this->name;
}
public function add(FileSystemItem $item): void {
$this->items[] = $item;
}
public function getSize(): int {
$total = 0;
foreach ($this->items as $item) {
$total += $item->getSize();
}
return $total;
}
}
Artık ağaç yapıları oluşturabilir ve bunları aynı şekilde ele alabilirsiniz:
<?php
$docs = new Folder("Documents");
$docs->add(new File("resume.pdf", 250));
$docs->add(new File("cover.docx", 50));
$images = new Folder("Images");
$images->add(new File("photo.jpg", 1500));
$root = new Folder("Root");
$root->add($docs);
$root->add($images);
$root->add(new File("readme.txt", 10));
echo $root->getSize();
Çıktı:
1810İstemci kodu, tek bir dosyayla mı yoksa derinlemesine iç içe geçmiş bir klasör yapısıyla mı çalıştığını önemsemeden getSize() çağrısını yapar. Bu desen, özyinelemeyi dahili olarak ele alarak karmaşık hiyerarşilerle çalışmayı kolaylaştırır.
Görev
KolayComposite Pattern kullanarak bir organizasyon şeması sistemi oluşturalım. Şirketler, departmanların çalışanları ve diğer alt departmanları içerebildiği hiyerarşik bir yapıya sahiptir: kuruluş genelinde toplamları tek tip şekilde hesaplamak istediğiniz mükemmel bir ağaç yapısı.
Kodunuzu dört dosyaya ayıracaksınız:
OrganizationUnit.php: Hem bireysel çalışanların hem de departmanların uygulayacağı birOrganizationUnitarayüzü tanımlayın. Bu arayüz iki metoda sahip olmalıdır:getName(): stringvegetSalary(): int. Bu ortak arayüz, maliyetleri hesaplarken tekil çalışanları ve tüm departmanları aynı şekilde ele almanızı sağlar.Employee.php: OrganizationUnit arayüzünü dahil edin ve bunu uygulayan birEmployeesınıfı oluşturun. Bir çalışan, organizasyon ağacındaki yaprak düğümdür. Bir adı ve maaşı vardır ancak başka birim içeremez. Adı ve maaşı kabul etmek için yapıcı destekli özellik tanımlamayı kullanın ve her iki arayüz metodunu da uygulayın.Department.php: OrganizationUnit arayüzünü dahil edin ve bunu uygulayan birDepartmentsınıfı oluşturun. Bir departman, hem çalışanları hem de diğer departmanları içerebilen bir bileşik yapıdır. Departmanınız şunları yapmalıdır:- Yapıcısında bir adı kabul etmek
- Departmanın adını döndürmek için
getName()metodunu uygulamak - Çalışanları veya alt departmanları eklemek için
add(OrganizationUnit $unit): voidmetoduna sahip olmak - İçerdiği tüm birimlerin toplam maaşını döndürmek için
getSalary()metodunu uygulamak (içerideki her şeyi özyinelemeli olarak toplamak)
main.php: Employee ve Department dosyalarını dahil edin. Bir girdi alacaksınız: organizasyon yapısını temsil eden bir JSON dizesi.JSON şu formatta olacaktır:
{"Engineering": [{"name": "Alice", "salary": 80000}, {"name": "Bob", "salary": 75000}], "Sales": [{"name": "Carol", "salary": 65000}]}Her anahtar bir departman adıdır ve değeri, adları ve maaşlarıyla birlikte çalışanlardan oluşan bir dizidir.
"Company"adlı bir kökDepartmentoluşturun. JSON içindeki her departman için birDepartmentoluşturun, çalışanlarını ekleyin, ardından bu departmanı Company'ye ekleyin. Son olarak toplam şirket maaşını şu formatta yazdırın:Total Salary: [amount]
Composite Pattern'ın güzelliği, Company departmanı üzerinde getSalary() çağrıldığında tüm iç içe departmanlar ve çalışanlar genelindeki toplamı otomatik olarak hesaplamasıdır: istemci kodunun iç yapıyı bilmesine gerek yoktur.
Kendin dene
<?php
require_once 'Employee.php';
require_once 'Department.php';
// JSON girdisini oku
$input = trim(fgets(STDIN));
$data = (array)json_decode($input, true);
// TODO: "Company" adında bir kök Department oluştur
// TODO: JSON verisindeki her department için döngü kur
// Her department için:
// - Yeni bir Department nesnesi oluştur
// - Her employee'yi o department'a ekle
// - Department'ı Company'ye ekle
// TODO: Toplam maaşı şu formatta yazdır: Total Salary: [amount]
?>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