Tasarım Desenleri(Design Patterns) - Soru&Cevap - Yazılım Fikirleri
Tasarım Desenleri(Design Patterns)
Asked by Winterex
Sevgili arkadaşlar bu yazımda sizlere tasarım desenleri (Design Patterns) nedir, neden kullanılır, neden mevcut yazılım geliştirme ortamlarında olmazsa olmazdır ve bu kadar büyük bir önem teşkil etmektedir onu anlatacağım...
Temel olarak söylemek gerekirse tasarım desenleri, OOP prensiplerinin bir amaç için çözüm odaklı standartlaşmış kalıplarda kullanılmasıdır. Pek açıklayıcı olmadı değil mi? Bir de şöyle anlatayım...
Hangi mekanda olursanız olun,hangi tarz projeyle uğraşırsanız uğraşın,hangi dili kullanırsanız kullanın, bir yazılımcı olarak sizlerin karşılaştığı problemler asla size özgü değildir. Tıpkı sizin gibi başka yazılımcılar da her ne kadar farklı dil kullansalar da,farklı projelerle uğraşsalar da kendi projelerinde sizinkine çok yakın ve özellikle bazı proje sistemlerinde tıpkı sizinkilerle birebir tutan aynı sorunlarla karşılaşmışlardır. Bu sorunlardan bahsederken tabii ki basit syntax(yazım kuralı) hatalarından veya çalışma zamanı (runtime exception)hatalarından bahsetmiyorum.Hatta mantıksal(logical) hatalardan bile bahsetmiyorum. Bahsettiğim sıkıntılar performans düşürücü, öngörülemeyen ihtimaller yüzünden projenin önünü kesici, proje normalde çalışmasına rağmen olur olmadık yerde bug çıkaran,projeye yeni bir şey eklenmek istediği zaman bunu mümkün kılmayan, esnekliği öldüren sorunlardır. İlgili yazılımcı artık klasik 3 kategoride belirlenen hataları çoktan aşmış, bir projeyi sonuna kadar getirmiş ve onu canlıya alıp başarıyla çalıştırmıştır. Ancak asıl olay burada başlar. Her şey bitmiş değildir. Çünkü çalışmakta olan projenin kalitesi ve yaşam süresi onun nasıl çalıştığına bağlıdır. Yazılımcının tek görevi çalışan bir uygulama yazmak değildir. Performanslı çalışan ve esnek -yani yeniliklere açık ve yeni gelecek ekip arkadaşları için geliştirici dostu bir uygulama yazmaktır. Dolayısıyla böyle bir uğraş içerisindeyken biz yazılımcıların karşılaştığı sorunlar ciddi ölçüde yavaşlatıcı ve bezdirici olabilir.
Elbette bu tarz sorunlarla karşılaşan yazılımcılar kendi algoritmalarını kurup belirli sistemlerle bu sıkıntılardan kaçınabilirler. Ancak bu genelde standartlaşmış bir çözüm olmaktan ziyade spesifik ve sadece o anı kurtaran bir çözüm olur. Ayrıca kendi senaryosu için iyi olabilen bir çözüm bulmuşken başka senaryolarda çok önemli başka sıkıntılar meydana çıkma ihtimali de büyüktür. Yani bir kalıba uymaz.. İşte tasarım kalıpları bu tarz sorunlara karşı standartlaşmış ve sorunu tamamen çözen,problemi çözerken de başka bir sorun ortaya çıkarmayan,OOP prensiplerini kullanan algoritmalardır.
Tasarım patternleri hayatımıza -daha doğrusu yazılım hayatına- Kent Beck ve Ward Cunningham önclüğünden sonra kendilerine Gang of Four diyen 4 yazılım bilimcisi(Erich Gamma,Richard Helm,Ralph Johnson,John Vissides) tarafından getirilerek proje geliştirme esnasında karşılaşılan senaryolara uygun kategorilere ayrılmıştır. Bu yazılım bilimcileri yazdıkları "Design Patterns: Elements of Reusable Object-Oriented Software" isimli kitaplarında Christopher Alexander'in ilk kez ortaya attığı önemli bu kavramı yazılıma entegre edip bir devrim yaratmışlardır. Gang of Four'a göre tasarım patternleri ortak yazılım problemlerine kalıcı çözümler sunar. OOP- yani Nesne Yönelimli Programlamada ise tasarım patternleri büyük ölçekli yazılım mimarileriyle ilgilenmekten ziyade nesnelerin birbirleriyle davranışları ve ilişkileri ile ilgili sorunları çözmekle ilgilenir(zaten bu yüzdendir ki mimari paternler ile tasarım paternleri arasında fark vardır.). Yani bir tasarım paterni kullanıyorsanız sizin projenizin mimarisi zaten bellidir ve sağlamdır. Siz sadece bu mimari içindeki çalışma mantığında güzel ve sorunsuz bir iş akışı için bu paterni kullanırsınız. Onların olmaması projenizin çalışmayacağı anlamına gelmez. Ancak projenizin profesyonel bir yapıdan ziyade sorun çıkarmaya yatkın ve değişime sıcak bakmayan bir yapı olduğunu gösterir.
Tasarım desenleri kategorisel olarak üçe ayrılır: Creational (Oluşturucu), Structural(Yapısal), Behavioral (Davranışsal) paternler. Bu kalıpların her birinin özel ilgilendiği senaryolar ve içlerinde barındırdığı paternler var. Sonraki yazılarımda Creational Pattern'i açıklayıp GoF'un belirttiği senaryoları açıklayacağım.
Biliyorum belki de size çok fazla tarihsel ve teorik bilgi sundum. Ancak tasarım paternlerinin algoritmasını öğrenmeye başlamadan önce onların ne olduğunun ve neden yazılım hayatına girdiğinin anlaşılması bence önemli. Ben zaten her kategoride her paternle ilgili ayrı yazılarımda bir anlatım ve kod örnekleri yazacağım. Fakat bunlardan önce bence bir yazılımcının kullandığı her şeyin nedenini anlaması en az kullandığı kalıplar kadar önemlidir.
Sonraki yazımda görüşmek üzere...Hoşçakalın.