Murat Bıçar
MobvenLab TR
Published in
7 min readDec 3, 2021

--

DESIGN PATTERNS (TASARIM KALIPLARI)

“Design pattern nedir?” sorusu ile başlayalım. Sıkça karşılaşılan, birbirine benzeyen sorunları çözmek için geliştirilmiş ve işlerliğini kanıtlamış genel çözüm önerileridir.

Tasarım örüntülerinin temelleri Mimar Christopher Alexander’ın 1970 sonlarında başlatığı çalışmalara dayanmaktadır. Alexander 1977'de Bir Desen Dili: Şehirler, Binalar, Yapılar (İngilizce: A Pattern Language: Towns, Buildings, Construction, ISBN 0–19–501919–9), 1979'da Ebedî Yapım Yöntemi (İngilizce: A Timeless Way of Building, ISBN 0–19–502402–8) kitaplarını yayınlamıştır. Bu kitaplarda tasarım örüntülerinin üst seviyesi örüntüleri içeren mimarî desen örneklerinin yanı sıra desenlerin nasıl belgeleneceği de konu edilmiştir.

1987'deki uluslararası Nesneye Yönelik Programlama, Sistemler, Diller ve Uygulamalar (İngilizce: OOPSLA, Object Oriented Programming, Systems, Languages, and Applications) konferansına kadar desenlerle ilgili bir çalışma ortaya çıkmamış. Bu tarihten sonra ise Grady Booch, Richard Helm, Erich Gamma ve Kent Beck başta olamak üzere örüntülerle ilgili makale ve sunumlar yayınlamışlardır. 1994'te Erich Gamma, Richard Helm, Ralph Johnson ve John Vlissides tarafından yayınlanan Tasarım Örüntüleri: Tekrar kullanılabilir Nesneye Yönelik Yazılımın Temelleri (İngilizce: Design Patterns: Elements of Reusable Object-Oriented Software) tasarım örüntülerinin yazılımda kullanılmasında dönüm noktası olmuştur. Bu dörtlü ayrıca “Gang of four” olarak da bilinir. Bu dörtlü kitaplarında 3 kategoride 23 farklı kalıba yer vermişlerdir. Bunlar şu şekildedir:

  • Creational Patterns (Oluşturucu Desenler)
  1. Abstract Factory (Soyut Fabrika)
  2. Builder (Builder)
  3. Factory Method (Fabrika Metodu)
  4. Prototype (Prototip)
  5. Singleton (Tek nesne)
  • Structural Patterns (Yapısal Desenler)
  1. Adapter (Adaptör)
  2. Bridge (Köprü)
  3. Composite (Ağaç Yapısı)
  4. Decorator (Dekorasyon)
  5. Facade (Ön Yüz)
  6. Flyweight (Sinek Siklet)
  7. Proxy (Vekil)
  • Behavioral Patterns (Davranışsal Desenler)
  1. Chain of Responsibilty (Sorumluluk Zinciri)
  2. Command (Komut)
  3. Interpreter (Yorumlayıcı)
  4. Iterator (Tekrarlayıcı)
  5. Mediator (Arabulucu)
  6. Memento (Hatıra)
  7. Observer (Gözlemci)
  8. State (Durum)
  9. Strategy (Strateji)
  10. Template Method (Şablon Metodu)
  11. Visitor (Ziyaretçi)

CREATIONAL PATTERNS (OLUŞTURUCU DESENLER)

Nesnelerin (Class instance) nasıl yaratılacağı hakkında öneriler veren 5 adet tasarım kalıbıdır.

Abstract Factory (Soyut Fabrika):

İlişkisel olan birden fazla nesnenin üretimini ortak arayüz aracılığıyla tek bir sınıf üzerinden yapılacak bir talep ile gerçekleştirmek ve nesne üretim anında istemcinin üretilen nesneye olan bağımlılığını sıfıra indirmeyi hedeflemektedir.

Builder (Builder):

Projemiz inşa sürecindeyken oluşturacağımız bazı nesnelerin üretimleri oldukça maliyetli olabilir, zamanla bu nesnelerin yapısı değişebilir veya güncellenebilir. Bu tarz inşa durumlarında “Builder” ile ilgili nesneler genişletilebilir bir hale getirilmekte ve en önemlisi kod karmaşıklığı minimize edilmiş olur.

Factory Method (Fabrika Metodu):

