Tasarım Kalıplarına Giriş
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 70 / 91.
Tasarım desenleri, yazılım geliştirirken geliştiricilerin 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ı yemek tarifleri gibi düşünün. Bir şefin zaman içinde mükemmelleştirilmiş bir yemeği hazırlamak için bir tarifi takip etmesi gibi, geliştiriciler de kodlarını kendilerinden önceki sayısız programcı tarafından test edilmiş ve geliştirilmiş yollarla yapılandırmak için tasarım kalıplarını kullanırlar.
Tasarım desenleri genellikle üç kategoride gruplandırılır:
| Kategori | Amaç | Örnekler |
|---|---|---|
| Yaratımsal | Nesnelerin nasıl oluşturulduğu | Singleton, Factory |
| Yapısal | Nesnelerin nasıl bir araya getirildiği | Adapter, Decorator |
| Davranışsal | Nesnelerin nasıl iletişim kurduğu | Observer, Strategy |
Aslında bu kurs boyunca farkında olmadan desenleri kullanıyordunuz. Alt sınıfların uygulaması gereken metotlara sahip soyut sınıflar oluşturduğunuzda, Template Method deseninin bir formunu uyguluyordunuz. Sözleşmeleri tanımlamak için arayüzleri kullandığınızda, Strategy deseni için hazırlık yapıyordunuz.
Tasarım desenlerini öğrenmek, size diğer geliştiricilerle ortak bir kelime dağarcığı kazandırır. Karmaşık bir yapıyı ayrıntılı olarak açıklamak yerine, sadece "Burada Factory desenini kullandım" diyebilirsiniz ve deneyimli geliştiriciler yaklaşımınızı hemen anlayacaktır. Takip eden derslerde, PHP'de birkaç temel deseni uygulayacağız.
Görev
KolayTasarım desenlerinin kodu düzenlemeye nasıl yardımcı olduğunu gösteren basit bir mesaj formatlama sistemi oluşturalım. Her bir bileşenin hangi desen kategorisine ait olduğunu belirleyecek ve bir sistemin farklı parçalarının nasıl birlikte çalıştığını göreceksiniz.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
MessageFormatter.php— Mesajları formatlamak için bir sözleşme tanımlayanMessageFormatteradında bir arayüz (interface) oluşturun.format(string $message): stringadında tek bir metodu olmalıdır. Bu, behavioral (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 edin ve arayüzü uygulayan (implement) iki sınıf oluşturun:UppercaseFormatter—format()metodu, mesajı büyük harfe dönüştürülmüş olarak döndürürBracketFormatter—format()metodu, mesajı[message]şeklinde köşeli parantez içine alır
main.php— Formatters dosyasını dahil edin. İki girdi alacaksınız: bir mesaj dizesi ve bir formatlayıcı türü ("upper"veya"bracket").Bir
MessageFormatterve bir mesaj dizesi kabul eden, ardından formatlanmış sonucu döndürenprocessMessageadında bir fonksiyon oluşturun. Bu fonksiyonun hangi spesifik formatlayıcıyı aldığını bilmesine gerek yoktur — sadece kendisine iletilen nesne üzerindeformat()metodunu çağırır.Formatlayıcı türü girdisine bağlı olarak uygun formatlayıcı nesnesini oluşturun. Bunu mesajla birlikte
processMessagefonksiyonunuza iletin ve sonucu yazdırın.Yeni bir satırda, bu yapının hangi desen kategorisini temsil ettiğini yazdırın. Bir arayüz aracılığıyla birbirinin yerine geçebilir davranışlar tanımladığımız için şunu yazdırın:
Pattern category: Behavioral
Bu meydan okuma, arayüzlerin, onları kullanan kodu değiştirmeden uygulamaları (implementations) değiştirmenize nasıl olanak tanıdığını gösterir — bu, gelecek derslerde keşfedeceğiniz Strategy gibi desenlerin temelidir.
Kopya kağıdı
Tasarım desenleri, kodu etkili bir şekilde yapılandırmak için şablonlar sağlayan, yaygın programlama sorunlarına yönelik kanıtlanmış çözümlerdir.
Tasarım desenleri üç kategoride gruplandırılır:
| Kategori | Amaç | Örnekler |
|---|---|---|
| Yaratımsal (Creational) | Nesnelerin nasıl oluşturulduğu | Singleton, Factory |
| Yapısal (Structural) | Nesnelerin nasıl bir araya getirildiği | Adapter, Decorator |
| Davranışsal (Behavioral) | Nesnelerin nasıl iletişim kurduğu | Observer, Strategy |
Tasarım desenleri, geliştiriciler arasında ortak bir kelime dağarcığı sağlayarak karmaşık mimari kararların iletilmesini kolaylaştırır.
Kendin dene
<?php
require_once 'Formatters.php';
// Girdiyi oku
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: Bir MessageFormatter ve bir mesaj dizesi kabul eden,
// ardından biçimlendirilmiş sonucu döndüren processMessage adında bir fonksiyon oluşturun
// TODO: $formatterType değerine göre ("upper" veya "bracket"), uygun biçimlendiriciyi oluşturun
// TODO: Biçimlendirici ve mesaj ile processMessage fonksiyonunu çağırın, ardından sonucu yazdırın
// TODO: Desen kategorisini yeni bir satıra yazdırın
// Biçim: "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 KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarı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ıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi