Tasarım Desenlerine Giriş
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 70 / 91.
Tasarım kalıpları, geliştiricilerin yazılım oluştururken tekrar tekrar karşılaştığı yaygın sorunlara yönelik kanıtlanmış çözümlerdir. Her seferinde tekerleği yeniden icat etmek yerine, kendi kodunuzdaki benzer zorlukları çözmek için bu yerleşik şablonları uygulayabilirsiniz.
Tasarım kalıplarını tarifler olarak düşünün. Tıpkı bir şefin zaman içinde mükemmelleştirilmiş bir yemek hazırlamak için bir tarifi takip etmesi gibi, geliştiriciler de kodlarını kendilerinden önce sayısız programcı tarafından test edilmiş ve geliştirilmiş şekillerde yapılandırmak için tasarım kalıplarını kullanır.
Tasarım kalıpları genellikle üç kategoriye ayrılır:
| Kategori | Amaç | Örnekler |
|---|---|---|
| Oluşturucu | Nesnelerin nasıl oluşturulduğu | Singleton, Factory |
| Yapısal | Nesnelerin nasıl birleştirildiği | Adapter, Decorator |
| Davranışsal | Nesnelerin nasıl iletişim kurduğu | Observer, Strategy |
Aslında bu kurs boyunca farkına varmadan kalıpları kullandın. Alt sınıfların uygulaması gereken yöntemlere sahip soyut sınıflar oluşturduğunda, Şablon Yöntemi kalıbının bir biçimini uyguluyordun. Sözleşmeleri tanımlamak için arayüzleri kullandığında ise Strateji kalıbına zemin hazırlıyordun.
Tasarım pattern’lerini öğrenmek, diğer geliştiricilerle ortak bir kelime dağarcığı oluşturmanızı sağlar. Karmaşık bir yapıyı ayrıntılı olarak açıklamak yerine, yalnızca "Burada Factory pattern kullandım" diyebilirsiniz ve deneyimli geliştiriciler yaklaşımınızı hemen anlayacaktır. Sonraki derslerde PHP’de birkaç temel pattern uygulayacağız.
Görev
KolayTasarım kalıplarının kodu düzenlemeye nasıl yardımcı olduğunu gösteren basit bir mesaj biçimlendirme sistemi oluşturalım. Her bileşenin hangi kalıp kategorisine ait olduğunu belirleyecek ve bir sistemin farklı bölümlerinin birlikte nasıl çalıştığını göreceksin.
Kodunu üç dosyaya ayıracaksın:
MessageFormatter.php: Mesajları biçimlendirmek için bir sözleşme tanımlayanMessageFormatteradlı bir arayüz oluştur. Bu arayüzde tek birformat(string $message): stringmetodu bulunmalı. Bu, davranışsal kategoriyi temsil eder. Nesnelerin nasıl iletişim kurduğunu ve verileri nasıl işlediğini tanımlar.Formatters.php: MessageFormatter dosyasını dahil et ve arayüzü uygulayan iki sınıf oluştur:UppercaseFormatter:format()metodu, mesajı büyük harfe dönüştürülmüş hâliyle döndürürBracketFormatter:format()metodu, mesajı[message]gibi köşeli parantezlerin içine alır
main.php: Formatters dosyasını dahil et. İki girdi alacaksın: bir mesaj dizesi ve bir biçimlendirici türü ("upper"veya"bracket").Bir
processMessageve mesaj dizesi kabul eden, ardından biçimlendirilmiş sonucu döndürenMessageFormatteradlı bir işlev oluştur. Bu işlevin hangi özel biçimlendiriciyi aldığını bilmesine gerek yoktur. Kendisine geçirilen nesne üzerinde yalnızcaformat()metodunu çağırır.Biçimlendirici türü girdisine göre uygun biçimlendirici nesnesini oluştur. Bu nesneyi mesajla birlikte
processMessageişlevine gönder ve sonucu yazdır.Yeni bir satırda, bu yapının hangi kalıp kategorisini temsil ettiğini yazdır. Bir arayüz aracılığıyla birbirinin yerine kullanılabilen davranışları tanımladığımız için şunu yazdır:
Pattern category: Behavioral
Bu alıştırma, arayüzlerin, onları kullanan kodu değiştirmeden uygulamaları değiştirmene nasıl olanak tanıdığını gösterir: Bu, gelecek derslerde inceleyeceğin Strategy gibi kalıpların temelini oluşturur.
Kendin dene
<?php
require_once 'Formatters.php';
// Girdiyi oku
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: MessageFormatter kabul eden processMessage adında bir fonksiyon oluştur
// ve bir mesaj dizesi, ardından biçimlendirilmiş sonucu döndürür
// TODO: $formatterType ("upper" veya "bracket") değerine göre uygun biçimlendiriciyi oluştur
// TODO: processMessage'ı biçimlendirici ve mesaj ile çağır, ardından sonucu yazdır
// TODO: Print the pattern category on a new line
// Format: "Pattern category: Behavioral"
?>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