Projemizin algoritmasında belirli adımlarda farklı tiplerde nesnelere ihtiyacınız olabilir. Bu nesnelere if-else veya switch yapıları aracılığıyla oluşturabilirsiniz. Bunu her seferinde yapmanın zaman ve kod açısından çok tasarruflu olduğu düşünülemez. Böyle durumlarda factory method paternini kullanabilirsiniz. Bir başka deyişle, elinizin altındaki birden çok ilişkisel sınıftan nesne oluşturmaktır. Bu işlemi yapmak için “abstract class” veya “interface” yapılarından yaralanılır.

Prototype (Prototip):

Elimizdeki mevcut nesnelerin prototiplerini oluşturmakta, birnevi bu nesnelerin kopyalarını elde etmekte kullanılır. Prototip desenin asıl amacı, ilgili nesne üzerinden aynı tipte başka bir nesneyi hızlıca üretmektir.

Singleton (Tek Nesne):

Bu yapıda kullanıcıya kendi başına bir nesne yaratma izni verilmez. Kullanıcı bizden nesne talep edebilir ve biz ona her defasında bellekte var olan nesneyi veririz. Böylece kullanıcı sadece tek bir nesne ile çalışmak zorunda kalır.

STRUCTURAL PATTERNS (YAPISAL PATTERN)

Adapter (Adaptör-Uyumlayıcı):

Sadece bir sınıfa özel olan arayüzleri diğer sınıfarla uyumlu arayüzler haline getiren tasarım kalıbıdır. Adaptörler uyumlu olmayan arayüzler sebebiyle birlikte çalışamayan sınıfları da birlikte çalıştırmayı sağlar.

Bridge (Köprü):

Birbirinden bağımsız olarak geliştirilebilecek iki ayrı hiyerarşiye bölmenizi sağlayan bir tasarım desenidir. Katmanlı yapı (encapsulation), toplama (aggregation) ve de kalıtımı kullanarak programın görevlerini birbirlerinden farklı sınıflara aktarırlar.

Composite (Bileşik Tasarım Kalıbı):

Kendi içlerinde birbirinden farklı olan nesnelerin sanki tek bir bütün nesneymiş gibi kullanılmasını sağlar. Görevi, nesneleri bir ağaç yapısında birleştirip uygulamanın genelindeki parça bütün ilişkisini yeniden düzenleyip şekillendirmektedir.

Decorator (Dekorasyon):

Uygulamada runtime esnasında bir sınıfın işlevlenebilirliğinin genişletilmesini veya başka bir deyişle yeniden dekore edilmesini mümkün kılar.(yeni sorumluluk eklenmesi veya çıkarılması) Bunu yaparken decorator kalıpları orjinal sınıfları kapsayan yeni decorator sınıfları üreterek yaparlar.

Facade (Vitrin):

Var olan bir sistemi farklı açıdan ele alıp kullanılmasını kolaylaştırmak veya arayüzler kullanarak yüksek seviyedeki bir işi daha basit şekilde yapmak için kullanılır. Bu tasarım desenine göre programlama içerisinde sık kullandığımız işler için yüksek seviyeli bir arayüz tanımlayarak, sistemin daha kolay kullanılması sağlanır. Sınıf kütüphaneleri (class library) en iyi örnekleridir.

Flyweight (Sinek Siklet):

Amacı yapıca aynı nesneleri bellekte çokça oluşturmak yerine her bir nesnenin bir kopyasını oluşturmak ve oluşturulan nesneleri ortak bir noktada tutup paylaştırma işlemini yerine getirmektir. Yani tekrar eden aynı nesneleri gruplayarak hafızada çok fazla yer kaplamaması için, hafıza kullanımını minimum indirmektir. Bu tasarım kalıbında değerleri farklı olacak olan özelliklere extrinsic, aynı olacak olan özelliklere ise intrinsic denir.

Proxy (Vekil):

Var olan bir nesneye ulaşılmak istendiğinde vekil kalıp oluşturulur. Nesneyle istemci arasına yeni bir katman koyarak nesnenin kontrollü bir şekilde paylaşılması sağlanır. Böylece istemci, işlem yapan sınıfla doğrudan temasa geçmemiş olur. Bu durum sayesinde işlemin yapılma performansında bir düşüklük olmaması sağlanır.

BEHAVIORAL PATTERNS (DAVRANIŞSAL DESENLER)

Belirli görevlerin bu işleri yapmak üzere tasarlanmış nesnelere gönderilmesi ve geri dönen sonuçların işlenmesi davranışsal tasarım kalıpları içerisinde yapılan bir işlemdir.

Chain of Responsibilty (Sorumluluk Zinciri):

