Hepimiz yaşantımızda bir konuda problemlerle karşılaşmış ve buna kendimizce çözümler üretmişizdir. Bazen bu çözümler önceki çözümlerimize o kadar tanıdık gelmeye başlar ki, bu durum artık kendini tekrar etmeye başlar. Belli süre sonra artık geçmiş hatalarımızdan dersler alırız ve bir sonraki adımda aynı problemle karşılaşmamak için kendimize design patterns oluştururuz.
Yazılım sektörünün gelişiminde de bu durum söz konusu. Biz yazılımcılar aslında farklı projeler geliştiriyor olsakta benzer problemlere çözüm ararız, benzer sorunlarla karşılaşırız. Bu sorunlara da hepimiz kendimizce çözümler üretiriz. Peki bu çözümleri bir araya getirsek ve bunlara bir isim versek? İşte Design Patterns (Tasarım Kalıpları) buna çözüm sunuyor.
Design Patterns Nedir?
Tasarım kalıpları, yazılım geliştiricilerin yazılım geliştirme sırasında karşılaştıkları genel sorunların çözümüdür. Bu çözümler, uzun bir süre boyunca sayısız yazılım geliştirici tarafından deneme yanılma yoluyla elde edilmiştir. Daha sonra belli problemler için buldukları optimum çözümlere isimler vermişlerdir. GOF, kitaplarında da 23 adet Design Patterns’i konu almıştır. Ancak günümüzde bundan çok daha fazlası vardır. Ayrıca bu konuyu belli bir kalıba oturtmak doğru olmaz. Siz de projenizi geliştirirken kendi tasarım kalıbınızı oluşturabilir ve kendi çözümünüzü bulabilirsiniz. Ancak tasarım kalıplarının amacı tekerleği baştan icat etmemek olduğu için, var olan çözümleri bilip uygun olan yerde kullanmak sizin için en doğrusu olacaktır. Probleme göre uygun tasarım kalıbını uygulamakta size kalmakta.
Tasarım Kalıpları Çeşitleri
Yazılım tasarım kalıpları genel olarak 3 ana başlıkta incelenir. Bunlar şunlardır:
1- Creational Patterns (Yaratımsal Kalıplar): Bu tasarım deseni nesneleri doğrudan new operatörü kullanarak oluşturmak yerine nesne oluşturma mantığını gizleyerek sınıflardan nesne oluşturmaya alternatif çözümler sunar. Bu program akışında hangi nesneye ihtiyaç varsa onu oluşturmada esneklik ve kolaylık sağlar.
2- Structural Patterns (Yapısal Kalıplar): Bu tasarım deseni nesneler arasındaki ilişkinin yapısını düzenlemek için çözümler sunar.
3- Behavioral Patterns (Davranışsal Kalıplar): Bu tasarım deseni çalışma zamanında nesneler arasındaki davranışlar için çözümler sunar.
Bu 3 ana başlık altında yer alan yazılımcılar arasında bilinen popüler tasarım kalıpları vardır. Bunları da yazdıktan sonra yazıyı bitirelim. Bir sonraki yazılarda bu başlıkların altında yer alan tasarım kalıplarını tek tek inceleyeceğiz.
Creational Patterns: Singleton Pattern, Factory Pattern, Abstract Factory Pattern, Builder Pattern, Prototype Pattern
Structural Patterns: Adapter Pattern, Bridge Pattern, Filter Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, Flyweight Pattern, Proxy Pattern
Behavioral Patterns: Chain of Responsibility Pattern, Command Pattern, Interpreter Pattern, Iterator Pattern, Mediator Pattern, Memento Pattern, Observer Pattern, Null Object Pattern, Strategy Pattern, State Pattern, Visitor Pattern
Bunlar bilinen popüler tasarım kalıplarıdır. Tabiki burada yazanların dışında farklı kalıplarda bulunmakta. Bunlar belli problemler için geliştirilmiş denenmiş ve literatüre geçmiş çözümler.
Anti Pattern Nedir?
Anti Pattern, bir problemi çözmek için kullanılan kötü çözümler için kullanılan bir kavramdır. Yani tasarım kalıplarının tam zıttıdır diyebiliriz. Probleminizde bir anti pattern kullanmak ileride ciddi sorunlara yol açabilir. Ayrıca o problem için anti pattern olarak sayılan bir tasarım başka bir problem için uygun bir çözüm olabilir bunu unutmamak gerek.
Yazılımsal bir problemi, bilinen ve doğru çözüm olarak kabul edilmiş bir kalıbı kullanmadan ve özgün bir yöntemle çözmek anlamında kullanılmaktadır.
İlk bakışta mükemmel gibi görünen bu çözümler sonradan sıkıntılar doğurmaktadırlar.
Anti-Pattern’lerin en tehlikeli tarafı ürün geliştirme süreçlerinde ve vakalarda en uygun çözüm yolu olarak düşünülmeleridir.
Anti-Pattern kavramlarını bilmek, yazılım geliştirme sürecinde karşılaşılabilecek ciddi problemleri önceden tahmin edebilmeyi sağlar ve tedbir almayı kolaylaştırır.
Anti-patternlerin kullanılması yanlıştır.
Kısa vadede hızlı bir çözüm olarak gözükseler de genelde yazılım mimarisinde sıkıntılara yol açmaktadırlar.
Türkiye’de maalesef anti-pattern’ler fazlaca kullanılmaktadır.
Örneğin; spagetti kod yazımı ya da kodları kopyala-yapıştır yöntemiyle yazmak, anti pattern olgusuna örnektir.
Anti-Pattern Örnekleri
Magic Pushbutton (Sihirli Gönderim Düğmesi)
Herhangi bir soyutlama yapılmaksızın görsel nesnelerin arkasında kodlamanın yapılmasıdır. Buna ayrıca butonclick programcılığı denmektedir.
Bu desen GUI (Graphical User Interface) tipindeki uygulamalarda daha fazla ortaya çıkar. Ara yüz tarafı ile iş mantıkları genellikle buton gibi bir kontroller arkasına gömülür.
Spagetti Coding
Bakım ve değişikliğin yapılamayacak kadar karışık yazılmış kodlama türüne bu ad verilmektedir.
Nesne yönelimli olmayan dillerde daha sık rastlanır.
Metotlar daha çok süreç odaklı yazılır hatta süreç adları olarak isimlendirilir.
Nesneler arasında neredeyse hiç ilişki yoktur.
Çoğu metot parametre almaz ve global seviyedeki sınıf değişkenlerini oluşturmakta kullanılır.
Kodun yeniden kullanılabilirliği zordur.
OOP temel özellikleri (kalıtım, çok biçimlilik, soyutlama) kullanılmaz.
Goto komutu sebebiyle, program kodunun incelenmesi imkansız hale gelebilir.
Lasagna Coding
Gereğinden fazla sayıda katmana sahip uygulama geliştirilmesine denmektedir (Aşırı çok katmanlı uygulama).
Çok katman, çok sayıda irili ufaklı class, anlaşılması ve değiştirilmesi zor bir yazılım olabilir.

