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 99 / 104.

Template Method deseni, bir algoritmanın iskeletini temel sınıfta tanımlar ve alt sınıfların algoritmanın genel yapısını değiştirmeden belirli adımları geçersiz kılmasına olanak tanır. Tüm algoritmaları değiştiren Strategy deseninin aksine Template Method, algoritmayı sabit tutarken tek tek ad özelleştirilmesine izin verir.

Temel sınıf, şablon yöntemini (algoritmayı) uygular ve alt sınıfların sağlaması gereken soyut veya sanal yöntemleri çağırır:

#include <iostream>

class DataProcessor {
public:
    // Şablon metodu - algoritma iskeletini tanımlar
    void process() {
        loadData();
        processData();
        saveResults();
    }
    
    virtual ~DataProcessor() = default;
    
protected:
    virtual void loadData() = 0;      // Uygulanması zorunlu
    virtual void processData() = 0;   // Uygulanması zorunlu
    
    // Hook - varsayılan davranışla isteğe bağlı override
    virtual void saveResults() {
        std::cout << "Saving to default location\n";
    }
};

class CSVProcessor : public DataProcessor {
protected:
    void loadData() override {
        std::cout << "Loading CSV file\n";
    }
    void processData() override {
        std::cout << "Parsing CSV data\n";
    }
};

class JSONProcessor : public DataProcessor {
protected:
    void loadData() override {
        std::cout << "Loading JSON file\n";
    }
    void processData() override {
        std::cout << "Parsing JSON data\n";
    }
    void saveResults() override {
        std::cout << "Saving to cloud storage\n";
    }
};

int main() {
    CSVProcessor csv;
    csv.process();  // Varsayılan saveResults kullanır
    
    JSONProcessor json;
    json.process(); // Özel saveResults kullanır
}

process() yöntemi şablon yöntemidir; sabit adım dizisini tanımlar. Alt sınıflar loadData() ve processData() yöntemlerini farklı şekilde uygular, ancak sıra asla değişmez. saveResults() yöntemi bir "kanca"dır; alt sınıfların isteğe bağlı olarak üzerine yazabileceği varsayılan bir uygulamaya sahiptir.

Sabit adımlara sahip ancak belirli işlemlerde esnekliğe ihtiyaç duyan bir algoritmanız olduğunda veya benzer sınıflar arasında kod tekrarını önlemek istediğinizde Template Method kullanın.

challenge icon

Görev

Kolay

Şablon Metodu desenini kullanarak bir Report Generator sistemi oluşturalım. Farklı rapor türlerinin (satış raporları ve envanter raporları gibi) aynı oluşturma sürecini izlediği, ancak her rapor türünün belirli adımları özelleştirdiği bir çerçeve oluşturacaksın. Bu, Şablon Metodu için mükemmel bir senaryodur: genel iş akışı sabit kalırken tek tek adımlar değişir.

Kodunu üç dosyada düzenleyeceksin:

  • ReportGenerator.h: Şablon metoduna sahip soyut temel sınıfı tanımla.

    Rapor oluşturma algoritmasının iskeletini tanımlayan bir ReportGenerator sınıfı oluştur. Şablon metodun generateReport() şu adımları sırayla yürütmelidir:

    1. gatherData(): saf sanal, alt sınıflar tarafından uygulanmalıdır
    2. formatReport(): saf sanal, alt sınıflar tarafından uygulanmalıdır
    3. addHeader(): --- Report --- yazdıran varsayılan davranışa sahip bir kanca
    4. printReport(): saf sanal, alt sınıflar tarafından uygulanmalıdır

    addHeader() metodu, alt sınıfların başlığı özelleştirmek için isteğe bağlı olarak geçersiz kılabileceği bir kanca görevi görür.

  • Reports.h: İki somut rapor oluşturucu uygula.

    Şunları yapan bir SalesReport sınıfı oluştur:

    • gatherData(), Gathering sales data from database yazdırır
    • formatReport(), Formatting sales figures yazdırır
    • printReport(), kurucuya aktarılan amount değerinin kullanıldığı Sales Total: $[amount] ifadesini yazdırır

    Şunları yapan bir InventoryReport sınıfı oluştur:

    • gatherData(), Scanning inventory records yazdırır
    • formatReport(), Organizing inventory by category yazdırır
    • addHeader(), kancayı geçersiz kılarak === Inventory Report === yazdırır
    • printReport(), kurucuya aktarılan count değerinin kullanıldığı Items in stock: [count] ifadesini yazdırır

    Her iki sınıf da kendilerine karşılık gelen değerleri (amount veya count) kurucuları aracılığıyla kabul etmelidir.

  • main.cpp: Şablon Metodu desenini göster.

    İki girdi oku:

    1. Satış tutarı (tam sayı)
    2. Envanter sayısı (tam sayı)

    Satış tutarıyla bir SalesReport oluştur ve raporu oluştur. Ardından envanter sayısıyla bir InventoryReport oluştur ve raporu oluştur. Okunabilirlik için iki raporun arasına boş bir satır yazdır.

Örneğin, 15000 ve 250 girdileriyle:

Gathering sales data from database
Formatting sales figures
--- Report ---
Sales Total: $15000

Scanning inventory records
Organizing inventory by category
=== Inventory Report ===
Items in stock: 250

8500 ve 120 girdileriyle:

Gathering sales data from database
Formatting sales figures
--- Report ---
Sales Total: $8500

Scanning inventory records
Organizing inventory by category
=== Inventory Report ===
Items in stock: 120

Her iki raporun da generateReport() içinde tanımlanan adımların tam olarak aynı sırasını izlediğine, ancak her birinin bu adımları farklı şekilde uyguladığına dikkat et. InventoryReport ayrıca başlığı özelleştirmek için kanca metodunu geçersiz kılmayı gösterirken, SalesReport varsayılanı kullanır. Bu, Şablon Metodu deseninin uygulamadaki hâlidir: algoritmanın yapısı temel sınıfta sabitlenmiştir, ancak ayrıntılar esnektir.

Kendin dene

#include <iostream>
#include "Reports.h"

using namespace std;

int main() {
    // Girdileri oku
    int salesAmount;
    int inventoryCount;
    cin >> salesAmount;
    cin >> inventoryCount;
    
    // TODO: salesAmount ile bir SalesReport oluştur ve üret
    
    // TODO: Raporlar arasına boş bir satır yazdır
    
    // TODO: Create an InventoryReport with inventoryCount and generate it
    
    return 0;
}
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