Template Method Design Pattern Nedir ?

Veysel Mutlu
6 min readApr 7, 2023

--

Şekil 1. UML Diyagramı

Merhabalar,

Bu blog yazımda Davranışsal Tasarım Desenleri (Behavioral Design Pattern) grubunda yer alan Şablon Metot Tasarım Deseni (Template Method Design Pattern) hakkında bildiğim/öğrendiğim teknik bilgileri bir uygulama üzerine dökerek sizlerle paylaşmak istiyorum. Blog yazımı yukarıda baglantısını paylaşmış olduğum blog sitesinden de okuyabilirsiniz .

Blog yazıma konu olan tasarım desenine başlamadan önce kısaca tasarım deseni/desenleri nedir konusuna değinmekte fayda var.

Tasarım Desenleri/Kalıpları (Design Patterns) Nedir?

Tasarım Kalıpları (Design patterns);

  • Yazılım geliştirmede yaygın olarak karşılaşılan zorluklar için yeniden kullanılabilir nesne yönelimli yazılımlardır.
  • Yazılım tasarımında, problemlerde karşımıza sıkça çıkan ortak sorunları çözmek için oluşturulmuş desenlerdir.
  • Yazılım sürecinde uygulanan çözümlerin esnekliği ve tekrar kullanılabilirliği ile de ilgilenmektedir.

Yani, biz yazılım geliştiricilerin zaman içerisinde deneme/yanılma, iyi/kötü tecrübelerinin sonucunda ortaya çıkmış yazılım geliştirme teknikleridir.

Her desen, çevremizde tekrar tekrar ortaya çıkan bir sorunu açıklar ve daha sonra bu soruna çözümün uygulanmasını, bu çözümü iki kez aynı şekilde yapmadan milyonlarca kez kullanabileceğiniz şekilde tanımlar.

— Christopher Alexander

Yapılarına göre tasarım kalıpları/desenleri 3 tür kategori altında tutulur;

1. Yaratımsal Desenler (Creational Patterns)

Bu kategoriye giren tasarım desenleri (design patternler) tamamen nesne yaratmanın farklı yollarıyla ilgilidir. Yeni objelerin yaratılması gibi.

2. Yapısal Desenler (Structural Patterns)

Oluşturulan yeni objelerin bir araya gelerek birbirleri arasında kompleks bir yapı oluşturmasıyla ilgili tasarım desenleridir.

3. Davranışsal Desenleri (Behavioral Patterns)

Objelerin birbiriyle mesajlaşmasını, birbirinden haber almasını sağlayan yapılardır.

Şekil 2. GoF Design Patterns

Şablon Metot Tasarım Deseni (Template Method Design Pattern) Nedir?

Şablon Metot Tasarım Deseni (Template Method Tasarım Deseni) bir işlem için gerekli adımları soyut olarak tanımlamamıza ve bir Şablon (Template) metot ile algoritmanın nasıl çalışacağını belirlememize yardımcı olur. Alt sınıflar algoritma için gerekli bir ya da birden fazla metodu kendi bünyelerinde gerçekleyerek kullanılan algoritmanın kendi istekleri doğrultusunda çalışmasını sağlarlar.

Özetle;

Şablon (Template) Metot;

  • Bir dizi komutun çalıştırıldığı veya içinde başka metotların çağrıldığı bir programatik yapıdır.
  • Metotlar genelde farklı metotları çağırarak işlem yaparlar. Dolayısıyla kendisinin yaptığı iş çağırdığı metotların yaptığı işlerin bir sonucudur.
  • Bu desen, bir metodun kendi içinde çağırdığı bazı metotların soyut olmaları yoluyla işletilir.
  • Alt (Concrete) sınıflar tarafından soyut metotlar için yapılacak farklı implementasyonlar çağırılan metodun yaptığı işin farklılaşmasını sağlar.

Şablon Metot Tasarım Deseni (Template Method Design Pattern) Kullanımı

  • Şablon (Template) metotlar soyut bir taban sınıf içinde kodlanır.
  • Kendisi soyut değildir.
  • Çağırdığı bazı metotlar soyuttur ve bunlar primitif metot olarak anılır.
  • Bu primitif metotlar alt sınıflar tarafından farklı şekillerde implemente edilerek template metodun çalışma biçiminin değişmesi sağlanır.

