Nesneye dayalı programlamanın, en önemli unsurlarından birisi belki de yazılımları, soyut bir kavram olmaktan çıkarıp,insanların daha rahat anlayabileceği bir hale getirmesidir.Hali hazırda OOP (Nesneye Dayalı Programlama – Object Oriented Programming) konu anlatımlarında, kalıtımı (inheritance) anlayama çalışırken, sizde hep şu şekilde örneklerle karşılaşmasınızdır.Örnek olarak bir canlı sınıfı, canlı sınıfından kalıtım alan insan, hayvan, bitki sınıfları, hayvanların kendi arasında türlere ve haliyle başka sınıflara kalıtım vermesi şeklindeki örnekler uzar gider.İşte insan sınıfında oluşturulan bir nesne örneği de (instance) aslında beni,sizi temsil etmektedir.İşte tam bu noktada, gerçek hayatla ile soyut yazılım arasındaki benzerlik, OOP’nin varlığıyla ortaya çıkmaktadır.
 
Peki tasarım desenlerini gerçek hayattaki örnekler ile açıklamaya nasıl çalışırız ?
 
Çok basit bir örnekle, akşam’a yemek için misafirlerinizin geleceğini ve zengin bir menü hazırlamanız gerektiğini düşünün :)  Menüye dahil ettiğiniz yemeklerin 3 tanesi için salça kullanacaksınız diyelim.Siz olsanız her yemek için ayrı bir kavanoz salçamı açarsınız ? Yoksa bir tane açıp, 3 yemek içinde mi kullanırsınız ? İki şekilde yapmak da mümkün değil mi ? Peki her yemek için yeni bir kavanoz salça açsanız, her kavanozu buzdolabında saklamak gereksiz olmazmıydı ? Bu aslında hayata dair bir pratik olarak düşünülebilinir.Bu pratikler yaşayarak, tecrübeyle ya da başkalarının tecrübelerinden ortaya çıkan şeylerdir.
 
O zaman tasarım desenleri de, yazılım için uygulanan, bir tasarım problemini, en basit ve efektif olarak çözüme ulaştıran, kullanılabilirliği kabul de görmüş yazılım yöntemleridir diyebiliriz.
 
Peki bu tasarım desenlerini kim ortaya çıkardı ?
 
Tasarım desenleri yukarıda da bahsettiğim gibi, basit ve efektif çözüm yöntemleri, başka bir deyişle de yapılacak iş için en uygun yoğurt yeme şeklidir. Yani her yazılımcının kendi efektif çözümü, onun için bir tasarım kalıbıdır aslında. Ama yazılım dünyasında şu anda en çok bilinen tasarım desenlerinin ortaya çıkışı 1994 yılına dayanmaktadır. Yazılımla uğraşan GOF(Gang of Four) yani 4′lü çete olarak da bilinen 4 kişi, 1994 yılında kafa kafaya verip,Tasarım Örüntüleri : Tekrar kullanılabilir nesneye yönelik yazılım temelleri adında bir kitap çıkarmışlar ve tasarım desenlerinin yazılımda kullanılması konusunda bir dönüm noktası oluşturmuşlardır.GOF’un ve tasarım desenlerinin detaylı hikayesini buradan okuyabilirsiniz. Bende bu noktadan sonra dilim döndüğü sürece tasarım desenlerini, örneklerle bir yazı dizisi halinde açıklamaya çalışacağım.
 
En çok kabul gören bu desenler içindeki ilk desen Singleton Desing Pattern.Singleton tasarım deseninin yapısı,aslında gerçek hayatta kurguladığınızda yukarıda verdiğim 3 ana yemek ve 3 kavanoz salça örneğine benziyor.Bir sınıfa ait bir nesneye mi ihtiyacınız var ? Yoksa bir defa oluşturun, eğer daha öncesinde oluşturulmuşsa ve aynı nesne örneğine ihtiyacınız varsa da bir daha oluşturmanıza gerek yok,bu nesneyi herkes tarafından ulaşılabilir yapın,ihtiyacı olan da kullansın prensibine dayanıyor.Kullanacağımız nesne örneğini statik ve herkes tarafından erişilebilir düzeyde tanımlarsak ve ilgili sınıfın varsayılan yapıcı methodunu (default constructor) private olarak tanımlarsak, varsayılan sınıf örneğinin new anahtar sözcüğüyle herkes tarafından sürekli oluşturulmasını engelleyebilmiş oluruz.Aşağıdaki örnek, SingletonClass ve Non-Singleton adında iki adet sınıf içeren bir projeye ait.
 
