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.

Şablon Yöntemi deseni, bir algoritmanın iskeletini 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 olanak tanıyan davranışsal bir desendir. Temel sınıf iş akışını kontrol ederken, türetilmiş sınıflar ayrı parçaları özelleştirir.

Bu kalıp, kalıtım ve soyut yöntemleri kullanır. Temel sınıf, bazıları soyut olan ve alt sınıflar tarafından uygulanması gereken bir dizi adımı çağıran bir "şablon yöntemi" içerir:

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şlemlerin sırasını zorunlu kılar:

DataProcessor csv = new CsvProcessor();
csv.Process();
// CSV dosyasını okuma
// CSV verilerini ayrıştırma
// Saving to default location

DataProcessor json = new JsonProcessor();
json.Process();
// JSON dosyasını okuma
// JSON verilerini ayrıştırma
// Buluta kaydetme

Şablon Yöntemi deseni, birden fazla sınıf aynı algoritma yapısını paylaştığında ancak belirli adımlarda farklılaştığında idealdir. Ortak mantığı temel sınıfa yerleştirirken geçersiz kılınabilir yöntemler aracılığıyla esneklik sağlayarak kodun yeniden kullanılmasını teşvik eder.

challenge icon

Görev

Kolay

Şablon Yöntemi (Template Method) desenini kullanarak bir rapor oluşturma sistemi geliştirelim. Farklı rapor türleri (satış raporları ve envanter raporları gibi) aynı genel yapıyı paylaşır; hepsinin veri toplaması, verileri biçimlendirmesi ve sonucu çıktı olarak vermesi gerekir. Ancak her rapor türü bu adımları farklı şekilde ele alır.

Kodunuzu üç dosyaya ayıracaksınız:

  • ReportGenerator.cs: ReportGenerator ad alanında soyut bir Reporting sınıfı oluşturun. Bu temel sınıf, Generate() adlı bir şablon yöntemi aracılığıyla rapor oluşturma algoritmasının iskeletini tanımlar. Yöntem şu üç adımı sırayla çağırmalıdır: GatherData(), FormatReport() ve OutputReport(). GatherData() ve FormatReport() yöntemlerini soyut yapın (her rapor türü bunları farklı şekilde uygulayacaktır). OutputReport() ise Sending to default printer yazdıran varsayılan bir uygulamaya sahip sanal bir yöntem 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() yöntemini Collecting sales data from database yazdıracak şekilde ve FormatReport() yöntemini Formatting as sales summary yazdıracak şekilde uygular
    • InventoryReport - GatherData() yöntemini Scanning warehouse inventory yazdıracak şekilde, FormatReport() yöntemini Formatting as inventory list yazdıracak şekilde uygular ve OutputReport() yöntemini geçersiz kılarak Sending to warehouse manager yazdırır
  • Program.cs: Rapor örnekleri oluşturup bunları üreterek her şeyi bir araya getirin. Şablon yöntemi, 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 onun Generate() yöntemini ç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

Girdi inventory ise çıktı şu şekilde olmalıdır:

Scanning warehouse inventory
Formatting as inventory list
Sending to warehouse manager

Her iki raporun da tamamen aynı algoritma yapısını (topla, biçimlendir, çıktı olarak ver) izlediğine, ancak her adımın uygulamasının özelleştirildiğine dikkat edin. SalesReport varsayılan çıktı davranışını kullanırken InventoryReport bu davranışı geçersiz kılar. Bu, Şablon Yöntemi 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 nasıl kontrol etmenizi sağladığını gösterir!

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ştur
        // Eğer reportType "sales" ise, bir SalesReport oluştur
        // Eğer reportType "inventory" ise, bir InventoryReport oluştur
        // Ardından rapor üzerinde Generate() metodunu çağır
        
    }
}
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 C# derleyicisi