Makale Özeti

Bu makalemiz tasarım desenleri adı altında yapacağımız makale dizisinin ilk giriş makalesidir.Tasarım desenlerinin .NET platformu içerisinde nasıl kullanabileceğimize ışık tutacağımız bu yazı dizisine öncelikle tasarım desenleri ve OOP yi basit bir şekilde tanımlayarak başlayalım.

Makale

Bu makalemiz tasarım desenleri adı altında yapacağımız makale dizisinin ilk giriş makalesidir.Tasarım desenlerinin  .NET platformu içerisinde nasıl kullanabileceğimize ışık tutacağımız bu yazı dizisine öncelikle tasarım desenleri ve OOP yi basit bir şekilde tanımlayarak başlayalım.

 

Yazılım dünyası var olduğu günden bu yana sürekli bir değişim içerisinde olagelmiştir.Bu süreç içerisinde öyle durumlar vardır ki bunlar işin en doğrusu nedir kısmıyla ilgilendiğinden ,sadece uyarlanış ve kullanım biçimleri değişiklik göstermiş ama kendisi dimdik ayakta kalmıştır.Bu durumlar için ; gerçekleştirilmek üzere başlanılmış bir şekilde bitirilmiş veya yarım kalmış on binlerce projenin özüdür dersek pekte yanılmış olmayız.Yani gerçeğin ta kendisi.Yazılım süreçlerinin şu güne dek yaşamış olduğu en büyük sıkıntı şüphesiz somut varlıkların dijital ortamda ki yansımasının modellenip kullanımının sorunsuzca sağlanabilmesi olmuştur.Yani gerçek yaşam ve soyut diyebileceğimiz (0 ve 1) şeyler arasında ki o eşsiz ve gizemli bağın ifade edilebilmesi sorunsalı. Bu düşüncelerinde içerisine dahil olduğu bir takım kurgular (maliyet artışı , iş gücü kaybı ,deadline’lara uyamama vs.) yazılımcıların belirli teknikler aramasına sebep olmuş ve bu evrimsel süreç sonunda OOP yani nesneye yönelik programlama tekniği adı altında gün ışığına çıkmıştır.

