Tasarım Desenleri - Design Patterns

Yazılım Geliştirmede Temel Kavramlar ve Yaklaşımlar

Kaan Cömert tarafından 28 Ağustos, 2023'de yazıldı
Design Patterns Tasarım Desenleri

Tasarım Desenleri nedir?

Tasarım Desenleri (veya tasarım kalıpları olarak da adlandırılırlar), yazılım geliştirme sürecinde sıkça karşılaşılan problemler için oluşturulmuş çözümlerdir.

Kodunuz içinde sıklıkla rastladığınız sorunları özelleştirilmiş bir şekilde çözmek için kullanabileceğiniz, önceden hazırlanmış planlar olarak düşünebilirsiniz.

Tasarım kalıpları, bir fonksiyon veya sınıf gibi hazır parçalar değil, genel konseptlerdir ve problemleri çözmek için kullanılan genel yaklaşımları ifade ederler.Bu desenler, nesnelerin doğru şekilde oluşturulmasını, başlatılmasını ve yönetilmesini sağlamak için çeşitli yöntemler ve yaklaşımlar sunar. Temel amacı, nesne oluşturma işlemini soyutlamak ve nesnelerin bağımlılıklarını azaltmak veya yeniden kullanılabilirliği artırmaktır.

Tasarım desenleri genellikle üç ana kategori altında incelenir:

Yaratımsal Tasarım Kalıpları (Creational Patterns)

Yaratımsal tasarım kalıpları, yazılım nesnelerinin nasıl yaratılacağı hakkında genel olarak öneriler sunarak kullandığı esnek yapı sayesinde daha önceden belirlenen durumlara bağlı olarak gerekli nesneleri yaratır.

Yaratımsal kalıplar, uygulamanın çalışma süreci içerisinde oluşturulması gereken nesneler ve bu nesnelerin belli yapılar dahilinde oluşturulmasını öngören beş farklı şablondan (desen) oluşur.

    • Fabrika Metodu (Factory Method)
    • Soyut Fabrika Metodu (Abstract Factory Pattern)
    • Tekil Kalıp (Singleton Design Pattern)
    • Yapıcı Kalıp (Builder Design Pattern)
    • İlk örnek Kalıp - Örnek (Prototype Design Pattern)
  • Soyut Fabrika (Abstract Factory)
  • Üretimle ilgili tasarımlarda önem kazanmaktadır. Fabrika ve ürün grubu gibi ilişkiler bir kez tanımlanır. Bu tasarımda önemli olan yapısal olarak birbirine benzeyen ürünlerin ortak bir ara katman üzerinden yönetilebilmesini sağlamaktır. Bu şekilde kurulan yapı daha kolay ve esnek olur. Tek ara yüz kullanarak bir nesne ailesinin farklı platformlarda yaratılmasına olanak sağlar. Diğer bir deyişle, uygulama davranış değişikliğine uğramadan farklı platformlara taşınabilir.

  • Fabrika Yöntemi (Factory Method)
  • Nesnenin nasıl yaratılacağını kalıtım yoluyla alt sınıflara bırakıp nesne yaratımı için tek ara yüz kullanarak, ara yüzle nesne yaratım işlevlerini temelde birbirinden ayırmaya yarayan yaratımsal tasarım kalıbıdır.

  • Yapıcı (Builder)
  • Tek ara yüz kullanarak karmaşık bir nesne grubundan gerektiğince parça yaratılmasını sağlar. Nesne grubu kullanıldıkça istenilen şekilde yapılanır ve bu sayede kullanılmayan parçaların gereksiz yere yaratılarak kaynak harcama durumu ortadan kaldırılmış olur.

  • Örnek (Prototype)
  • Kendi üzerinden yaratılacak nesneler için prototip görevi üstlenen bir yapı sunmaktadır. Diğer bir deyişle, sınıflardan nesne yaratırken yeni nesnelerin baştan yaratılmayıp, mevcutlarını örnek kabul ederek yaratılmasını sağlar. Bu desen sayesinde nesneler, kaynaklar gereksiz yere meşgul edilmeden yaratılırlar.

  • Tekil Kalıp (Singleton)
  • Nesnenin sadece bir defa oluşturulmasını öngören bir mekanizma kurulmak istenildiğinde etkin bir biçimde kullanılabilen bir tasarım desenidir. Oluşturulan bir sınıftan sadece bir nesne yaratılacak şekilde bir kısıtlama yapabilme olanağı sağlar ve nesneye ilk kez ihtiyaç duyulana kadar yaratılmayabilir.

