Menu
Coddy logo textTech

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 OFF

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

challenge icon

Görev

Kolay

Command 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 bir Command metoduna sahip bir execute(): string arayü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 bir TextEditor sı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): string döndüren bir "Written: [text]" metoduna sahip olmak
    • İçeriği boşaltan ve clear(): string döndüren bir "Content cleared" metoduna sahip olmak
    • Geçerli içeriği döndüren bir getContent(): string metoduna sahip olmak
  • Commands.php: Command ve TextEditor dosyalarını dahil edin. Command arayüzünü uygulayan iki komut sınıfı oluşturun:
    • WriteCommand: Oluşturucusunda bir TextEditor ve bir metin dizesi alır. execute() metodu, düzenleyicinin write() metodunu çağırır ve sonucu döndürür.
    • ClearCommand: Oluşturucusunda bir TextEditor alır. execute() metodu, düzenleyicinin clear() 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 üzerinde execute() 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ızca Content: 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)

?>
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