Yani amaç, bir iş için iskelet, şablon bir algoritma ya da akış belirleyip bu process’i uygulayacak tüm sınıflara bunu uygulatmak. Bir örnek ile teorik bilgileri uygulamaya dökelim. Örneğimizde biz yazılımcıların uygulamalarımızda her zaman yapmış olduğumuz validasyon işlemlerini ele alıp bu tasarım desenini bir validasyon örneği üzerinden koda döküyor olalım. Bu örnekte, bu tasarım desenini kullanmak gerekir mi? Bize avantajı ne olacak? gibi sorularınıza yanıt vermeye çalışalım.

Öncelikle elimizde hazır bir proje olması ya da yeni bir proje oluşturmamız gerekmektedir. Ben örneğimi .Net Core 5.0 üzerinde açmış olduğum bir web api projesi üzerinde uyguluyor olacağım. Sizlerde platform ve dil bağımsız (OOP destekli) bir programlama dili üzerinde aynı örneği validasyon işlemleri için uygulayabilirsiniz.

Örneğimizde bir ürün ekleme işlemi yaparken yapılan bazı model doğrulama (validasyon) işlemlerini yapıyor olacağız. Onun için örnek bir proje oluşturup içerisine ihtiyacımız olacak örnek bir sınıf oluşturalım. (Product isminde)

Web API projemizdeki AddProduct isimli api uç noktamıza (endpointimize) gelen product entitysindeki (ürünü) zorunlu alan ve business süreçleri kontrol ettikten sonra ürün listeme request olarak gönderilen ürünü ekleyecek, ekleme sırasında herhangi bir doğrulamaya takılırsa ekleme işlemini yapmadan kullanıcımıza hata/uyarı mesajı dönecektir. Öncelikle bu design pattern’i uygulamadan önce metodumun içeriği basitçe nasıl olurdu ona bakalım.

Şekil 3. Örnek Validasyon İşlemi

Yukarıdaki görselde (bkz. Şekil 3) görüldüğü üzere AddProduct metodumuzun amacı ürün listeme gelen ürünü eklemek. Fakat sadece ürün eklemiyor aynı zamanda bazı business kontroller ve doğrulamalar yapıyor. Şimdi burada yazdığımız metodun hem S.O.L.I.D (yazılım geliştirirken sürdürülebilir kod yazmamızı sağlayan bir prensipler bütünü) prensiplerinden S (Single Responsibility Principle (SRP)) ilkesini ihlal etmekte hem de metodun okunurluğunu ve sürdürülebilirliğini düşürmektedir. Bunu hem S.O.L.I.D prensiplerine uygun hem de konumuz olan Şablon Metot Tasarım Desenine (Template Method Design Pattern) nasıl uygulayabiliriz gelin kodlayalım. Şablon Metot Tasarım Desenini kodumuza uygularken UML diyagramını dikkate alarak başlıyoruz. Onun için soyut bir Validator sınıf oluşturup içerisinde bulundurmamız gereken alanları tanımlıyoruz. Bu validator sınıfımız base sınıfımız olacağı için Abstract tanımlıyor ve içerisinde bu sınıfı kullanacak olan sınıflarımızın ihtiyaçlarına göre override ederek kullanabilecekleri bir model doğrulama metodu bırakıyor olacağız. Validator adında base sınıf oluşturdum ben, fakat siz isterseniz interface tanımı da yapabilirsiniz.

Şekil 4. Soyut (Abstract) Validator Sınıfı

Yukarıdaki görselde (bkz. Şekil 4) yer alan Validator adlı sınıfımız UML diyagramındaki Abstract yapımızı modelleyecek, metot iskeletimizi ve soyutlanmış diğer metotları içerecektir. Yani projemizde model doğrulaması yapmak istediğimiz modeller için ayrı sınıflar(Concrete) oluşturup bu base sınıfımızdan implemente ederek OnValid metodunu ezerek içerisinde iş ihtiyaçlarımıza uygun business iş kurallarını ve model doğrulamalarımızı kodlayacağız. OnValid isimli metodumuz UML diyagramındaki primitive operation metodlarımızı modelleyecektir.

Şekil 5. ProductValidator Alt (Concrete) Sınıfı

