Specification Pattern Nedir?

Abdullah Öztürk
3 min readSep 8, 2022

--

Herkese Merhaba,

Bugün specification tasarım deseninin ne olduğunu ve hangi durumlarda kullanılacağı, bizi nasıl bir yükten kurtaracağını ve son olarak nasıl implemente edileceğinden bahsedeceğim.

Orjinal makale https://abdullahozturk.net adresinde yayınlanmıştır.

Domain Driven Design tarafındaki makalelere bakarsak hepsinin ortak bir anlattığı konu, karışık iş süreçlerini ortak bir dil (ubiqutious language) aracılığıyla çözüme kavuşturmak. Bu süreçte yazılımcıların daha kolay bir şekilde geliştirme yapmasını sağlayan desendir Specification.

Specification: Belirli bir domain kuralını tek bir birim -specification- olarak soyutlayıp farklı senaryolar için kullanmamıza ve farklı domain kuralları ile birleştirebilmemize olanak sağlayan bir yapı.

Örnek üzerinden gidelim ve neden ihtiyaç duyacağımızı anlayalım.

Bir proje yönetim sistemi üzerinde çalıştığınızda hizmet sağladığınız departman sizden inaktif durumdaki task listesini isteyebilir.

Task modeli aşağıdaki gibi property’lere sahip olsun.

Genelde bu gibi bir işlemi, IsInActive metotu ile basitçe çözebiliriz.

Bu noktaya kadar her şey güzel.

Daha sonra farklı bir noktada ise taskların, aktif olup olmadıklarını ve aktif ise son yorum tarihinin 1 haftadan önce olanları kontrol etme ihtiyacımızın olduğunu düşünelim. Bu işlemi de aşağıdaki gibi çözebiliriz.

Bu örnekte olduğu gibi birçok kez domain kuralını sürekli farklı yerlerde kullanmak zorunda kalacağız ve DRY prensibini uygulayamamış olacağız. İşte bu noktada Specification Pattern yardımıyla tüm domain kurallarımızı tek bir yerden tekrar kullanabilir hale getirebileceğiz. Ayrıca bu domain kurallarını birleştirip farklı bir domain kuralı da oluşturabileceğiz.

Bu sayede daha merkezi bir yapı oluşturarak daha az kod ile daha çok iş yapabileceğiz. Ayrıca ekibe yeni gelen birisinin de alışması bir o kadar kolay olacaktır.

Kodlama Vakti

Öncelikle ISpecification adlı bir interface üretelim.

Tüm specification sınıfları için genel bir interface oluşturduk. Şimdi base specification sınıfı oluşturma vakti.

Türetilen sınıf ve interface hakkında:

  • IsSatisfiedBy metotu iş kuralının nesnelere uygulanmasının uygun olup olmadığının kontrolünü yapar.
  • And, Or ve Not metotları birden fazla domain kuralının zincirleme olarak bir arada gerektiği senaryolarda kullanılır.
  • Specification Pattern sadece bu 3 operatörle kısıtlı değildir. Ayrıca AndNot, OrNot, AndOr gibi operatörler de bulunmaktadır.(And ile Or birlikte kullanıldığında AndOr specification oluşturulması gibi…)

Base sınıfımızı da oluşturduğumuza göre artık bu specification sınıflarından nasıl specification oluşturabileceğinizi göstermek istiyorum.

Öncelikle Task modelimizin aktif olup olmadığını kontrol eden specification sınıfını oluşturalım.

Kullanıcıya ait taskları getirmemizi sağlayan specification da oluşturalım.

Bir Task nesnesinin aktif olup olmadığını kontrol eden bir spesifikasyon ve bir kullanıcıya assign edilen taskları getiren bir spesifikasyonumuz var. Gelin bu ikisini birleştirerek kullanıcıya assign edilen aktif taskları bulalım.

Elimizdeki bu specification sınıfını kullanmadan önce modelimizi yeni haliyle güncelleyelim.

Gördüğünüz gibi specification kullanarak DRY prensibini çiğnemeyerek daha merkezi bir yapı oluşturmuş olduk. Şimdi ise elimizde Task türünden bir liste olsun ve bunun üzerinde işlem yapalım.

Dummy bir liste oluşturdum ve bunun üzerinden işlem yapacağız. IIS Express üzerinden ayağa kaldırdıktan sonra swagger üzerinden istek yapıyorum ve response modelimiz aşağıdaki şekilde dönüyor.

Specification’a uygun bir response modeli

Bu yazımda specification nedir, tam olarak ne işe yarar ve zincirleme specification implementasyonu gibi konuları anlatmaya çalıştım.

Okuduğunuz için teşekkür ederim. Bir sonraki yazıda görüşmek dileğiyle.

--

--