Menu
Coddy logo textTech

Şablon Metot Kalıbı

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

Template Method deseni, bir algoritmanın iskeletini bir temel sınıfta tanımlayarak, alt sınıfların genel yapıyı değiştirmeden belirli adımları geçersiz kılmasına (override etmesine) olanak tanır. Temel sınıf iş akışını kontrol ederken, alt sınıflar bireysel adımları özelleştirir.

Bu desen kalıtımı kullanır: soyut bir sınıf (abstract class), bir dizi adımı çağıran bir şablon yöntemi (template method) tanımlar; bu adımların bazıları soyuttur (alt sınıflar tarafından uygulanmalıdır) ve bazılarının varsayılan uygulamaları vardır:

abstract class DataProcessor {
  // Şablon metodu - algoritma yapısını tanımlar
  void process() {
    readData();
    processData();
    saveData();
  }

  void readData();      // Soyut - alt sınıflar uygulamalıdır
  void processData();   // Soyut - alt sınıflar uygulamalıdır

  void saveData() {     // Varsayılan uygulama
    print('Data saved to database');
  }
}

class CsvProcessor extends DataProcessor {
  @override
  void readData() => print('Reading CSV file');

  @override
  void processData() => print('Parsing CSV rows');
}

class JsonProcessor extends DataProcessor {
  @override
  void readData() => print('Reading JSON file');

  @override
  void processData() => print('Parsing JSON objects');

  @override
  void saveData() => print('Saved to cloud storage');
}

void main() {
  var csv = CsvProcessor();
  csv.process();
  // Reading CSV file
  // Parsing CSV rows
  // Data saved to database

  var json = JsonProcessor();
  json.process();
  // Reading JSON file
  // Parsing JSON objects
  // Saved to cloud storage
}

process() metodu şablondur; işlemlerin sırasını tanımlar. Alt sınıflar readData() ve processData() metodlarını farklı şekilde uygular ve isteğe bağlı olarak saveData() metodunu geçersiz kılabilir. Temel avantaj, algoritmanın yapısının tüm uygulamalarda tutarlı kalması, ancak bireysel adımlarda esneklik sağlamasıdır.

challenge icon

Görev

Kolay

Template Method desenini kullanarak bir rapor oluşturma sistemi inşa edelim! Farklı rapor türlerinin aynı genel yapıyı takip ettiği, ancak her rapor türünün veri toplama ve çıktıyı formatlama gibi belirli adımları özelleştirdiği bir iskelet oluşturacaksınız.

Kodunuzu iki dosyada organize edeceksiniz:

  • report_generator.dart: Bu dosya, soyut temel sınıfınızı ve somut rapor uygulamalarınızı içerir. Rapor oluşturma iş akışını şu sırayla tanımlayan generate() adlı bir template method'a sahip soyut bir ReportGenerator sınıfı oluşturun: fetchData(), analyzeData(), formatReport() ve deliver(). fetchData() ve formatReport() metotları soyut olmalıdır (her rapor türü bunları farklı şekilde ele alır), analyzeData() ise varsayılan uygulama olarak Analyzing data... ve deliver() ise Report delivered via email. yazdırmalıdır. Ardından iki somut rapor sınıfı oluşturun:
    • SalesReport - fetchData() metodu Fetching sales data from database... yazdırır ve formatReport() metodu Formatting as bar charts and tables. yazdırır.
    • InventoryReport - fetchData() metodu Fetching inventory levels from warehouse... yazdırır, formatReport() metodu Formatting as inventory list. yazdırır ve deliver() metodunu Report sent to warehouse manager. yazdıracak şekilde geçersiz kılar (override).
  • main.dart: Rapor oluşturucu dosyanızı içe aktarın ve Template Method deseninin algoritma yapısını tutarlı tutarken özelleştirmeye nasıl izin verdiğini gösterin. Bir SalesReport oluşturun ve generate() metodunu çağırın. Ardından ayırmak için boş bir satır yazdırın. Bir InventoryReport oluşturun ve onun da generate() metodunu çağırın.

Her iki raporun da aynı dört adımlı süreci nasıl takip ettiğine, ancak her birinin kendi özel amacı için önemli olan adımları nasıl özelleştirdiğine dikkat edin. InventoryReport, raporları farklı bir alıcıya göndermek için varsayılan teslimat yöntemini bile geçersiz kılar!

Beklenen çıktı:

Fetching sales data from database...
Analyzing data...
Formatting as bar charts and tables.
Report delivered via email.

Fetching inventory levels from warehouse...
Analyzing data...
Formatting as inventory list.
Report sent to warehouse manager.

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.

Soyut bir sınıf, bir dizi adımı çağıran bir şablon yöntemi (template method) tanımlar. Bazı adımlar soyuttur (alt sınıflar tarafından uygulanmalıdır) ve bazılarının varsayılan uygulamaları vardır:

abstract class DataProcessor {
  // Şablon yöntemi - algoritma yapısını tanımlar
  void process() {
    readData();
    processData();
    saveData();
  }

  void readData();      // Soyut - alt sınıflar uygulamalıdır
  void processData();   // Soyut - alt sınıflar uygulamalıdır

  void saveData() {     // Varsayılan uygulama
    print('Data saved to database');
  }
}

class CsvProcessor extends DataProcessor {
  @override
  void readData() => print('Reading CSV file');

  @override
  void processData() => print('Parsing CSV rows');
}

class JsonProcessor extends DataProcessor {
  @override
  void readData() => print('Reading JSON file');

  @override
  void processData() => print('Parsing JSON objects');

  @override
  void saveData() => print('Saved to cloud storage');
}

Şablon yöntemi iş akışı sırasını kontrol eder. Alt sınıflar, soyut yöntemleri uygulayarak ve isteğe bağlı olarak varsayılan uygulamaları geçersiz kılarak bireysel adımları özelleştirir. Algoritmanın yapısı tüm uygulamalarda tutarlı kalır.

Kendin dene

import 'report_generator.dart';

void main() {
  // TODO: Bir SalesReport oluşturun ve generate() metodunu çağırın

  // TODO: Ayırmak için boş bir satır yazdırın

  // TODO: Bir InventoryReport oluşturun ve 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