25 Aralık 2012 Salı

Design Patterns - Decorator Pattern

Merhaba arkadaşlar,

Sizlerle beraber yaptığımız tasarım desenleri derslerimizin bugünkü konusu en çok bayanların hoşuna gideceğini düşünüyorum :). Bugün dekorasyon tasarım desenini anlatmaya çalışacağız.

Dekorasyon konumuza girmeden önce en son yazdığımız yazının kısa bir özetini geçelim. En son yazımızda singleton tasarım deseninden bahsetmiştik. Singleton tasarım deseni ile şunları yapmayı hedefliyoruz:
  • Bir uygulamanın yaşamı boyunca kullandığı bir sınıfın örneğinin tekil olunmasının istenmesi
  • İstenilen bu örneğin uygulamanın her noktasından erişiminin sağlanması
Singleton tasarım deseni en basit tasarım deseni olarak gözükmesinin nedeni az kod yazılması ve konunun anlaşılırlığının basit olmasından kaynaklanıyor.

Konumuza gelicek olursak dekorasyon kelimesi dilimize fransızcadan geçmiştir. Fransızca da décoration olarak geçmektedir. Dekor etme, süsleme gibi anlamı vardır.


Yukarıda gösterilen güzel araba konumuza çok güzel örnek olacağını düşünüyorum :).

Bizim yapımız da ise nesneleri süslenmesi ve yeni özelliklerinin eklenmesi gibi düşünebilirsiniz. Yukarıda gösterilen şahin arabamızı da(emin değilim doğan da olabilir :) ) süsleme işlemini yapacağız.

Dekorasyon tasarımımız da 4 adet nesne tipi olacaktır. Bunlar aşağıdaki gibidir:

  • Component: Dinamik olarak sorumluluklar ekleyebileceğimiz sınıfa sunulan arayüz veya abstract sınıftır.
  • ConcreteComponent: Sorumluluk ekleyeceğimiz asıl nesnemizdir
  • Decorator: Dekorasyon işlemlerinden sorumlu, değişik dekorasyon şekillerinin üst sınıfıdır. Değişik dekorasyon şekillerini desteklemek için abstract class veya interface olarak tasarlanır.
  • ConcreteDecorator: Dekorasyon işleminin özelliğini barındıran asıl nesnelerdir.
Şimdi konumuzu anlatan uml diagramımıza bir bakalım.


Şimdi ne yaptığımıza bir bakalım. Öncelikle dekorasyonu uygalayacağımız sınıf olan Sahin isimli sınıfımızı görüyorsunuzdur. Sahin nesnemizin özelliklerini dinamik olarak değiştirmek için abstract classtan türettik.

Sahin arabamıza yeni özellikler katacağımız CarDecorator sınıfımızın uml diagramına baktığımızda Car sınıfından türetilmiş ve içinde car sınıfının örneğini barındırdığını görüyoruz. Buradaki amaç modifiye edilmek istenilen aracın dekorasyon sınıfı tarafından sarmalanıp yeni özellikleri de bu sınıftan türeyen dekorasyon sınıflarına bırakılmasıdır.

Biz kapıları geriye doğru açılan bir modifiye olmasını istedik. Bunun için CarDecorator sınıfımızdan SuicideDoorDecorator sınıfını türetti ve yeni özellikler ekledik. Uygulamamızın kodları da aşağıdaki gibi olacaktır.

Uygulamanın Başlangıç Sınıfı
Base Sınıf

Dekorasyonların dinamik olarak uygulanması için türetilen sınıftır.

Sahin arabamız :)
Dekorasyon uygulanacak sınıfımız.


Dekorasyon işlemlerine base olacak sınıfımız.


ve gün sonunda olacak kapı dekorasyon sınıfımız yukarıdaki gibidir.

Kodlara baktığımız zaman, dekorasyon tasarım deseninin amacının nesneye yeni özellikler katmak olduğunu anlayabiliriz.

Bir yazımızın daha sonuna geldik. Bir sonraki yazımız da görüşmek üzere....


19 Aralık 2012 Çarşamba

Design Patterns - Singleton Pattern

Merhaba arkadaşlar,




Uzun bir zamanın ardından yeniden sizlerle birlikte yeni bir konu üzerinde konuşacağız. Blog ile aramın soğumasını önlemek için bugün sıcak bir güneş resmi ile başlangıç yapmak istedim(Anlatacağım konu da da güneşi örnek vericem :Pp).
 
Bir şeyler yapıcaz dedik ama aslında yaptığımız başka insanların yapmış olduğu çalışmaları öğrenmek olacak. Nereden bakarsak bakalım çok hoş olmamakla beraber şu an için elin gavurunun bilgisi bizimkinden önde gidiyor. Öyle kibir yapıpta yok ben öğrenmem, yok ben bilmem deyipte saçma sapan kendini beğenmişlik egosuna girmenin alemi yok gardaşım.
 
Biraz daha muhabbet edelim sonra konumuza başlarız inş. (Direk konuya girmek isteyen kırmızı renkli arkadaşlarımı aşağıdan başlamalarını tavsiye ediyorum :Pp Diğer renkler okumaya devam edebilir :))
 
Uzun bir ara oldu dedik. Nedenini kısaca şöyle bahsetmek gerekirse çalıştığım iş yerindeki organizasyonel değişiklikten dolayı başka bir birime geçiş yaptım. İyi mi oldu kötü mü oldu bilmiyorum ama ileriki dönemlerde daha çok yeni şey öğreneceğimi düşünüyorum inş.  "Tebdil-i mekanda ferahlık vardır" diye bir sözümüzü düşündükçe, bu değişiklikte beni motive ediyor.
 