Yapısal Desenler (Structural Patterns)

Yazılım tasarımında ve nesne tabanlı programlamada kullanılan, farklı sınıf ve nesnelerin bir araya getirilmesiyle daha büyük ve karmaşık yapılar oluşturmayı amaçlayan tasarım desenleridir. Bu desenler, varolan sınıf ve nesneleri yeniden düzenleyerek daha esnek, ölçeklenebilir ve sürdürülebilir bir yazılım tasarımı oluşturmada yardımcı olurlar.

Bazı yaygın yapısal desen örnekleri şunlardır:

    • Adaptör Kalıp (Adapter Pattern)
    • Köprü Kalıp (Bridge Pattern)
    • Bileşik Kalıp (Composite Pattern)
    • Dekoratör Kalıp (Decorator Pattern)
    • Vitrin Kalıp (Facade Pattern)
    • Sinek siklet Kalıp (Flyweight Pattern)
    • Vekil Kalıp (Proxy Pattern)
  • Adapter
  • Farklı arayüzleri olan sınıfları birbirine uyarlamanızı sağlar. İki farklı arayüz arasında bir geçiş sağlar.

  • Bridge
  • Soyutlamayı uygulamanın gerçek uygulamasını ayırmanıza yardımcı olur. Bu sayede her iki yönü de bağımsız olarak geliştirebilirsiniz.

  • Composite
  • Nesneleri ağaç benzeri yapılarla gruplayarak birleştirmenizi sağlar. Bu gruplar hem tek bir nesne gibi davranabilir hem de içerdikleri nesnelerin toplamını temsil edebilir.

  • Decorator
  • Nesneleri dinamik olarak genişletmenizi sağlar. Yani nesneleri farklı özelliklerle süsleyebilirsiniz.

  • Facade
  • Karmaşık bir alt sistemi basit ve tek bir arabirim aracılığıyla kullanılabilir hale getirir.

  • Flyweight
  • Nesne örneklerini paylaşarak bellek kullanımını minimize eder. Böylece çok sayıda benzer nesne oluşturulabilir.

  • Proxy
  • Başka bir nesneye erişimi kontrol etmenizi sağlar. Gerçek nesnenin yerine geçebilen bir vekil nesne kullanır.

Davranışsal Desenler (Behavioral Patterns)

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.