public class SingletonClass
    {
        private SingletonClass()
        {
        }

        private static SingletonClass _instance;

        public static SingletonClass Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new SingletonClass();
                }

                return _instance;
            }
        }
    }

  public class Non_SingletonClass
    {
        public Non_SingletonClass()
        { }
    }
Singleton sınıfının, kendi tipinde, Instance isminde iki tane statik üyesi mevcut. Bu üyeler bizim ilgili sınıfımız’ın instance’ına ulaşmamızı sağlayacak olan sınıf üyelerimiz.Bununla beraber sınıfın varsayılan yapıcı methodu da dışarıdan erişilemez durumda ve new anahtar sözcüğüyle başka bir yerden tekrar örneklenmesi kısıtlanmıştır.Non-Singleton sınıfı ise, içi boş ve varsayılan kurucu methodu public olarak tanımlanmıştır.Yani bu sınıftan new diyerek istediğimiz yerde instance oluşturabilmemiz mümkündür.
 
static void Main(string[] args)
        {
            SingletonClass slc1 = SingletonClass.Instance;
            Console.WriteLine("1. Singleton nesne örneğinin Hash Kodu : " + slc1.GetHashCode().ToString());

            SingletonClass slc2 = SingletonClass.Instance;
            Console.WriteLine("2. Singleton nesne örneğinin Hash Kodu : " + slc2.GetHashCode().ToString());

            Non_SingletonClass nslc1 = new Non_SingletonClass();
            Console.WriteLine("1. Singleton olmayan nesne örneğinin Hash Kodu : " + nslc1.GetHashCode().ToString());

            Non_SingletonClass nslc2 = new Non_SingletonClass();
            Console.WriteLine("2. Singleton olmayan nesne örneğinin Hash Kodu : " + nslc2.GetHashCode().ToString());

            Console.ReadLine();

        } 
Bir Main methodu içinde, bu iki sınıftan nesneler oluşturmaya çalışalım.SingletonClass için new anahtar sözcüğüyle sınıf örneği oluşturamadığımızdan dolayı, sınıfın bize verdiği public Instance üyesini kullanarak sınıf örneğine erişim sağlayabiliriz. Non-Singleton sınıfı içinse 2 adet nesne örneği tanımlaması yapıyoruz. Sonrasında bu nesnelere ait HashCode’ları, GetHashCode() methodu ile çağırıyoruz. GetHashCode() methodu, kısaca oluşturulan her nesne için bir integer değer üretir ve HashTable ya da Dictionary gibi tipler, bu HashCode’a göre sıralanır.Programı çalıştırdığımız da SingletonClass sınıfından oluşan nesne örneklerinin aynı hashCode’a sahip olduğunu, Non-Singleton sınıfından oluşan nesne örneklerinin ise farklı hashCode’a sahip olduklarını,haliyle de farklı nesne örnekleri olduğunu söyleyebiliriz.
 
Singleton tasarım deseni, yazılım projelerinde, tek nesne örneğine ihtiyaç duyulan her alanda kullanılabilinir.Örneğin veritabanı bağlantı nesnelerinde, log ya da caching sınıflarında,kısaacası tek nesnenin herkesin ihtiyacını karşılayacağı her durumda kullanılabilinir.
 
Örnek kodları buradan indirebilirsiniz.Başka bir yazıda görüşmek üzere…
Bu Yazıyı Başkalarıyla Paylaş... Share on FacebookTweet about this on TwitterShare on LinkedInShare on Google+Pin on PinterestShare on TumblrEmail this to someone

Yorum Yapın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>