Yukarıdaki (bkz. Şekil 5) örneğe bakıldığında bir ürün eklemek için oluşturulan product sınıfı için ProductValidator adlı yeni bir Alt (Concrete) sınıf oluşturularak bir önceki adımda yazılmış olunan validator sınıfından implement ediliyor ve OnValid isimli metodunu bu sınıfta ezerek (override) ederek business ihtiyaçlara uygun model doğrulamaları ve business kuralları burada tanımlanıyor. Metodun içerisine bakıldığında ürün eklemek için gerekli olan alanların doğru ve uygun olması kontrol ediliyor uygun olmaması durumunda IsSuccess isimli değişken false durumuna çekilerek hata/uyarı mesajını dönmüş olunuyor. Bu sınıflardan yeni bir sınıf örneği (instance) oluşturulduğunda model doğrulaması yapmak istenilen ilgili sınıfı vermek ve iş süreçlerimizde ihtiyaç olan iş kurallarını bu sınıf içinde tanımlayarak OnValid metodu içerisinde yazmak yeterli olacaktır. Evet, artık Şablon Metot Tasarım Desenimizi (Template Method Design Pattern) uyguladığımız bir model doğrulama şablon alt yapısı/iskeleti oluşturduk. Hadi gelin bunu nasıl kullanacağımıza bakalım.

Ürün eklemek için kullandığımız AddProduct endpointimize gidip ProductValidator sınıfımızı çağırmamız ve gelen istekteki contract nesnemizi bu sınıfa vermemiz yeterli olacaktır.

Şekil 6. Şablon Metot Tasarım Deseninin Validasyon İşlemlerinde Kullanım Örneği

Yukarıda (bkz. Şekil 6) görmüş olduğunuz gibi ilgili metotta, yazmış olduğumuz validasyon sınıfımızı çağırmış, ihtiyacı olan modelimizi vermiş ve doğrulama işlemini yaptırmış olduk. Artık ilgili metodumuz hem SOLID prensiplerine uygun, sürdürülebilir hem de daha temiz bir kod haline geldi. İlgili metodumu test edebilmek için api projemi local ortamımda ayağa kaldırıp postman aracı ile ilgili endpointe istek atalım ve sonucu görelim.

Şekil 7. Şablon Metot Tasarım Deseninin ve Validasyon İşlemlerinin Test Edilmesi

Yukarıda (bkz. Şekil 7) görmüş olduğunuz gibi ilgili metodumuzu test etmek için postman aracı ile istekte bulunduk ve validasyon kontrollerine takıldık. Böylelikle validasyon kontrollerimizi hem ayrı bir sınıfa taşımış hem de yazılım sektöründe adını sık sık duymuş olduğumuz tasarım desenini projemizde ihtiyacımıza göre uygulamış olduk.

Sizlerde projelerinizde, yazılım sektöründe %25.15 oranında kullanım yüzdesine sahip Şablon Metot Tasarım Desenini (Template Method Design Pattern) kullanarak daha sade, temiz ve okunaklı model doğrulama sınıfları yazabilirsiniz. İlgili konuyu ben kendi senaryomda bu şekilde gerçekledim. Sizler farklı projelerde, farklı senaryolarda ve farklı iş süreçlerinizde ihtiyaçlarınıza göre özelleştirerek kullanabilirsiniz. Yeni bir makalede görüşmek üzere hoşçakalın.

Uygulamanın örnek kodlarını bu linkten indirebilirsiniz.

Referanslar

  1. Alexander Shvets. “What’s a design pattern?”. Erişim: 15 Mart 2023. https://refactoring.guru/design-patterns/template-method
  2. Dofactory Development Team. “What are Design Patterns?”. Erişim: 15 Mart 2023. https://dofactory.com/net/template-method-design-pattern
  3. Saket Kumar.. “Template Method Design Pattern”. Erişim: 15 Mart 2023. https://www.geeksforgeeks.org/template-method-design-pattern/
  4. Yusuf Yılmaz. “Tasarım Desenleri Türkçe Kaynak”. Erişim: 15 Mart 2023. https://github.com/yusufyilmazfr/tasarim-desenleri-turkce-kaynak#-template-method
  5. Taşdelen, Aykut (2014), UML ve Dizayn Paternleri, Pusula Yayıncılık, 590(4) Aykut Taşdelen — UML ve Dizayn Paternleri Kitabı
  6. Anonim. “Gang of Four (GoF)”. Erişim: 15 Mart 2023. https://subscription.packtpub.com/book/application-development/9781782173656/1/ch01lvl1sec16/gang-of-four-gof

--

--