Sisteme gönderilen bir komutun hangi nesne tarafından cevaplanması gerektiğinin bilinmediği durumlarda ya da isteği yapan nesne ve servis sağlayan nesne arasında sıkı bir bağ oluşmasının engellenmesi gerektiği zamanlarda kullanılır. Bu tasarım kalıbında servis sağlayan ilgili tüm nesneler birbiriyle ilişkili hale getirilir. Bir nesne, zincirde kendinden sonra gelen nesneyi tanır ve isteğe cevap veremediği durumda, kendinden sonraki nesneye iletir. Bu işlem, zincirde bulunan doğru servis sağlayıcıyı bulana kadar devam eder.

Command (Komut):

Bir nesne üzerinde bulunan işlemlerin yapılmasındaki süreci bilmediğimizde ya da kullanılmak istenen nesnenin tanınmadığı durumlarda, yapılmak istenen işlem bir nesneye dönüştürülerek, alıcı nesne tarafından işlemin yerine getirilmesi amaçlanmaktadır. Çözümlerin nesneler halinde saklanmasının getirisi olarak da komut tasarım kalıbı aynı kod yapısının tekrar tekrar kullanılabilmesine olanak sağlar.

Interpreter (Yorumlayıcı):

Sıklıkla karşılaşılan belli mantıksal kalıpların bir bütün içerisinde yer almasını sağlamak amacıyla kullanılmaktadır. Dil bilgisi kuralları gibi kalıplar içerisinde yer alan ifadelerin yorumlanması amacıyla kullanılması tercih edilmektedir.

Iterator (Tekrarlayıcı):

Bir listenin yapısının ve çalışma tarzının uygulamanın diğer kısımları ile olan bağlantılarını en aza indirmek için; listede yer alan nesnelerin, sırasıyla uygulamadan soyutlanması amacıyla kullanılır.

Mediator (Arabulucu):

Genel olarak nesnelerin yönetimi, aralarındaki iletişimin merkezi bir noktadan sağlanması ve yönetilmesi için kullanılır. Bu nesneler arasındaki bağı azaltmakta ve sadece bir sınıfı, yönetici sınıf olarak diğer sınıfların koordine edilmesinden sorumlu kılar.

Memento (Hatıra):

Bir nesnenin, daha önce sahip olduğu durumlardan birine tekrar dönüştürülebilmesi için hatıra tasarım kalıbı kullanılır. Bu sayede belirli durumlardan sonra nesnelerin aldıkları çeşitli durumların kolaylıkla değiştirilebilmesi ve bu durumların farklı sınıflarda tanımlanarak kullanılabilirliğinin arttırılması amaçlanmaktadır.

Observer (Gözlemci):

Uygulama içerisinde bir nesnede meydana gelen değişikliklerden haberdar olup üzerinde belli metotları çalıştırıp değişlikler yapmak isteyen diğer nesneler bulunabilmektedir. Bu durumda haberdar olmak isteyen nesneler diğer nesne ile ilişkilendirilerek, ilişkili oldukları nesnede meydana gelen değişikliklerden haberdar edilebilmektedirler. İlişki içerisinde olan nesne ile bağlantı iptal edilerek, ilişkili olduğu nesne ile arasındaki bağ sonlandırılabilir.

State (Durum):

Bir nesnenin durumu değiştiğinde, davranışı da değişirse, diğer bir ifadeyle nesneler farklı durumlarda farklı davranışlar gösterirse, durum tasarım kalıbı kullanılabilir. Kullanıcı açısından, nesne sınıfını değiştiriyormuş izlenimi verir. Uygulamanın gerektirdiği doğrultuda yeni davranışlar eklenip çıkarılmasına olanak sağlar.

Strategy (Strateji):

Bir projede farklı şartlara bağlı olarak birden fazla sınıf ve metot yazılıp kullanılabilir. Bunu strategy deseni sağlar.

Template Method (Şablon Metodu):

Şablon kalıbı ile bir algoritma için gerekli işlemler soyut olarak tanımlanır. Alt sınıflar algoritma için gerekli bir yada birden fazla işlemi kendi bünyelerinde gerçekleştirerek, kullanılan algoritmanın kendi istekleri doğrultusunda çalışmasını sağlayabilmektedirler.

Visitor (Ziyaretçi):

Ziyaretçi tasarım kalıbı, bir sınıf hiyerarşisinde yer alan sınıflar üzerinde değişiklik yapmadan, bu sınıflara yeni metotların eklenmesini kolaylaştırır. İstenilen metot bir ziyaretçi sınıfında tanımlanabilir. Burada bahsedilen kalıp programcı tarafından farkında olmadan sıklıkla kullanılmaktadır. C# 3.0 ile gelen partial(bölümsel) sınıfların tanımlanabilmesi bu kalıbın gelişmesini sağlamıştır.

--

--