OOP (Object Oriented Programming) bize gerçek hayatı yazılımsal olarak modellemeyi sağlamaktadır.Şu ana kadar varlığını sürdürmüş bir çok dilde OOP ‘nin yaşadığını görürsünüz.Hatta bir örnek vermek gerekirse efsanevi programcı Anders Heljsberg (96 yılında 1,5 milyon $ transfer ücreti ile Borland’dan Microsoft’a geçmiş ve yıllar sonra C#’ı ortaya çıkaran 4 ana yazılım mühendisinin başını çekmiştir.)yine efsanevi bir dil olan Pascal için compiler geliştirip adını programlama dünyasında duyurduğunda OOP’nin belkide adı bile duyulmamıştı.1994 yılının sonlarında pascal 5.5 ile kendisini hafif hafif belli eden OOP Visual dillerin belkide en başarılılarından olan Delphi’de (visual object pascal) kendini ön plana çıkarmaktan geri kalmamıştır.. (C with classes adı altında ortaya çıkarılan yani modern programlama dünyasında C++ adıyla bildiği bu dil çok daha önceleri OOP eğilimi göstermiştir ki daha sonra Sun Microsystem tarafından baz alınarak yeni bir dil olarak geliştirilen Java’nın syntax olarak temelini oluşturmuş ve ciddi bir başarı sağlamıştır) ve adını hatırlayamadığım birçokları gibi..( evet adını hatırlayamadığım diyorum çünki ciddi anlamda başarı elde etmek hatırlanabilirliği arttıracaktır mantığıyla hareket edersek bugüne kadar geniş kitleler tarafından kabul görmüş adlarını verdiğimiz bu diller gerek optimizasyon gerekse üretkenliği arttırıcı gelişmiş IDE’leri sayesinde hala ayaktadırlar..Hangi dil daha iyidir değil hangi dil neye ne kadar destek veriyor ve gelinen nokta nedir bu soruların cevaplarına bakmak lazım..)

 

İşte OOP tüm bu olup bitenlerin her zaman gözdesi olmuştur.Peki tasarım desenleri dediğimiz kavram bunun neresinde kalıyor..Tasarım desenleri ; bir modelin tasarımının gerçekleştirilmesi için doğru’ya en yakın  (mutlak  kesinlik’den bahsedilemez.Gelişime açıktır.) olan OOP  yaklaşımının yazılım sürecinde kullanımasını ihtiva eder.Yani bir iş en iyi nasıl yapılır kısmına zamanının yazılım tekniklerinin verebildiği en iyi cevaptır aslında.Tasarım desenleri zamanla ortaya çıkmıştır.Çıkış sebebi için çok kabaca, daha önceden çokca yapılan hataları yapmamak projenin önünü teknik olarak daha net görebilmektir diyebiliriz.Aslında işin sanatsal kısmıda vardır.Sonuçta ileri OOP kavramları kullanılarak tasarlandığından dile hakim olduğunuz hissine kapılmanızı sağlar.Bu bir yazarın yazı yazacağı dildeki ustalıklara hakimiyetinin çokluğuyla , o dille bir o kadar profesyonel yazı yazabilme  ihtimali arasında ki mantıkla paralellik gösterir..

 

Erich Gamma , Ralph Johnson , John Vlissides ve Richard Helm tarafından ortaya atılan 23 tasarım desenini bulunmaktadır.Yukarıda ismini verdiğim yazarların bu konuda yayımlanmış “Design Patterns : Elements of Reusable Object Oriented Software” adlı kitabını göz atmanızı büyük bir içtenlikle öneriyorum.Ayrıca bu 4’lü yü internette google’ladığınız da GOF kelimesinin sıklıkla geçtiğini görürsünüz.Bunun sebebi dört silahşörler adıyla anılıyor olmalarıdır.(Gang of Four).23 tasarım deseni kendi içerisinde işlevsellikleri açısından 3 grup altında ele alınıyor.İsterseniz bu grupları kısaca açıklayalım.Bu arada açıklık  getirmemiz gereken önemli bir nokta vardır ki o da tasarım desenlerinin sadece GOF ile sınırlı olmadığıdır.Biz makale dizimizde  GoF üzerinden gideceğiz.

/Makaleler/Resimler/1000001679_resim1.gif bulunamadı!

1.Creational Patterns (Yaratımsal Desenler) : Bu desenler ; uygulamada runtime süreci içerisinde oluşturulması gereken nesneler ve bu nesnelerin belli yapılar (nesne fabrikası,prototip alma..) dahilinde oluşturulmasını öngören toplam 5 desenden oluşur.Kopyala yapıştır uyarla mantığının yıkılıp yerine ortak mantıksal kavramları bir üst level’a çekip alt tarafı ilgili class’a has hale getirme ön plandadır.Bu desenleri bir iki cümleyle özetlemek gerekirse ;

.Abstract Factory : Özellikle üretimle ilgili tasarımlarda ön plana çıkmaktadır.Siz fabrika ve ürün grubu gibi ilişkileri  bir kez tanımlarsınız (ki bu yapısal programlamada göre belki daha az vakit alır ama büyük tasarımlar söz konusu olduğunda kaçınılmazdır..)Burda önemli olan yapısal olarak birbirine  benzeyen ürünleri ortak bir ara katman üzerinden yönetilebilmesini sağlamaktır.Bu sayede çok daha esnek ve bakımı kolay bir yapı kurmuş olursunuz..Şayet nesne üretiminde if case gibi yapılar sıklıkla kullanılıyorsa abstract factory tasarım desenini “kurcalama!” vakti gelmiş demektir J Bu desenin temelinde 5 temel unsur bulunur.Bunlar Abstract Factory, ConcreteFactory,AbstractProduct,Product ve client’dır.

.Builder Factory : Abstract factory deseniyle arasında çok küçük farklıklar bulunan bu desende temel yapı 4 farklı unsurdan oluşur bunlar ; Builder, ConcreteBuilder,Director ve Product’dır.

 

.Factory Method : Nesne yaratımı için kullanılan tek arayüz altında nesnenin nasıl yaratılacağını kalıtım yoluyla alt sınıflara bırakarak, arayüzle nesne yaratım işlevlerini birbirinden ayırır..4 Temel yapı taşı bulunmaktadır Product ,ConcreteProduct,Creator ve Concretor’dür.

.Prototype : Çok fazla kullanılmayan bu desen adından da anlaşılacak üzere kendi üzerinden üretilecek nesneler için prototip görevi üstelenen bir yapı sunmaktadır.3 ana yapıyı barındırır.Bunlar , prototype,concreteprototype ve client’dır.

.Singelton : Belki de en çok kullanılan tasarım desenidir.Varlığın sadece bir kez oluşturulmasını öngören bir mekanizma kurmak istediğimizde bu yapıyı kullanırız.Örneklerimizde sıklıkla değineceğiz.Mesela asp.net’de ki cache objesi singelton pattern’ine güzel bir örnektir.

 

2.Behavioral Patterns (Davranışlar Desenler): Bu desenlerde adındanda anlaşılabileceği gibi yaptıkları iş yönünden bir mantıksal bağ söz konusudur.Modelin tasarımı esnasında analizler sonrası ortaya çıkarılan business rules (iş kuralları) dediğimiz kısım bu desenlerin hangisinin ne zaman kullanılması gerektiği yönünde belirleyici etken olmaktadır.Bu desenler ise  ;

.Chain Of Responsibility Pattern : Adından’da anlaşılabilecek üzere sorumluluk zinciri  tasarım desenidir.Çok basit bir örnek vermek gerekirse exception management için mükemmel bir yapı kurmamızı sağlar.Burda önemli olan zincirin halkalarından aynı anda sadece birinin işlevsellik açısından bizi çözüme götürüyor olmasıdır.3 ana yapıdan oluşur.Handler, ConcreteHandler ve Client’dır.

.Command : Sık kullanılan tasarım desenlerinden biri olan command deseni aslında çoğu zaman farkında olmadan kullandığımız bir yapıyı içerisinde barındırır.Çok basit bir örnek olarak hesap makinesinin biraz daha gelişmiş halini örnek verebiliriz.2 değeri toplamak için siz + tuşuna basarsınız.ve yazılım onun toplama işlemi istendiğini anlar ve verilen değeri toplar.Geri al ve ileri al ya da istenilen işlem noktasına gitme gibi süreçlerde internal olarak bu sistemin içinde saklanır.Temel olarak 5 unsurdan oluşur.Bunlar  command,ConcreteCommand,Client,invoker ve Receiver’dır.

.Interpreter : Adından da anlaşılacağı üzere  verilen context üzerinde belirtilen kurallar dahilinde yorum yaparak sonuca ulaşmamızı sağlayan desendir.Toplam 5 yapı taşı bulunur bunlar Abstract Expression , Terminal Expression ,Nonterminal Expression , Context  ve Client’dır.

.Mediator : Bu tasarım deseni için verilebilecek en güzel örnek olsa olsa chat odalarının yapısıdır denilebilir.Sağladığı özgün yöntemle anlaşılabilirliği ve yönetimi oldukça açık olan bu desen  3 ana yapıdan oluşur bunlar mediator , Concretemediator ve Colleague classes’dır.

.Memento : Nesnelerin o anki durumlarını saklamamıza izin verip daha sonra tekrar istediğimiz gibi kullanmamızı sağlayan basit ama etkili bir çözüm sunar bu desen bizlere.Amaç state’i başka bir yardımcı nesnede  saklamak ve istendiğinde geri alabilmektir.3 ana yapıdan oluşur.Memento , Originator ve caretaker’dır.

.Observer : Çok sık kullanılan desenlerden biridir.Basit bir örnek vermek gerekirse tanımlı olan nesnenin belirli bir property’si değiştiğinde daha önceden bu değişimden haberdar olmak isteyen diğer istemcileri haberdar edebilen bir yapı sunar.Çok işlevseldir.Ana bileşenleri , subject , concrete subject,observer ve concreteObserver’dir.

.State : Adından da anşalıcağı üzere  uygulandığı ve aralarında yapısal olarak benzerlik bulunan değişik nesne örneklerinin durum bilgilerine göre farklı ama standardize edilmiş davranışlar içerisine girmesini sağlayan bir yapı sunmaktadır.Context,state ve concrate state temel unsurlarından oluşur..

.Template Method : Yapının çıkarılmasında sıralı çalışacak olan mekanizmaların ortaya konulabileceği bir desendir.Anlatması inanin benim içinde zor ama kodla gösterdiğim takdir çok daha anlaşıbileceğine inaniyorum.Oldukca basit bir yapısı vardır.Abstract class ve concrete class’dan oluşur.

.Visitor : Aynı yapının farklı ama yapısal olarak birebir benzerlik gösteren değişik nesne örneklerine farklı tutumlar içerisine girmesi durumunda çözüme yardımcı olan bir desendir.Örneğin bir oteliniz var ve gelen müşteri öğrenci ise ve 14 günlük bir paket alıyorsa 2 gün bizden yok normal bir müşteri ise ve 14 alıyorsa 2 akşam alakart restaurant bedava gibi düşünebilirsiniz.Sonuçta müşteri müşteridir içeride değişmez.Sizi içeri girdikten sonra toplam müşteri sayısı ilgilendirir.Visitor ,ConcreteVisitor, Element, ConcreteElement,ObjectStucture yapısını oluşturan ana elementlerdir.

 

3.Structural Pattern (Yapısal Desenler) : Bu grupta yer alan tasarım desenleri birbirinden farklı olan nesneler arasında ki ilişkileri tanımlar niteliktedir.Bu desenler ;

.Adapter  : Bu tasarım deseni aslında N olasılık için yazacağımız N-1 adet if’den bir çırpıda kurtulmamızı sağlayan müthiş bir yapı bizlere sunmaktadır.Siz bridge olan nesneden örneğinizi alır ve ona istediğiniz (yapısal olarak paralellik gösteren ) nesne tipini söylersiniz o bunu client’dan bağımsız olarak sarmalar ve kullanımınıza hazır hale getirir.4 temel taşı vardır.Target , Adapter , Adaptee ve client’dır.

.Composite : Kompleks yapılarda birden fazla yapının bir araya gelmesiyle oluşan ve recursive ağaçların oluşturulmasında kullanılan yardımcı desendir.Component  ,Leaf,Composite ve client’dan oluşur.

.Decorator : Verilen nesne tipine göre nasıl bir yapıda işleme devam edeceğini  bilen bir meka nizma bizlere sunmaktadır.Component , ConcreteComponent, Decorator , ConcreteDecorator yapılarından oluşmaktadır.

.Bridge : Bu yapı kendi içerisinde başka bir yapının daha oluşturulmasına izin veren ve bu iç yapının değişikliğe uğramasıyla client’ların hiç bir şekilde etkilenmemesini garanti altına alan bir yapı bizlere sunmaktadır.Abstraction , RefinedAbstraction,Implementor ve ConcreteImplementor yapı taşlarından oluşur.

.Façade : Var olan kompleks bir sistemin fonksiyonalitesinin soyutlanarak bir üst katmanda bir çatı halinde toplanmasıdır.Aslında farkında olmadan bir çok yerde bu yapıyı kullanırız.Façade alt katmanlarla birebir bağlı olmayıp var olan sisteme yeni bir fonksiyonellik katmayı ön planda tutar.Facade ve Subsystem classes yapı taşlarından oluşur.

.FlyWeigth : Çok az kullanıldığını düşündüğüm fakat gerçekten de işe yarayan bir mekanizma kurabilmenize izin verecek etkili bir tasarım kalıbıdır.Factory class’inda bulunan internal collection sayesinde küçük çaplı kümelerin işlevsellikleri için tekrar tekrar aynı işlemi yapmak için instance alması yerine var olan aynısının yapacağı işi collectiondan alarak hızlı bir çözüm üretmemize olanak verir.Çok basit olarak karakter’lerin ekran üzerinde çizimini düşünün..Hepsinin nasıl çıkacağına dair bilgi mevcut olsun.”Akademisyen” kelimesinde ki 2. “e” harfi için var olan bilgilerin collection’dan alınıp direkt olarak işlemin gerçekleşmesi durumudur.Flyweight , concreteFlyWeight,UnsharedConcreteFlyweight,FlyweightFactory,Client  yapıtaşlarından oluşur.

.Proxy : En sık kullanılan tasarım desenlerinden biridir.Özellikle remoting’de kullanılmaktadır.Farklı bir uygulama domain’ininde yer alan nesnenin kontrolü proxy’de tanımlanan yapıyla sağlanmaktadır. Proxy , subject ve Realsubject kısımlarından oluşur.

 

 

Bu makalemizde kısaca OOP ve tasarım desenlerine giriş yaptık.Bir sonra ki makalemiz de Creational Patterns’den Abstract Factory’i inceliyor olacağız..İlerleyen makalelerimiz de görüşmek üzere...

Kaynakça : MSDN,Data & Object Factory.

 

Eralp Erat

MVP – Mobile Devices

MCP,MCAD.NET,MCSD.NET

http://www.eralperat.com

HIMS