Komut Kalıbı
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 75 / 91.
Command Pattern, bir isteği istekle ilgili tüm bilgileri içeren bağımsız bir nesneye dönüştüren davranışsal bir tasarım desenidir. Bu dönüşüm, istekleri metot bağımsız değişkenleri olarak aktarmanıza, bir isteğin yürütülmesini geciktirmenize veya kuyruğa almanıza ve geri alınabilir işlemleri desteklemenize olanak tanır.
Bir restoran düşün.
Yemek sipariş ettiğinde garson siparişini bir fişe (komuta) yazar, onu mutfağa götürür ve şef komutu çalıştırır. Garsonun nasıl yemek pişirileceğini bilmesine gerek yoktur; yalnızca komutu iletir.
Bu, istekte bulunanı yürütücüden ayrıştırır.
İşte temel bir uygulama:
<?php
interface Command {
public function execute(): string;
}class Light {
public function on(): string { return "Light is ON"; }
public function off(): string { return "Light is OFF"; }
}class LightOnCommand implements Command {
public function __construct(private Light $light) {}
public function execute(): string {
return $this->light->on();
}
}class LightOffCommand implements Command {
public function __construct(private Light $light) {}
public function execute(): string {
return $this->light->off();
}
}
Çağıran, komutların ne yaptığını bilmeden onları tetikler:
<?php
class RemoteControl {
public function press(Command $command): string {
return $command->execute();
}
}$light = new Light();
$remote = new RemoteControl();
echo $remote->press(new LightOnCommand($light)) . "\n";
echo $remote->press(new LightOffCommand($light));
Çıktı:
Light is ON
Light is OFFCommand Pattern; işlemleri kuyruğa almanız, geri alma işlevini uygulamanız veya eylemleri günlüğe kaydetmeniz gerektiğinde mükemmeldir. Her komut kendi içinde bağımsızdır; bu da mevcut kodu değiştirmeden yeni komutlar eklemeyi kolaylaştırır.
Görev
KolayCommand Pattern'ı kullanarak bir metin düzenleyici komut sistemi oluşturalım. Metin düzenleyicilerin genellikle metin yazma, metin silme ve eylemleri geri alma gibi işlemleri desteklemesi gerekir: her işlem, birleşik bir arayüz üzerinden çalıştırılabilen, kendi kendine yeten bir komut nesnesine dönüşür.
Kodunuzu dört dosyaya ayıracaksınız:
Command.php: Tek birCommandmetoduna sahip birexecute(): stringarayüzü tanımlayın. Bu, tüm düzenleyici komutlarının uyması gereken sözleşmeyi oluşturur.TextEditor.php: Gerçek işi gerçekleştiren nesne, yani alıcıyı temsil eden birTextEditorsınıfı oluşturun. Düzenleyiciniz şunları yapmalıdır:- Geçerli metin içeriğini saklamak (boş bir dizeyle başlayın)
- İçeriğe metin ekleyen ve
write(string $text): stringdöndüren bir"Written: [text]"metoduna sahip olmak - İçeriği boşaltan ve
clear(): stringdöndüren bir"Content cleared"metoduna sahip olmak - Geçerli içeriği döndüren bir
getContent(): stringmetoduna sahip olmak
Commands.php: Command ve TextEditor dosyalarını dahil edin.Commandarayüzünü uygulayan iki komut sınıfı oluşturun:WriteCommand: Oluşturucusunda birTextEditorve bir metin dizesi alır.execute()metodu, düzenleyicininwrite()metodunu çağırır ve sonucu döndürür.ClearCommand: Oluşturucusunda birTextEditoralır.execute()metodu, düzenleyicininclear()metodunu çağırır ve sonucu döndürür.
main.php: Commands dosyasını dahil edin. İki girdi alacaksınız: bir komut türü ("write"veya"clear") ve bir metin dizesi (yalnızca write komutları için kullanılır).Bir
TextEditorörneği oluşturun. Komut türüne göre uygun komut nesnesini oluşturun. Ardından, komut üzerindeexecute()metodunu çağırıp sonucu yazdıran bir çağırıcı işlev veya basit bir mekanizma oluşturun.Yeni bir satırda, düzenleyicinin geçerli içeriğini şu biçimde yazdırın:
Content: [content](boşsa, boşluktan sonra hiçbir şey olmadan yalnızcaContent:yazdırın).
Bu çalışma, Command Pattern'ın her işlemi bir nesne olarak nasıl kapsüllediğini gösterir. Çağırıcı, bir write veya clear komutunu çalıştırdığını bilmek zorunda değildir. Yalnızca execute() metodunu çağırır ve ayrıntıları komutun ele almasına izin verir.
Kendin dene
<?php
require_once 'Commands.php';
// Girdiyi oku
$commandType = trim(fgets(STDIN)); // "write" veya "clear"
$text = trim(fgets(STDIN)); // write komutu için metin
// TODO: Bir TextEditor örneği oluştur
// TODO: Komut türüne göre uygun komut nesnesini oluştur
// - Eğer "write" ise, editör ve metin ile bir WriteCommand oluştur
// - Eğer "clear" ise, editör ile bir ClearCommand oluştur
// TODO: Komut üzerinde execute() çağıran bir invoker mekanizması oluştur
// ve sonucu yazdırır
// TODO: Editörün mevcut içeriğini şu formatta yazdır: "Content: [content]"
// (eğer boşsa, sadece "Content: " yazdır, boşluktan sonra hiçbir şey olmasın)
?>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