Ş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 temel sınıfta bir algoritmanın iskeletini 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 desendir. Temel sınıf iş akışını kontrol ederken, türetilmiş sınıflar bağımsız 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 "şablon metot" (template method) 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");
}Temel sınıf işlem sırasını zorunlu kılarken, her alt sınıf kendi uygulamasını sağ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 kaydediliyorTemplate 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 (base class) yerleştirerek kodun yeniden kullanılabilirliğini teşvik ederken, geçersiz kılınabilir metotlar (overridable methods) aracılığıyla esneklik sağlar.
Görev
KolayTemplate 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:Reportingad alanında (namespace) soyut birReportGeneratorsınıfı oluşturun. Bu temel sınıf,Generate()adlı bir şablon metot (template method) aracılığıyla rapor oluşturma algoritmasının iskeletini tanımlar. Metot sırasıyla üç adımı çağırmalıdır:GatherData(),FormatReport()veOutputReport().GatherData()veFormatReport()metotlarını soyut (abstract) yapın (her rapor türü bunları farklı şekilde uygulayacaktır),OutputReport()ise varsayılan olarakSending to default printeryazdıran sanal (virtual) bir metot olmalıdır.ConcreteReports.cs: Aynı ad alanındaReportGeneratorsınıfından türeyen iki somut rapor sınıfı oluşturun:SalesReport-GatherData()metodunuCollecting sales data from databaseyazdıracak şekilde veFormatReport()metodunuFormatting as sales summaryyazdıracak şekilde uygular.InventoryReport-GatherData()metodunuScanning warehouse inventoryyazdıracak şekilde,FormatReport()metodunuFormatting as inventory listyazdıracak şekilde uygular veOutputReport()metodunuSending to warehouse manageryazdı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ü:
salesveyainventory
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 printerGirdi inventory ise çıktı şu şekilde olmalıdır:
Scanning warehouse inventory
Formatting as inventory list
Sending to warehouse managerHer iki raporun da tam olarak aynı algoritma yapısını (topla, formatla, çıktı 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 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!
Kendin dene
using System;
using Reporting;
class Program
{
public static void Main(string[] args)
{
string reportType = Console.ReadLine();
// TODO: reportType değerine 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
}
}
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 Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarı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ıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci Kayıtları