Herkese merhaba. Bu yazıda yazılım dünyasında oldukça sık kullanılan terimlerden biri olan Design Patterns (Tasarım Kalıpları) konusunu inceleyeceğiz. Design pattern’lar genellikle yazılım geliştirme sürecinde sıkça karşılaştığımız sorunlara karşı geliştirilen çözümlerdir. Pattern’ler kodun okunabilirliğini arttırır ve tekrar tekrar kullanılabilir olmasını sağlar. Pattern kavramı ilk olarak Cristopher Alexander’ın “A Pattern Language: Towns, Buildings, Construction” kitabında tanımlanmıştır. Kitap içerisinde kentsel çevreyi tasarlamak için kullanılan bir “dil” anlatılmaktadır. Kullanılan bu dilin birimlerini ise pattern’ler oluşturur. Bir binanın penceresinin yüksekliği, kaç kata sahip olması gerektiği gibi birim kurallar pattern’ler ile açıklanmaktadır. Daha sonra 1994’te Gang of Four (GoF) olarak bilinen 4 arkadaşın “Design Patterns – Elements of Reusable Object-Oriented Software” kitabı ile yazılım dünyası da pattern’ler ile tanışır.

Design Patterns Nedir?

1994 yılında yayınlanan Gang of Four’un kitabında nesne yönelimli tasarım kaynaklı problemlere çözüm sunan 23 pattern bulunmaktadır. Kitap o dönemde çok kısa süre içerisinde çok satanlar listesine girdi ve kısaca “The Book by The Gang of Four” olarak isimlendirildi. Bundan sonrasında pek çok problemi çözen nesne yönelimli pattern’ler keşfedildi. Günümüzde nesne yönelimli problemlere çözüm bulan patternler dışında programlama dilleri için kullanılabilen pattern’ler de bulunmaktadır.

Design pattern basitçe yazılım geliştirme aşamasında karşımıza çıkan yaygın sorunlara karşı bulunmuş çözümlerdir. Yaşadığımız soruna karşı ayrıntılı bir şekilde tasarlanmış çözüm planı olarak da düşünebiliriz. Sadece spesifik bir problemi çözmek için kullanılan bir kod parçası değil, belirli bir problemi çözmek için kullanılan bir konsepttir. Pattern’in açıklamasını ve detaylarını inceleyerek kendi projenize uygun bir şekilde entegre edebiliriz.

Design pattern’ler genellikle algoritmalar ile karıştırılırlar. Bunun nedeni iki konseptin de belirli problemlere çözüm bulmasıdır. Ancak algoritma; belli bir takım hedefleri gerçekleştirmek için açıkça belirlenmiş aksiyonlardan oluşur. Pattern’ler ise daha yüksek seviyede bir çözüm getirmektedir. Aynı pattern’i uygulayan iki program birbirinden farklı olabilir. Ancak aynı algoritmayı kullanan iki program birbirine benzerdir. Örneklememiz gerekirse algoritmayı yemek tarifine benzetebiliriz. Yemek tarifi, yemeği düzgün yapabilmemiz için içerisinde açıklaması bulunan adımları barındırır. Öte yandan pattern daha çok bir şablona benzer. Sonucu ve özellikleri net bir şekilde görebiliriz ancak entegrasyon süreci tamamen size bağlıdır.

Design Pattern Nelerden Oluşur?

Patternler genellikle benzer tasarım yapılarına sahiptir. Pek çok pattern açıklama kısmında intent, motivation, structure ve code example bölümlerini bulundurur.

Intent: Kısaca problemi ve sağladığı çözümü betimler.

Motivation: Problemi ve pattern’in sağladığı çözümü daha da açıklar.

Structure: Classların yapısı pattern’in her parçasını ve birbirleriyle nasıl ilişkili olduklarını gösterir.

Code Example: Popüler programlama dillerindeki kod örnekleri pattern’in mantığını kavramayı kolaylaştırır.

Neden Pattern Öğrenmeliyiz?

Tek bir design pattern öğrenmeden ve kullanmadan da bir proje geliştirebiliriz. Aslında böyle çalışırken bile yaygın pek çok problemle karşılacağımız için farkında olmadan bir pattern kullanabiliriz. Ancak bu şekilde geliştirdiğimiz bir projenin yeni iş kurallarına ve süreçlerine adaptasyonu zorlaştırır. Daha sonrasında büyüyecek ve çok kullanıcıya hitap eden projelerin tasarım aşamasında design pattern’lar hakkında bilgi sahibi olmak işimizi kolaylaştırır. Design pattern’ler daha önceden denenmiş ve test edilmiş çözümlerden oluştuğu için problemleri daha hızlı çözmemizi sağlar. Problemlerin bire bir aynısı ile karşılaşmamış olsanız bile farklı problemlere nesne yönelimli programlama ilkelerini kullanarak problemleri çözmemize yardımcı olur. Design pattern’lar ekip arkadaşlarınızla beraber daha efektif bir iletişim kurmanızı sağlayan yaygın bir dildir. Örneğin; “Bu problem için Singleton pattern kullanmalıyız.” dediğinizde önerinizin arkasındaki fikir anlaşılacaktır.

Design Pattern Sorunları

Design pattern’ların her yere uygulanmaya çalışılması yaygın yaşanan bir sorundur. Özellikle acemi geliştiriciler basit bir kodun yeterli olacağı bir çözüm için bile pattern kullanıyorlar. Bu da proje içerisinde gereksiz bir kalabalık oluşmasına ve kodun karmaşıklaşmasına neden oluyor. Bir diğer sorun ise bir pattern’in olduğu gibi projeye uyarlanmaya çalışmasından kaynaklanıyor. Design patternlar sistematikleşmiş bir çözüm sunduğu için dogma olarak kabul ediliyor ve projeye olduğu gibi implement ediliyorlar. Design pattern’ı projeye implement etmeden önce projedeki sorunları belirlemek ve kullanılabilecek patternleri belirlemek bu sorunu aşmanıza yardımcı olabilir.

Pattern Sınıflandırılması

Design pattern’lar karmaşıklıklarına, detaylılığına ve uygulanabilirlik derecelerine göre sınıflandırılabilirler. En basit ve düşük seviye patternler genellikle idiom olarak adlandırılırlar. Genellikle sadece bir programlama diline uygulanabilirler. En evrensel ve yüksek seviye pattern’ler mimari pattern’lerdir. Geliştiriciler bu patternleri herhangi bir projeye implement edebilirler. Diğer pattern’lerin aksine bu patternler bütün bir uygulamanın tasarımında kullanılabilirler.

Bunlara ek olarak pattern’ler amaçlarına göre de sınıflandırıldıklarında 3 ana kategoride toplanırlar.

Creational Patterns (Yaratıcı Kalıplar): Esnekliği ve mevcut kodun yeniden kullanımını arttıran nesne oluşturma mekanizmaları sağlar.  (Factory, Abstract Factory, Builder, Object Pool, Prototype, Singleton)

Structural Patterns (Yapısal Kalıplar): Büyük yapıları esnek ve verimli tutarken nesnelerin ve class’ların büyük yapılar halinde nasıl birleşeceğini açıklar. (Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Private Class Data, Proxy)

Behavioral Patterns (Davranışsal Kalıplar): Nesneler arasında etkili iletişim ve sorumlulukların atanmasını sağlar. (Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Null Object, Observer, State, Strategy, Template Method, Visitor)

Daha sonraki yazılarımda bu patternleri detaylı bir şekilde inceleyeceğiz. Bir sonraki yazıya kadar kendinize çok iyi bakın! 😊