Menu
Coddy logo textTech

Şablon Metot Kalıbı

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 78 / 91.

Şablon Yöntem Deseni (Template Method Pattern), bir algoritmanın iskeletini bir temel sınıfta tanımlayan ve alt sınıfların genel yapıyı değiştirmeden belirli adımları geçersiz kılmasına (override) olanak tanıyan davranışsal bir tasarım desenidir. Temel sınıf iş akışını kontrol ederken, alt sınıflar münferit parçaları özelleştirir.

Farklı türde belgeler oluşturmayı düşünün.

Her belge aynı süreci takip eder: başlık oluştur, içerik ekle, alt bilgi oluştur. Ancak her adımın ayrıntıları belge türüne göre değişir. Şablon yöntemi (template method) bu diziyi tanımlarken, alt sınıflar ayrıntıları uygular.

<?php
abstract class DocumentGenerator {
    // Şablon metodu - algoritma yapısını tanımlar
    public final function generate(): string {
        $output = $this->createHeader();
        $output .= $this->createContent();
        $output .= $this->createFooter();
        return $output;
    }
    
    // Alt sınıflar tarafından uygulanacak adımlar
    abstract protected function createHeader(): string;
    abstract protected function createContent(): string;
    abstract protected function createFooter(): string;
}

class HtmlDocument extends DocumentGenerator {
    protected function createHeader(): string {
        return "<html><head></head><body>";
    }
    
    protected function createContent(): string {
        return "<p>Hello World</p>";
    }
    
    protected function createFooter(): string {
        return "</body></html>";
    }
}

class TextDocument extends DocumentGenerator {
    protected function createHeader(): string {
        return "=== DOCUMENT ===\n";
    }
    
    protected function createContent(): string {
        return "Hello World\n";
    }
    
    protected function createFooter(): string {
        return "=== END ===";
    }
}

$html = new HtmlDocument();
echo $html->generate() . "\n";

$text = new TextDocument();
echo $text->generate();

Çıktı:

<html><head></head><body><p>Hello World</p></body></html>
=== DOCUMENT ===
Hello World
=== END ===

Şablon metodundaki final anahtar kelimesine dikkat edin. Bu, alt sınıfların algoritmanın yapısını değiştirmesini engeller. Bu desen, aynı iş akışını takip eden ancak uygulama detaylarında farklılık gösteren birden fazla sınıfınız olduğunda idealdir. Yeni bir doküman türü eklemek, mevcut koda dokunmadan yeni bir alt sınıf oluşturmak anlamına gelir.

challenge icon

Görev

Kolay

Template Method Desenini kullanarak bir rapor oluşturma sistemi inşa edelim. Farklı rapor türleri aynı yapıyı takip eder — bir başlık bölümü, veri bölümü ve özet bölümü — ancak her rapor türü bu bölümleri farklı şekilde biçimlendirir. Template method bu iş akışını tanımlarken, alt sınıflar her bir adımı özelleştirecektir.

Kodunuzu dört dosya halinde düzenleyeceksiniz:

  • ReportGenerator.php — Rapor oluşturma algoritmasının iskeletini tanımlayan soyut bir ReportGenerator sınıfı oluşturun. Sınıfınız şunları yapmalıdır:
    • Yapıcı metodunda (constructor) bir rapor başlığı kabul etmelidir (constructor promotion kullanın)
    • Sırasıyla üç adımı çağıran final bir public generate(): string metoduna sahip olmalıdır: createTitle(), createBody() ve createSummary(); bu adımların sonuçlarını birleştirmelidir
    • Alt sınıfların uygulaması gereken üç adet soyut (abstract) korumalı (protected) metod bildirmelidir: createTitle(): string, createBody(): string ve createSummary(): string
  • HtmlReport.php — ReportGenerator dosyasını dahil edin ve onu genişleten bir HtmlReport sınıfı oluşturun. Bu rapor, çıktıyı HTML olarak biçimlendirir:
    • createTitle() metodu "<h1>" . $this->title . "</h1>" (veya "<h1>[title]</h1>" formatında) döndürür
    • createBody() metodu "<p>Report data goes here</p>" döndürür
    • createSummary() metodu "<footer>End of report</footer>" döndürür
  • PlainTextReport.php — ReportGenerator dosyasını dahil edin ve onu genişleten bir PlainTextReport sınıfı oluşturun. Bu rapor basit metin biçimlendirmesi kullanır:
    • createTitle() metodu "### " . $this->title . " ###\n" (veya "### [title] ###\n" formatında) döndürür
    • createBody() metodu "Report data goes here\n" döndürür
    • createSummary() metodu "--- End of report ---" döndürür
  • main.php — Her iki rapor dosyasını da dahil edin. İki girdi alacaksınız: bir rapor türü ("html" veya "text") ve bir rapor başlığı.

    Rapor türüne bağlı olarak, verilen başlıkla uygun rapor oluşturucuyu oluşturun. generate() metodunu çağırın ve tamamlanmış raporu yazdırın.

Template Method Deseni, her rapor türünün kendi bölümlerini benzersiz şekilde biçimlendirmesine izin verirken tüm raporların aynı üç adımlı yapıyı izlemesini sağlar. generate() metodu üzerindeki final anahtar kelimesi, alt sınıfların algoritmanın sırasını değiştirmesini engeller — onlar sadece bireysel adımları özelleştirebilirler.

Kopya kağıdı

Template Method Deseni, bir algoritmanın iskeletini bir temel sınıfta tanımlar ve alt sınıfların genel yapıyı değiştirmeden belirli adımları geçersiz kılmasına (override) olanak tanır.

Temel sınıf, iş akışı sırasını kontrol eden bir şablon metod içerir. Bu metod, alt sınıfların algoritmanın yapısını değiştirmesini önlemek için genellikle final olarak işaretlenir.

Alt sınıflar, algoritmanın bireysel adımlarını özelleştirmek için soyut (abstract) metodları uygular.

<?php
abstract class DocumentGenerator {
    // Şablon metod - algoritma yapısını tanımlar
    public final function generate(): string {
        $output = $this->createHeader();
        $output .= $this->createContent();
        $output .= $this->createFooter();
        return $output;
    }
    
    // Alt sınıfların uygulaması gereken soyut adımlar
    abstract protected function createHeader(): string;
    abstract protected function createContent(): string;
    abstract protected function createFooter(): string;
}

class HtmlDocument extends DocumentGenerator {
    protected function createHeader(): string {
        return "<html><head></head><body>";
    }
    
    protected function createContent(): string {
        return "<p>Hello World</p>";
    }
    
    protected function createFooter(): string {
        return "</body></html>";
    }
}

$html = new HtmlDocument();
echo $html->generate();

Temel özellikler:

  • Algoritma yapısının değiştirilmesini önlemek için şablon metod final olarak işaretlenir
  • Soyut metodlar, alt sınıflar için özelleştirme noktalarını tanımlar
  • Birden fazla sınıfın aynı iş akışını takip ettiği ancak uygulama detaylarında farklılık gösterdiği durumlar için idealdir
  • Yeni varyantlar eklemek, mevcut kodu değiştirmeden sadece yeni alt sınıflar oluşturmayı gerektirir

Kendin dene

<?php

require_once 'HtmlReport.php';
require_once 'PlainTextReport.php';

// Girdiyi oku
$reportType = trim(fgets(STDIN));
$reportTitle = trim(fgets(STDIN));

// YAPILACAK: Rapor türüne ("html" veya "text") bağlı olarak,
// verilen başlıkla uygun rapor oluşturucuyu oluşturun

// YAPILACAK: generate() işlevini çağırın ve raporun tamamını yazdırı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