Dizayn Patern Nedir ? What is design pattern ?

Son günlerde bu sorunun arama motorlarında sıkça aratıldığını görüyorum. Bu konu hakkında geniş bilgi için C++, Java ve C# ile UML ve Dizayn Paternleri isimli kitabımdan faydalanabilirsiniz. Aşağıdaki yazı söz konusu kitaptan kısa bir alıntı olup izinsiz ve referans vermeden kullanılamaz.

c++ java ve c# ile uml ve dizayn paternleri kitap

c++ java ve c# ile uml ve dizayn paternleri kitap

Patern kavramı; “klişeleşmiş durumlar ya da sorunlar için geliştirilmiş, belirli bir ismi olan ve dokümante edilmiş, nesne yönelimli standart tasarım çözümleri” biçiminde tanımlanabilir. Paternler kullanılarak, belirli sorunlar herkes tarafından bilinen standart yöntemlerle daha kolay bir biçimde çözümlenebilmektedir. Böylece tipik bir sorunla karşılaşan bir programcı (örneğin aynı sınıfa ilişkin nesnenin hep aynı referansı kullanarak sadece bir kez yaratılması gibi) Amerikayı yeniden keşfetmek zorunda kalmayacak, ilgili paterni kullanarak (bu örnek için Singleton) sorunu hızlı bir biçimde çözümleyebilecektir.

Patern kavramı aslında günlük hayatta, farkında bile olmadan kullandığımız bir olgudur. Örneğin satranç oynuyorsanız rok gibi bazı hamleler veya açılışları bilirsiniz. Ya da tavlada kapı alan zar kombinasyonları vardır. Bunlar belirli durumlarda uygulanan, herkesçe bilinen ve ismi konulmuş çözümlerdir. Müzikteki akorlar veya makamlar ise yine başka bir patern örneği olarak düşünülebilir. Eğer elektronikle uğraşmış bir programcıysanız bilinen bazı tipik devre tasarımlarını da birer dizayn paterni gibi düşünebilirsiniz. Sözgelimi elektronikçiler bir multivibratör devre gerektiğinde bunu nasıl tasarlarım diye düşünmez. Çünkü bu problemle geçmişte karşılaşmış olan kişiler tarafından geliştirilmiş ve multivibratör diye ismi konulmuş bir devre tasarımı vardır. Aynı şeye ihtiyaç duyduğunuzda bu tasarım kalıbını alır, aynen uygular ve sorununuzu çözersiniz. İşte nesne yönelimli programlamada da zaman içinde böyle tasarım kalıpları (dizayn patern’leri) geliştirilmiş olup, kendilerine ihtiyaç duyduğumuz durumlarda aynı şekilde kullanmaktayız. Ayrıca varolan bir kod veya kütüphane üzerinde çalışılırken, uygulanmış olası bir paterni keşfeden programcı, orada hangi gerekçeyle ne yapılmak istendiğini hemen anlayabilecektir. Örneğin .NET kütüphanesinde neden DataRow sınıfının programcının erişebileceği bir constructor’ı (başlangıç fonksiyonu) yoktur da DataTable sınıfının NewRow() isimli fonksiyonuyla bu sınıf türünde nesne yaratılır ? Kaldı ki DataRow soyut (abstract) bir sınıf da değildir. (Bu sınıfın constructor’ı protected olduğu için erişilemez) Bu sorunun cevabının arkasında FactoryMethod isimli bir patern vardır. Yine bir soruyla açıklamaya düşünmeye devam edelim. Şayet DataRow sınıfının erişilebilir bir constructor’ı olsaydı, nesne yaratıldığında temsil ettiği kaydın içinde olacağı tablonun yapısını (şemasını) bilmesi nasıl sağlanabilirdi ? Belki  bu, constructor’a parametre olarak DataTable nesnesinin geçilmesi yoluyla sağlanabilirdi. Ancak bu çözüm amacı net olarak vurgulamayan ve daha sonra anti-pattern kavramıyla ele alacağımız kötü bir çözümdür. İşte NewRow() tablonun şemasına uyumlu bir kaydı yaratan ve yarattığı kaydın referansını DataRow türünde geriye döndüren bir fonksiyondur. Ve bu paterni tanıyan bilinçli bir programcı burada uygulanmış mantığı bu şekilde rahatlıkla fark edebilir. DataTable tbl = new DataTable(); // … DataRow r = tbl.NewRow(); Patenler çok defa ve yanlışlıkla sadece dizayn patern’lerinden ibaretmiş gibi anlaşılmakta ve aktarılmaktadır. Oysa paternler yazılım mühendisliğinde çeşitli düzeylerde örneğin hem implementasyon hem de mimari düzeyde kullanılmaktadır. Dizayn patern’leri implementasyona ilişkin paternler olup, kısaca GoF patern’leri biçiminde de isimlendirilmektedir. Öte yandan MVC, MVP, Transaction Script, Table Module gibi paternler ise mimari patern’lerdir. Bunların yanı sıra, yeniden yapılandırma (refactoring) patern’leri diye bilinen üçüncü bir gruptan daha bahsedilebilir.

Reklamlar

Dizayn Patern Nedir ? What is design pattern ?” üzerine 3 yorum

  1. Geri bildirim: ASP.NET Kütüphanesindeki (OOP) Tasarım Hataları « Aykut TAŞDELEN (.NET, Java, C, C++, UML, SQL Eğitmeni)
  2. Cok guzel bir yazi olmus hocam. Ozellikle bu kitabinizi heyecanla bekliyorum, diger kitaplariniz gibi bu da cok orjinal olacak, buna hic suphe yok 🙂

Yorumlar kapalı.