Tasarım Deseni / Kalıbı / Örüntüsü (Design Patterns) Nedir?

Tasarım deseni veya tasarım kalıbı veya örüntüsü, yazılım tasarımında yaygın olarak ortaya çıkan sorunlara tipik çözümlerdir. Kodunuzda yinelenen bir tasarım sorununu çözmek için özelleştirebileceğiniz önceden hazırlanmış planlar gibidirler.

Kullanıma hazır fonksiyonlar veya kütüphaneler gibi hemen bir kalıp bulup programınıza kopyalayamazsınız. Tasarım deseni, belirli bir kod parçası değil, belirli bir sorunu çözmek için genel bir kavramdır. Desen detaylarını takip eder ve kendi programınızın gerçeklerine uygun bir çözüm uygularsınız.

Tasarım desenleri, Yazılım Tasarım İlkeleri (Software Design Principles) Nedir? başlıklı yazımızda anlattığımız prensiplerin uygulanmış, gerçeklenmiş halleridir. Bu nedenle tasarım kalıpları konusundan önce bu prensiplerin ne olduğunu iyi bir şekilde öğrenmeniz gerekir.

Desenler genellikle algoritmalarla karıştırılır, çünkü her iki kavram da bilinen bazı problemlerin tipik çözümlerini tanımlar. Bir algoritma her zaman bir hedefe ulaşabilecek net bir eylemler kümesi tanımlarken, bir desen bir çözümün daha üst düzey bir açıklamasıdır. Aynı desenin iki farklı programa uygulanan kodu farklı olabilir.

Bir algoritma yemek tarifi gibidir: Her ikisinin de bir hedefe ulaşmak için net adımları vardır. Öte yandan, bir desen daha çok bir taslak gibidir. Sonucun ve özelliklerinin ne olduğunu görebilirsiniz, ancak kesin uygulama sırası size kalmıştır.

Desen (Pattern) Nelerden Oluşur?

Çoğu tasarım kalıbı, çok resmi olarak tanımlanır ve böylece insanlar onları birçok bağlamda yeniden üretir. Bir desen açıklamasında genellikle bulunan bölümler şunlardır:

  • Desenin amacı, hem sorunu hem de çözümü kısaca açıklar.
  • Motivasyon, sorunu ve desenin mümkün kıldığı çözümü daha da açıklar.
  • Sınıfların yapısı, deseninher bir parçasını ve bunların nasıl ilişkili olduğunu gösterir.
  • Popüler programlama dillerinden birindeki kod örneği, desenin arkasındaki fikri kavramayı kolaylaştırır.

Bazı kalıp katalogları, kalıbın uygulanabilirliği, uygulama adımları ve diğer kalıplarla ilişkiler gibi diğer faydalı detayları listeler.

Desenlerin Sınıflandırılması

En temel ve düşük seviyeli desenlere genellikle idioms denir. Çoğunlukla yalnızca tek bir programlama diline uygulanırlar.

Tasarım kalıpları, karmaşıklıklarına, ayrıntı düzeylerine ve tasarlanmakta olan tüm sisteme uygulanabilirlik derecelerine göre farklılık gösterir. Tıpkı bir yol yapımına benzetebiliriz. Bazı trafik ışıkları kurarak veya yayalar için yeraltı geçitleriyle çok seviyeli bir kavşak inşa ederek bir kavşağı daha güvenli hale getirebilirsiniz.

En evrensel ve üst düzey desenler mimari desenlerdir. Geliştiriciler bu kalıpları hemen hemen her dilde uygularlar. Diğer kalıplardan farklı olarak, tüm bir uygulamanın mimarisini tasarlamak için kullanılabilirler.

Ek olarak, tüm desenler niyetlerine veya amaçlarına göre kategorilere ayrılırlar. Bu yazı serisi üç ana tasarım deseni grubunu anlatacak:

  • Oluşturucu Desenler (Creational patterns), esnekliği ve mevcut kodun yeniden kullanımını artıran nesne oluşturma mekanizmaları sağlar.
  • Yapısal Desenler (Structural patterns), yapıları esnek ve verimli tutarken nesnelerin ve sınıfların daha büyük yapılarda nasıl birleştirileceğini açıklar.
  • Davranışsal Desenler (Behavioral patterns), nesneler arasında etkili iletişim ve sorumlulukların atanmasını sağlar.

