Menu
Coddy logo textTech

Şablon Metot Kalıbı

Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 59 / 70.

Template Method deseni, 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 etmesine) olanak tanıyan davranışsal bir desendir. Temel sınıf iş akışını kontrol ederken, türetilmiş sınıflar münferit parçaları özelleştirir.

Bu desen kalıtım ve soyut metotlar kullanır. Temel sınıf, bir dizi adımı çağıran bir "template method" (şablon metot) içerir; bu adımların bazıları soyuttur ve alt sınıflar tarafından uygulanmalıdır:

public abstract class DataProcessor
{
    // Şablon metodu - algoritma yapısını tanımlar
    public void Process()
    {
        ReadData();
        ProcessData();
        SaveData();
    }
    
    protected abstract void ReadData();
    protected abstract void ProcessData();
    protected virtual void SaveData() => Console.WriteLine("Saving to default location");
}

public class CsvProcessor : DataProcessor
{
    protected override void ReadData() => Console.WriteLine("Reading CSV file");
    protected override void ProcessData() => Console.WriteLine("Parsing CSV data");
}

public class JsonProcessor : DataProcessor
{
    protected override void ReadData() => Console.WriteLine("Reading JSON file");
    protected override void ProcessData() => Console.WriteLine("Parsing JSON data");
    protected override void SaveData() => Console.WriteLine("Saving to cloud");
}

Her alt sınıf kendi uygulamasını sağlarken, temel sınıf işlem sırasını zorunlu kılar:

DataProcessor csv = new CsvProcessor();
csv.Process();
// CSV dosyası okunuyor
// CSV verisi ayrıştırılıyor
// Varsayılan konuma kaydediliyor

DataProcessor json = new JsonProcessor();
json.Process();
// JSON dosyası okunuyor
// JSON verisi ayrıştırılıyor
// Buluta kaydediliyor

Template Method deseni, birden fazla sınıfın aynı algoritma yapısını paylaştığı ancak belirli adımlarda farklılık gösterdiği durumlar için idealdir. Ortak mantığı temel sınıfa (base class) yerleştirirken, geçersiz kılınabilir (overridable) yöntemler aracılığıyla esneklik sağlayarak kodun yeniden kullanılabilirliğini teşvik eder.

challenge icon

Görev

Kolay

Template Method desenini kullanarak bir rapor oluşturma sistemi inşa edelim. Farklı rapor türleri (satış raporları ve envanter raporları gibi) aynı genel yapıyı paylaşır - hepsinin veri toplaması, veriyi formatlaması ve sonucu çıktı olarak vermesi gerekir - ancak her rapor türü bu adımları farklı şekilde yönetir.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • ReportGenerator.cs: Reporting ad alanı (namespace) içinde soyut bir ReportGenerator sınıfı oluşturun. Bu temel sınıf, Generate() adlı bir şablon metot aracılığıyla rapor oluşturma algoritmasının iskeletini tanımlar. Metot sırasıyla üç adımı çağırmalıdır: GatherData(), FormatReport() ve OutputReport(). GatherData() ve FormatReport() metotlarını soyut (abstract) yapın (her rapor türü bunları farklı şekilde uygulayacaktır), OutputReport() ise varsayılan olarak Sending to default printer yazdıran sanal (virtual) bir metot olmalıdır.
  • ConcreteReports.cs: Aynı ad alanında ReportGenerator sınıfından türeyen iki somut rapor sınıfı oluşturun:
    • SalesReport - GatherData() metodunu Collecting sales data from database yazdıracak şekilde ve FormatReport() metodunu Formatting as sales summary yazdıracak şekilde uygular.
    • InventoryReport - GatherData() metodunu Scanning warehouse inventory yazdıracak şekilde, FormatReport() metodunu Formatting as inventory list yazdıracak şekilde uygular ve OutputReport() metodunu Sending to warehouse manager yazdıracak şekilde geçersiz kılar (override).
  • Program.cs: Rapor örnekleri oluşturup bunları üreterek her şeyi bir araya getirin. Şablon metot, her raporun aynı üç adımlı süreci izlemesini sağlar, ancak her adımın özel davranışı rapor türüne göre değişir.

Bir girdi alacaksınız:

  • Rapor türü: sales veya inventory

Girdiye göre uygun rapor oluşturucuyu oluşturun ve Generate() metodunu çağırın.

Örneğin, girdi sales ise çıktı şu şekilde olmalıdır:

Collecting sales data from database
Formatting as sales summary
Sending to default printer

Eğer girdi inventory ise çıktı şu şekilde olmalıdır:

Scanning warehouse inventory
Formatting as inventory list
Sending to warehouse manager

Her iki raporun da tam olarak aynı algoritma yapısını (topla, formatla, çıktı ver) nasıl izlediğine, ancak her adımın uygulamasının nasıl özelleştirildiğine dikkat edin. SalesReport varsayılan çıktı davranışını kullanırken, InventoryReport bunu geçersiz kılar - bu, Template Method deseninin hangi adımların geçersiz kılınmasının zorunlu olduğunu ve hangilerinin isteğe bağlı olarak özelleştirilebileceğini kontrol etmenize nasıl olanak tanıdığını gösterir!

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, bir dizi adımı çağıran bir "şablon yöntem" (template method) içerir. Bazı adımlar soyuttur (alt sınıflar tarafından uygulanmalıdır), diğerleri ise sanal (geçersiz kılınması isteğe bağlı) olabilir:

public abstract class DataProcessor
{
    // Şablon yöntem - algoritma yapısını tanımlar
    public void Process()
    {
        ReadData();
        ProcessData();
        SaveData();
    }
    
    protected abstract void ReadData();
    protected abstract void ProcessData();
    protected virtual void SaveData() => Console.WriteLine("Saving to default location");
}

Alt sınıflar kendi uygulamalarını sağlarken, temel sınıf işlem sırasını zorunlu kılar:

public class CsvProcessor : DataProcessor
{
    protected override void ReadData() => Console.WriteLine("Reading CSV file");
    protected override void ProcessData() => Console.WriteLine("Parsing CSV data");
}

public class JsonProcessor : DataProcessor
{
    protected override void ReadData() => Console.WriteLine("Reading JSON file");
    protected override void ProcessData() => Console.WriteLine("Parsing JSON data");
    protected override void SaveData() => Console.WriteLine("Saving to cloud");
}

Kullanım:

DataProcessor csv = new CsvProcessor();
csv.Process();
// Reading CSV file
// Parsing CSV data
// Saving to default location

DataProcessor json = new JsonProcessor();
json.Process();
// Reading JSON file
// Parsing JSON data
// Saving to cloud

Template Method deseni, birden fazla sınıfın aynı algoritma yapısını paylaştığı ancak belirli adımlarda farklılaştığı durumlar için idealdir. Ortak mantığı temel sınıfa yerleştirerek kodun yeniden kullanılabilirliğini teşvik ederken, geçersiz kılınabilir yöntemler aracılığıyla esneklik sağlar.

Kendin dene

using System;
using Reporting;

class Program
{
    public static void Main(string[] args)
    {
        string reportType = Console.ReadLine();
        
        // TODO: reportType'a göre uygun rapor oluşturucuyu oluşturun
        // Eğer reportType "sales" ise, bir SalesReport oluşturun
        // Eğer reportType "inventory" ise, bir InventoryReport oluşturun
        // Ardından rapor üzerinde Generate() metodunu çağı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