Kopyala -Yapıştır Programlama
Daha generic bir çözüm üretmek yerine var olan kodları koplayarak geliştirme yolunu tercih etmektir.
Çoğunlukla bir çözüm için yazılımın her hangi bir yerinde uygulanan bir kod parçasının, ihtiyaç olunan başka bir yerde aynen kopyalanarak kullanılmaya devam etmesi olarak tanımlanır.
Bu anti-pattern kod tekrarlarına neden olmaktadır.
Doğal sonucu olarak bir değişiklik olması halinde kodun çoğaltıldığı yerlere gidilmesi de gerekecektir.
Güncellemeler için fazla maliyetli eforlar sarf edilebilir.
Hatalar gözden kaçabilir ve uygulamanın yanlış çalışma riski giderek artabilir.
Söz konusu parçaları soyutlayıp, nesne yönelimli dil temellerine uygun olacak şekilde ayrıştırmak önemlidir.

Tasarım Kalıpları Avantajları
1. Zamanla, kalıpların kataloglarını yapabiliriz. Bu sayede, yazılım geliştirmeye yeni başlayanların yıllar geçtikçe kazanılan tecrübeden daha etkili bir şekilde yararlanmasını sağlarız.
2. Kalıpların standartlaştırılması, tüm geliştiricilerin (profesyoneller, yeni başlayanlar veya uzmanların) kararlarını daha kolay vermesini sağlamaktadır.
3. Tasarım kalıpları ortak bir kelime haznesi sağlar. Bu geliştiriciler arasındaki iletişimi daha da kolay hale getirir. Bir tasarımı detaylıca açıklamaktansa, planlarımızı açıklamak için kalıp adını kullanabiliriz.
4. Kalıplar birbirleri ile ilişkilendirilebilir, böylece geliştiriciler projelerinde hangi kalıpların birlikte bulunması gerektiğini kolayca anlayabilir.
5. Tasarım Kalıpları, nesneye yönelik programlama topluluğu aracılığıyla tecrübe paylaşımı için etkili bir yöntem sunmaktadır. Örneğin; C++, Smalltalk, C# ya da Java programlama dillerinde kazanılan bilgiler, Web projelerinde ortaya çıkan uzmanlık gibi öğrenilen bilgiler biriktirebilir ve bunlar diğer geliştiricilerle paylaşılabilir.
Kriterlerine uygun pozisyonlarla eşleşmeye hazır misin? Hemen ücretsiz profilini oluştur.