Bu üç ana kategori altında yer alan tasarım desenleri ise şunlardır;

Creational Patterns

Structural Design Patterns

  • Adapter
  • Bridge
  • Composite
  • Decorator
  • Facade
  • Flyweight
  • Proxy

Behavioral Design Patterns

Tasarım Kalıplarını Kim İcat Etti?

Bu güzel, ama çok doğru bir soru değil. Tasarım kalıpları belirsiz, karmaşık kavramlar değildir. Tam tersine desenler, nesne yönelimli tasarımdaki yaygın sorunlara tipik çözümlerdir. Bir çözüm çeşitli projelerde defalarca tekrarlandığında, birileri sonunda ona bir isim verir ve çözümü ayrıntılı olarak açıklar. Temelde bir tasarım deseni (kalıp veya örüntü) bu şekilde keşfedilir.

Desen kavramı ilk olarak Christopher Alexander tarafından A Pattern Language: Towns, Buildings, Construction kitabında tanımlanmıştır. Kitap, kentsel çevreyi tasarlamak için bir “dil” tanımlıyor. Bu dilin birimleri kalıplardır. Bu kalıplar ise pencerelerin ne kadar yüksek olması gerektiğini, bir binanın kaç katı olması gerektiğini, bir mahallede ne kadar büyük yeşil alanların olması gerektiğini vb. tanımlayabiliyorlar.

Fikir dört yazar tarafından alındı: Erich Gamma, John Vlissides, Ralph Johnson ve Richard Helm. 1994 yılında, tasarım kalıpları kavramını programlamaya uyguladıkları Design Patterns: Elements of Reusable Object-Oriented Software‘i yayınladılar. Kitap, nesne yönelimli tasarımın çeşitli problemlerini çözen 23 model içeriyor. Üstelik çok hızlı bir şekilde en çok satan haline gelmiştir. Uzun isminden dolayı insanlar onu “Dörtlü çetenin kitabı (the book by the gang of four)” olarak adlandırmaya başladılar ve kısa süre sonra sadece “GoF kitabı (the GoF book)” olarak kısalttılar.

O zamandan beri düzinelerce başka nesne yönelimli tasarım deseni ortaya çıktı. “Desen yaklaşımı” diğer programlama alanlarında çok popüler hale geldi, bu nedenle artık nesne yönelimli tasarımın dışında da birçok başka model var.

Neden Tasarım Kalıplarını Öğrenmeliyim?

Gerçek şu ki, tek bir kalıp hakkında bilgi sahibi olmadan uzun yıllar programcı olarak çalışmayı başarabilirsiniz. Pek çok insan tam da bunu yapıyor. Bu durumda bile, bilmeden bazı kalıpları uyguluyor olabilirsiniz. Öyleyse neden onları öğrenmek için zaman harcayasınız?

  • Tasarım kalıpları, yazılım tasarımındaki yaygın sorunlara denenmiş ve test edilmiş çözümlerden oluşan bir araç takımıdır. Bu sorunlarla hiç karşılaşmasanız bile, tasarım deseni bilmek yine de size yarar sağlar. Çünkü size nesne yönelimli tasarım ilkelerini kullanarak her türlü sorunu nasıl çözeceğinizi öğretir.
  • Tasarım deseni, sizin ve ekip arkadaşlarınızın daha verimli iletişim kurmak için kullanabileceği ortak bir dil tanımlar. “Ah, bunun için bir Singleton kullan” diyebilirsiniz ve herkes önerinizin arkasındaki fikri anlayar. Deseni ve adını biliyorsanız, singleton’un ne olduğunu açıklamaya gerek yoktur.

Bu yazıda tasarım kalıplarının ne olduğunu ve önemini anlattık. Bundan sonraki yazılarımızda tüm tasarım desenlerine tek tek giriş yaparak örneklerle anlatacağız. Tüm bu yazıları blogumuzdaki Clean Code kategorisi altından takip edebilirsiniz.