Menu
Coddy logo textTech

Şablon Metot Deseni

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

Şablon Yöntemi deseni, bir algoritmanın iskeletini 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 olanak tanır. Temel sınıf iş akışını kontrol ederken alt sınıflar ayrı ayrı adımları özelleştirir.

Bu kalıp kalıtımı kullanır: soyut bir sınıf, bir dizi adımı çağıran bir şablon yöntemi tanımlar; bu adımların bazıları soyuttur (alt sınıflar tarafından uygulanmalıdır), bazıları ise varsayılan uygulamalara sahiptir:

abstract class DataProcessor {
  // Şablon metot - 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();
  // CSV dosyası okunuyor
  // CSV satırları ayrıştırılıyor
  // Veri veritabanına kaydedildi

  var json = JsonProcessor();
  json.process();
  // JSON dosyası okunuyor
  // JSON nesneleri ayrıştırılıyor
  // Bulut depolamaya kaydedildi
}

process() yöntemi şablondur - işlemlerin sırasını tanımlar. Alt sınıflar readData() ve processData() yöntemlerini farklı şekilde uygular ve isteğe bağlı olarak saveData() yöntemini geçersiz kılabilir. Temel avantaj, algoritmanın yapısının tüm uygulamalarda tutarlı kalırken tek tek adımlarda esneklik sağlamasıdır.

challenge icon

Görev

Kolay

Şablon Method desenini kullanarak bir rapor oluşturma sistemi geliştirelim! Farklı rapor türlerinin aynı genel yapıyı izlediği, ancak her rapor türünün veri toplama ve çıktıyı biçimlendirme gibi belirli adımları özelleştirdiği bir çerçeve oluşturacaksınız.

Kodunuzu iki dosyaya ayıracaksınız:

  • 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 ReportGenerator adlı bir şablon metoduna sahip soyut bir generate() 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() metodu Analyzing data... yazdırmalı ve deliver() metodu varsayılan uygulamalar olarak 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ırmalı ve formatReport() metodu Formatting as bar charts and tables. yazdırmalıdır.
    • InventoryReport - fetchData() metodu Fetching inventory levels from warehouse... yazdırmalı, formatReport() metodu Formatting as inventory list. yazdırmalı ve deliver() metodunu geçersiz kılarak Report sent to warehouse manager. yazdırmalıdır.
  • main.dart: Rapor oluşturucu dosyanızı içe aktarın ve Şablon Method deseninin özelleştirmeye izin verirken algoritma yapısını nasıl tutarlı kıldığını gösterin. Bir SalesReport oluşturun ve generate() metodunu çağırın. Ardından ayırıcı olarak boş bir satır yazdırın. Bir InventoryReport oluşturun ve onun generate() metodunu da çağırın.

Her iki raporun da aynı dört adımlı süreci izlediğine, ancak her birinin kendi amacına özgü önemli adımları özelleştirdiğine dikkat edin. InventoryReport ayrıca varsayılan teslim yöntemini geçersiz kılarak raporları farklı bir alıcıya gönderir!

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.

Kendin dene

import 'report_generator.dart';

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

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

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