Ş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.
Görev
KolayTemplate 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ımlayangenerate()adlı bir template method'a sahip soyut birReportGeneratorsınıfı oluşturun:fetchData(),analyzeData(),formatReport()vedeliver().fetchData()veformatReport()metotları soyut olmalıdır (her rapor türü bunları farklı şekilde ele alır),analyzeData()ise varsayılan uygulama olarakAnalyzing data...vedeliver()iseReport delivered via email.yazdırmalıdır. Ardından iki somut rapor sınıfı oluşturun:SalesReport-fetchData()metoduFetching sales data from database...yazdırır veformatReport()metoduFormatting as bar charts and tables.yazdırır.InventoryReport-fetchData()metoduFetching inventory levels from warehouse...yazdırır,formatReport()metoduFormatting as inventory list.yazdırır vedeliver()metodunuReport 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. BirSalesReportoluşturun vegenerate()metodunu çağırın. Ardından ayırmak için boş bir satır yazdırın. BirInventoryReportoluşturun ve onun dagenerate()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
}
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 DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarı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ıRepository Kalıbı