Günümüz de iş yaşamı boyunca ortalam 10 iş değişikliğinin 2 sini farklı kurum birini kurum içi yaparak 3,5 sene içinde 3 değişiklik sayısına ulaştım. Kalan ömrümüz de ne yaparız bilmiyorum ama hakkımız da en hayırlısı olur inş.
 
Velhasıl hayat devam ediyor ve biz bugün kaldığımız yerden devam etmemiz gerekiyor. 
 
Bugünkü konumuz, tasarım desenlerinin en kolayı ama en güzeli (bana göre :P ) olan singleton tasarım desenini incelemeye çalışacağız.
 
Not: Diğer yazılarımızın başında bir önceki yazımızın özetini yazıyorduk. Uzun bir ara olduğu için özet yerine okumanızı tavsiye ediyorum :)
 .
Singleton kelimesi, tek, tekil gibi anlamlara geldiğini düşünüyorum inş. öyledir :) Singleton tasarım deseninin amacı bir uygulamanın ömrü boyunca belirli bir nesneden sadece bir tane olmasını garanti etmek ve buna her yerden erişimi sağlamaktır.
 
Tanımdan anladığınız gibi konu kulağa çok hoş geliyor. Belli bir sınıfımın örneğini uygulama boyunca sadece 1 kere oluşturulmasını sağlamak amacımız.
 
Giriş cümlem de yazdığım gibi benim uygulamam da bunu güneş ile anlatıcam. Bildiğiniz gibi güneş dünyanın hacminden 1,4122×1027 m³  kadar büyük, çekirdek sıcaklığı ~15,7×106 K   olan bir yıldızdır (O nasıl bir sıcaklıktır :| dini konulara girerdim ama konudan sapmayalım :Pp ). Detaylı bilgi için vikipediye bakabilirsiniz. 
 
Güneş samanyolu galaksisindeki herhangi yıldızdan bir tanedir. Güneşin uygulamamız da temsili olarak göstermek istersek heralde iki tane olması mantıklı gelmez (farklı güneşlerden bahsetmiyoruz bizim güneşimizden bahsediyoruz arada bir iki güzel arkadaşım bana göz kırpıyor gibi :)).
 
Biz de uygulamamız da güneşin kullanılmasını singleton tasarım deseni ile anlatmaya çalışacağız.
 
Yukarıda bahsettiğimiz gibi güneş sınıfından bir örneği uygulama boyunca tek olmasını ve her yerden erişimini sağlayacağız.
 
Multithread kullanılmayan sistemler için aşağıdaki birinci versiyonu inceleyelim.



Yukarıdaki kod bloğunu incelediğimiz de Sun sınıfının constructor metodunun private olduğunu görürüz. Bunun amacı Sun nesnesinin oluşturulmasını dışarıya açmamaktır. Dışarıya açtığımız da zaten nesneden birden çok üretilmesi anlamına gelir.
 
Private olarak tanımlanmış bir diğer alan da ise uygulama boyunca tekil olacak nesnemizin kendisi tutulur.
 
Sınıftan örnek istenildiğinde (GetSun methodu) _sun alanında tuttuğu değer null ise yeni bir örnek oluşturulak bu alana atanır. Daha önce oluşturulmuş ise alan da tutulan değer geri gönderilir.
 
Multithread uygulamalarımız da if bloğunu aynı anda iki farklı thread geçebileceği için birden çok nesnenin ortada gezmesine olanak sağlamış oluruz. Bu gibi durumlar da aşağıdaki kod bloğunu kullanibiliriz.

 
Yukarıdaki kod bloğumuzun ilkinden farklı olarak göze çarpan özelliği lock deyimi ve double check kontrolüdür. Lock deyimi aynı anda birden çok threadin bir kod bloğuna girmesini engeller. Double check ise şöyle açıklayabiliriz.
  • İki thread aynı anda ilk if bloğuna geldi ve ikisi de alanın değeri olmadığı için içeri giriş yaptı (Matrix aklıma geldi birden :)).
  • Bunlardan sadece birini lock bloğunun içerisine alındı.
  • İkinci if bloğunda _sun alanın değeri olmadığı için birinci öncelikli thread içeri girerek nesneyi oluşturdu. İşini bitirdi gitti.
  • İkinci thread lock bloğunun deaktif olmasından faydalanarak kod bloğunun içerisine girerek ikinci if bloğunda karşılaştırma yaptı. artık dolu olan _sun alanının karşılaştırmasında false değeri alarak oluşturulmuş _sun alanını kullanarak yoluna devam etti.
Dilim döndüğünce (yazarken bu deyim çok saçma oluyor) anlatmaya çalıştım. Kısacası bir nesneniz sizin için sanat güneşi ise :)) onun tek olmasını istiyorsanız bu nesnenin tasarımın da singleton tasarım desenini kullanabilirsiniz.
 
Oh sonuna gelebildik. Özlemişiz birşey yazmayı. Ne derece yazdıysak o derece öğrendiğimiz bu çalışmalar kendi içinde basit gözükse de çalışma hayatının olmazsa olmazı "Öğrendiğini uygulamalısın" prensibine çok güzel birer örnek oluyor.
 
Değerli vaktinizi ayırıp okuma zahmetinde bulunan herkese teşekkür ederim. Bir sonraki yazım da görüşmek üzere arkadaşlar...