Template Method Tasarım Deseni

Capture

Bu yazımda template method tasarım desenini anlatmaya çalışacağım.Aşağıda bununla ilgili güzel bir örnek de bulacaksınız.

Madde madde anlatalım ;

  • Davranışsal tasarım deseni grubuna girer ve %60 kullanım oranına sahiptir.
  • Bir işlemi gerçekleştirmek için gerekli alt adımları net olarak bilinen (algoritmik akışı olan) ve bu alt adımları temel sınıfta soyut olarak tanımlayarak algoritmanın nasıl işleyeceğini template method belirler.
  • Template method tasarım deseni ; algoritma adımlarını soyut bir sınıfa(abstract) tanımlayarak asıl sınıflar(concrete) tarafından ezilip(override) çalıştırılmasını düzenler.
  • Template method tasarım deseni , bir algoritmanın (algoritma iskeletinin) bir den fazla biçimde veya içerikle çalışmasını sağlar.
  • Eğer algoritma iskeletinde bir değişiklik yapılacaksa bu tek bir yerden yapılır ve böylece kod tekrarı önlenmiş olur.

Desenin UML şeması ;

Template_method_pattern_class_diagram

Template tasarım deseni için gerçek dünya senaryoları ;

Örnek senaryo ; 

Şirketler için gerekli olan bir çok raporlama şekli ve rapor vardır.Bu raporlarlar bir araç aracılığıyla rapor kaynağını okuyarak excel, word, pdf, txt gibi çıktıları üretir ve önceden tanımlanmış dizinlere belirli aralıklarla(günlük,haftalık,aylık) atar.Bu yazı için kodlayacağımız senaryo da bu rapor üretimi ile ilgilidir.

Örnek senaryomuz (rapor oluşturma adımları) için algoritmik akış adımları ;

  • GetReportDefinitions : rapor için konfigure edilmiş ayarlar alınır.örn; raporun dosya tipi,çıktı dizini,rapor kodu gibi
  • RunReportJob : rapor verisini oluşturacak iş çalıştırılır.
  • ValidateReport :  rapor yer alan içerik tiplerinin valide olup olmadığının kontrolü yapılır
  • CreateReportFile : rapor kaynağına göre fiziksel dosya oluşturulur.
  • ExtractReportFile : dosya belirtilen dizine atılır.

Kod parçası ; 

  • Raporların üretimi için bir (baseprocessor) temel işlemci sınıfı tasarlıyacağız.Bu sınıf her rapor için aynı olan işlemleri, loglama yapısınını ve olay mekanizmasını içeriyor.Her rapor işlemcisi bu temel işlemci sınfını (baseprocessor) kalıtmak zorundadır.
  • Burada konumuzla alakalı olmamasına rağmen (event) olay mekanizması ekledim ve bunun faydalı olacağını düşünüyorum.
  • Burada primitive method lar List olarak bir liste halinde türeyen sınıfdan alınır ve baseprocessor bunu teker teker çalıştırır.Böylece daha dinamik bir template method kullanımı elde etmiş oluyoruz.Eğer istenirse raporların oluşumu için gerekli methodlar belli olduğundan List tipinde tanımlanmayıp doğrudan istenilen method lar (GetReportDefinitions,RunReportJob,ValidateReport,CreateReportFile) eklenebilir ve algoritmik sırasıyla çalıştırılabilirdi.
  • List olarak tanımlanan primitive methodlar SortedList olarak tanımlanarak ve sıralı bir şeklide çalıştırılılması daha mantıklı olur.
  • Burada önemli olan baseprocessor sınıfında bulunan Processor ve SubProcessor sınıfıdır.Aslında bu iki methodu tek method olarak da kabul edebiliriz.Uzun içeriğe sahip bir method olmaması için ikiye bölerek işlemleri gerçekleştirdim.Processor methodu Template Methottur.Bu method içerisinde türemiş sınıfta(reportprocessor) verilen primitive methodlar çalıştırılır.BaseProcessor sınıfı Abstract sınıf ve reportProcessor sınıfı Concrete sınıftır.

Yardımcı tipler

Eventler için EventArg, processor sınıfının durumunu belirtmek için kullanacağımız ProcessorStatus sınıfı ve baseprocessor sınıfı için bir interface yer alıyor.

BaseProcessor sınıfı ;

ReportProcessor sınıfı ;

Kullanımı; burada genel kullanımı gözlemlemek için doğrudan reportprocessor sınıfı yazdım aslında şu şeklide de yapılabilirdi.Her rapor için bir reportProcessor sınıfı yazıp gerekli methodları set edip istenilen istenilen rapor ilgili rapor işlemcisi aracılığıyla çalıştırılarak oluşturulabilir.

Sınıf diagramı ; örnek senaryomuzun kodlarını yazdık ve incelediysek şimdi sınıf diagramı üzerinde de görelim.

Capture_template_method

Yukarıda da bahsettiğim bu örnek uygulamanın desenin kullanımını daha net görebilmeniz için ikinci bir versiyon olarak kodlama yaptım.Burada çok daha net olarak template method tasarım deseninin kullanımını göreceksiniz.Örneğin ikinci versiyonunda algoritmik akış methodları doğrudan baseprocessor sınıfına yazıldı.

Örnek kodlamahttps://gist.github.com/yemrekeskin/8282604

Kodlamanın ikinci versiyonuhttps://gist.github.com/yemrekeskin/8299220

Diğer örnek kodlama için sınıf digaramını aşağıda görebilirsiniz.

Capture_v2_template_method

İlgili linkler

Bu yazımdan da bu kadar umarım yararlı olmuştur.

Leave a Reply

Your email address will not be published. Required fields are marked *