Design Patterns (Tasarım Desenleri), bilgisayar biliminde bir problemin çözümüne işaret eden daha önceden bulunmuş denenmiş kısaca "Best practices" diye nitelendirebileceğimiz bir tasarım yönelimidir. Çoğu insanın tabiriyle "tekerleği baştan icat etmeye gerek yok" sözünün aslında karşılığını bu konseptte çok sık duyarız.
Tasarım desenleri size direkt olarak kod üretmez sadece belirli bir problemin çözümüne bir şablon oluşturur. Şablon derken mimari düzeyde sınıf ve method tasarımlarınızı oluşturmanızı sağlar. Herhangi bir kod parçacığı içermediği için programlama dilinden bağımsızdırlar. Object-Oriented (Nesne yönelimli) bir tasarım deseni kullanıyorsanız, bu deseni herhangi bir Object-Oriented programlama dilinde geliştirebilirsiniz. (Java, C++,C# vb.)
Tasarım desenlerini sadece nesne yönelimli olarak düşünmemeliyiz, geliştirdiğiniz bir web uygulamasında tasarım ve uygulamaya yonelik bir problemin çözümünde de kullanabilirsiniz. Mesela, ülkeler, şehirler ve ilçeleri barındıran ayrı ayrı dropdownlist kontrolleriniz olsun. Çok sık karşılaşılan bir senaryo; listeden seçilen ülkeye göre, o ülkenin şehirleri ve listeden seçilen şehire göre o şehire göre gelen ilçeler web uygulamalarında çok sıkça karşımıza çıkar. Burada izleyeceğiniz strateji ve bu problemin çözümünü içeren tasarım desenleri mevcuttur.
Yüzlerce tasarım deseni olmasına karşın, 1994 yılında GOF (Gang of Four) tarafından çıkartılan 23 tasarım deseni artık kendini kanıtlamış ve en çok bilinen tasarım desenleri olmuştur. Daha sonra diğer insanlar tarafından çıkartılan tasarım desenleride GOF tarafından çıkartılmış tasarım desenlerinden türemiş ya da benzer çözümler üretmişlerdir. GOF tarafından 1994 yılında piyasaya çıkan Design Patterns: Elements of Reusable Object-Oriented Software kitap yazılım geliştiriciler ve yazılım mimarları için tasarım desenlerinde başvurulan yetkili kaynak olmuştur.
Tasarım desenleri daha öncede belirttiğim gibi, var olan bir problemin çözümüne ışık tutarlar. Aslında temel amaç problemin çözümü olsa da, yapılan tasarımın ve geliştirilen kodun tekrar kullanılabilirliğidir.(Reusability) Eğer bir proje için yazdığınız ve tasarladığınız sınıfları, methodları ve özellikleri benzer diğer bir proje için kullanamıyorsanız hem zamandan hem maliyetten hem de kaliteden (bir projenin temel 3 yapıtaşı) kaybediyorsunuzdur. Örneğin; projenizde bir veriye ulaşım katmanı (Data Access Layer) bulunmuyorsa, diğer veriyle iş yaptığınız projelerde sürekli benzer kodları yazarsınız ki günümüzde veriye erişmeyen, veriyi kullanmayan uygulama sayısı çok azdır. Tasarım desenlerinin diğer bir avantajı sistemin genişletilebilirliğidir.(Extensibility) Yazılım projeleri müşterinin ihtiyacından (business need) ya da pazarda bir fırsat kazanmak (market opportunity) için ortaya çıkarlar. Müşteri ihtiyacı olarak, var olan bir sistemin daha iyi ve verimli, az maliyetli kullanılarak son kullanıcıya hizmet vermesi olarak düşünülebilir. Örneğin, siparişlerini telefondan alan bir pizzacı dükkanının, siparişlerini daha iyi yönetmesi ve aynı anda daha çok müşteriye ulaşabilmesi adına sipariş sistemini internet üzerinden gerçekleştirmesi buna iyi bir örnek olabilir. Pazarda bir fırsat kazanmak, tekel olmak gibi daha önceden yapılmamış ya da iyi yönetilememiş bir sistemin daha iyi bir sürümünü çıkartmak da bir projenin çıkış nedenlerindendir. Örneğin, Facebook, sosyal ağlar ve arkadaşlık siteleri arasında ilk sıraya oturmuştur. Tüm bu projelerin ortak noktası, yazılım projesinin herhangi bir zamanda değişebilmesidir. Yani yeni özelliklerin eklenmesi. Var olan bir alt sistemin düzeltilmesi ve bu düzeltmeyi yaparkende var olan diğer sistemleri etkilemeden geçişin yapılması çok önemlidir. Örneğin, Oracle veritabanını kullanan uygulamanızın ileride başka bir veritabanına geçişi muhtemel ise sistemi başta tasarlarken bu değişimi düşünmelisiniz ve mimariyi değişebilme ihtimaline göre tasarlamanız gerekmektedir. Yarın bir gün sisteminiz Oracle'dan SQL Server'a geçtiği zaman, geçiş kolay ve hızlı olmalıdır. Belkide en önemlisi var olan sisteminizi en az değişiklikle SQL Server'a geçirmeniz olacaktır. Tasarım desenleri, kurumsal mimariler ve diğer bilgisayar biliminde olan Refactoring, katmanlı mimariler (Layered Architectures) yaptığınız tasarımları genişletilebilir olmasına yardımcı olurlar. Genişletilebilir bir mimari tasarladığınız zaman yaptığınız değişikliklerde etkilenen diğer sistemler azalacak, yeni sisteme geçiş sürecini rahat ve maliyet, zaman, ve kaliteden tasarruflu bir şekilde gerçekleştirmiş olacaksınız.(Modification)
Yazılım sistemlerinin yönetimi çoğu zaman zor olmuştur. Kompleks sistemler olduğu, ihtiyacların ve teknolojinin sürekli değiştiği iş ortamını düşündüğümüz zaman gerek kod ve tasarım açısından gerek de proje yönetimi açısından yönetiminde zor olduğu açıktır. Tasarladığımız bir sisteme ya da yazdığımız bir kod parçacığına bir kaç ay sonra baktığımızda bile kendimiz bile zor hatırlarken diğer geliştirici ve yazılım mimarlarının bu tasarıma baktıklarında sistemin kolay anlaşılabilirliği gerçekten çok önem teşkil ediyor. Daha anlaşılabilir, okunabilir kod yazmak yazılım mühendisliği metodolojilerinin niteliklerindendir. Yazılım projeleri özellikle kurumsal yazılım projeleri takımlar halinde geliştirilir. Takımdaki elemanların yazılan ve tasarlanan sistemden haberdar olması, ve sistemi iyi anlaması gerekir. Aksi takdirde ihtiyaçlar yanlış anlaşılabilir ve ortaya müşterinin istemediği bir ürün de ortaya çıkabilir. Tasarım desenleri ve "Best practices" dediğimiz denenmiş ve en iyi çözümler bize tasarlanan sistemde, okunabilirlik, anlaşılabilirlik gibi özellikleri sağlarlar. Tasarım desenlerinin özellikle GOF tarafından çıkartılan tasarım desenleri, günümüzde yavaş yavaş geliştiriciler tarafından kullanılmakta ve framework'lerde .NET Framework, Swing vb. bu tasarım desenleri yoğunlukla kullanılmaktadır. Böylelikle çoğu insanın bildiği desenler sistemlerde kullanılıp rahatlıkla sistemin anlaşılabilmesi sağlanmış olmaktadır.
Tasarım desenleri belirli bir probleme getirilmiş en iyi ve denenmiş çözümlerdir. Bazı yazılım geliştiriciler kendi geliştirdikleri ve tasarladıkları sistemlerde özel olarak tasarım desenlerini kullanmasada aslında onlara benzer yapılar kurarlar belirli problemlerin çözümü için. Zaten tasarım desenlerine baktıkları zaman, ".. ya zaten ben bunu kullanıyordum.." gibi cümleleri de duymak mümkündür. Burada amaç şu; yaptığınız işi planlı ve yönetilebilir ve en önemlisi tekrar kullanılabilir hale getirmek. Tasarım desenlerini kullanmanız yapılan projenin %100 başarılı olacağını söylemez. Ama yapılan işin planlı olduğunu ve çıkabilecek risklerde sistemin daha yönetilebilir bir halde bakımını gerektirirler. Sonuç olarak bu desenler diğer insanlar tarafından denenmiş ve başarılı olmuş çözümlerdir. Kullanıp kullanmamak sizin seçeneğiniz. Ayrıca şöyle bir şey de var, sistemde illa tasarım deseni kullanmak adına da tasarım desenleri kullanılmaz. Daha önce de belirttiğim gibi, eğer belirli bir problem varsa, tasarım desenleri o problemin çözümüne hitap ederler. Yine probleminizin çözümü bir tasarım desenine benziyor diye tasarım desenlerini kullanmamalısınız. Aksi takdirde gerçek ihtiyaçtan uzaklaşıp, müşterinin istemediği başka özellikleri de ekleyebilir ya da yanlış özellikleri sisteme ekleyebilirsiniz. Tasarım desenleri doğru zamanda, doğru problemin çözümüne ışık tutarlar.
Tasarım desenlerini iyice bilmek için ilk olarak UML (Unified Modelling Language) , modelleme aracını iyi bilmeniz gerekmektedir. Özellikle Object-Oriented tasarım desenlerini kullanacaksanız. Çünkü tasarım desenleri kod parçacığı içermedikleri için, mimari tasarım sınıflar ve sınıflar arasındaki ilişkiler şeklinde tanımlanmıştır.
GOF tarafından çıkartılan 23 tasarım deseni 3 ana kategoride sınıflandırılmıştır. Bunlar;
Creational Patterns
Structural Patterns
Behavioral Patterns
Creational Patterns, nesnelerin ve sınıfların oluşturulması ile ilgili tasarım desenlerini içerir. Structural Patterns, sınıfların yapısal özelliklerinin belirlenmesi ile ilgili tasarım desenlerini içerir. Özellikle bileşik nesnelerin oluşturulması, ağaç yapılarının oluşturulmasını sağlayan tasarım desenlerini içerir. Behavioral patterns, nesnelerin davranışsal özelliklerini ve bu davranışlara göre durumlarını yöneten tasarım desenlerini içerir.
Aşağıda tasarım desenleri ile ilgili kaynaklar bulunmaktadır. Bu kaynaklarda tasarım desenleri ve desenlerin örnekleri veriliyor. Özellikle www.dofactory.com adresindeki anlatım ve örnekler gerçekten çok güzel. Yine www.sourcemaking.com adresindeki tasarım desenlerine ve örneklerine de mutlaka bir göz atın derim.
Bir sonraki yazımda Creational Pattern'ler ile ilgili gerçek uygulamalarda kullanılan örneklerle bir yazı yazacağım. Örneklerle tasarım desenlerinin daha iyi anlaşılacağını rahat bir şekilde göreceksiniz. Tasarım desenleri ile ilgili hazırlamış olduğum ingilizce bir sunum var onuda Sunumlar bölümünden ya da buraya tıklayarak indirebilirsiniz.
Design Patterns ile ilgili Kaynaklar
Wikipedia
http://en.wikipedia.org/wiki/Design_pattern_(computer_science)
DoFactory
http://www.dofactory.com
GOF - Design Patterns: Elements of Reusable Object-Oriented Software ( Kitap)
http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612
Yahoo Design Patterns Library
http://developer.yahoo.com/ypatterns/
Sourcemaking
http://sourcemaking.com/