Bazı yaygın yapısal desen örnekleri şunlardır:

    • Komut Kalıbı (Command Pattern)
    • Hatıra Kalıbı (Memory Pattern)
    • Strateji Kalıbı (Strategy Pattern)
    • Tekrarlayıcı Kalıbı (Iterator Pattern)
    • Durum Kalıbı (State Pattern)
    • Sorumluluk Zinciri Kalıbı (Chain of responsibility Pattern)
    • Aracı Kalıbı (Mediator Pattern)
    • Gözlemci Kalıbı (Observer Pattern)
    • Şablon Kalıbı (Template Pattern)
    • Ziyaretçi Kalıbı (Visitor Pattern)
    • Yorumlayıcı Kalıbı (Interpreter Pattern)
  • Command Pattern
  • Bir nesne üzerindeki işlemlerin yapılmasındaki süreci bilmediğimizde ya da kullanılmak istenen nesnenin tanınmadığı durumlarda, komut tasarım kalıbı ile yapılmak istenen işlem bir nesneye dönüştürülerek, alıcı nesne tarafından işlemin yerine getirilmesi amaçlanmaktadır.

  • Memory Pattern
  • 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.

  • Strategy Pattern
  • Bir işlemin yerine getirilmesi için birden fazla metot kullanılıyor olabilir. İhtiyaçlara göre bir metodun seçilip, uygulaması için strateji tasarım kalıbı kullanılmaktadır. Her metot bir sınıf içinde tanımlanabilir.

  • Iterator Pattern
  • Tekrarlayıcı tasarım kalıbı ile bir listede yer almakta olan nesnelerin sırasıyla, listenin yapısı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 uygulamadan soyutlama amaçlı kullanılabilmektedir.

  • State Pattern
  • Durum tasarım kalıbı kullanarak, bir nesnenin metotları, sahip olduğu özellikler değiştiği zaman değiştirilebilir. Bu durumda nesnenin sahip olduğu sınıf yapısı değiştirilmiş olacaktır.

  • Chain of responsibility Pattern
  • Sorumluluk zinciri kalıbı sisteme gönderilen bir isteğin (komut) hangi nesne tarafından cevaplanması gerektiğini bilmediğimiz durumlarda ya da isteği yapan nesne ve servis sağlayan nesne arasında sıkı bir bağ oluşmasını engellememiz gerektiğinde kullanılmaktadır. Bu tasarım kalıbında servis sağlayan ilgili tüm nesneler birbirleriyle ilişkili hale getirilir. Bir nesne zincirdeki kendinden sonraki 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ı nesneyi bulana kadar devam eder.

  • Mediator Pattern
  • Aracı tasarım kalıbı nesnelerin yönetimi ve aralarındaki iletişimin merkezi bir noktadan sağlanması ve yönetilmesi için kullanılmaktadı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

  • Observer Pattern
  • 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.

  • Template Pattern
  • Ş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 Pattern
  • 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.

  • Interpreter Pattern
  • 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.

Design Patterns Design Patterns

Sonuç

Sonuç olarak, tasarım desenleri yazılım geliştirme sürecinde karşılaşılan problemleri çözmek için oluşturulmuş çözümlerdir. Bu desenler, önceden hazırlanmış planlar olarak düşünülebilecek özelleştirilmiş çözümlerdir. Tasarım desenleri genel konseptlerdir ve yazılım problemlerini çözmek için genel yaklaşımları ifade ederler. Bu desenler sayesinde nesnelerin doğru şekilde oluşturulması, başlatılması ve yönetilmesi için çeşitli yöntemler ve yaklaşımlar sunulur. Temel hedefi nesne oluşturma sürecini soyutlamak, nesnelerin bağımlılıklarını azaltmak veya yeniden kullanılabilirliği artırmaktır.

Tasarım desenleri üç ana kategori altında incelenir: Yaratımsal Tasarım Kalıpları, Yapısal Desenler ve Davranışsal Desenler. Yaratımsal kalıplar, yazılım nesnelerinin yaratılması için esnek yapılar sunarak önceden belirlenen durumlara bağlı olarak gerekli nesneleri oluşturur. Bu kategorideki tasarım kalıpları, farklı yaratım senaryolarını ele alır ve nesne yaratım işlemlerini yönetmek için şablonlar sunar.

Yapısal desenler, farklı sınıf ve nesneleri bir araya getirerek daha büyük ve karmaşık yapılar oluşturmayı amaçlar. Bu desenler, yazılım tasarımını daha esnek, ölçeklenebilir ve sürdürülebilir hale getirmek için varolan sınıfları ve nesneleri düzenlemeye yardımcı olur.

Davranışsal desenler, belirli görevlerin tasarlanmış nesnelere gönderilmesini ve dönen sonuçların işlenmesini içerir. Bu desenler, farklı davranış senaryolarını ele alır ve nesneler arasındaki etkileşimi yönetmek için şablonlar sunar

Tasarım desenleri, yazılım geliştirme sürecinde karşılaşılan zorlukları daha yönetilebilir ve anlaşılır bir şekilde çözmek için güçlü araçlar sunar. Her bir desen, belirli bir senaryoya veya soruna yönelik en iyi uygulama yaklaşımını temsil eder. Bu desenleri kullanarak, daha kaliteli, esnek ve sürdürülebilir yazılım tasarımları oluşturabilirsiniz.