nasıl oluyor da ‘oluyor’ ?

‘Singleton’ tasarım deseni

7 Kasım, 2006 · 7 Yorumlar

Tasarım desenleri, güzel şeylerdir. Örneğin:

Uygulamanın her yerinden tek bir nesneye ulaşmak istediğinizde, ne yaparsınız?

Geleneksel yöntemle ‘Global‘ bir değişken tanımlayabilirsiniz. Ama bunun tasarım açısından kötü etkileri vardır, ve modern nesne temelli dillerde (c#, java, …) uygulanamazlar. (bu dillerde global kavramı yoktur)

Bir sınıfı ‘static‘ olarak işaretleyebilirsiniz, ama bu da büyük ihtimalle tam olarak istediğiniz şey olmayacaktır. Örneğin static sınıfların constructor‘ları normal nesnelerinkinden farklı çalışırlar. Bir çok yönden de static bir sınıf tanımlamak sizi kısıtlayacaktır.

‘Tasarım desenleri’nin en iyi yönü budur. Birileri bunun en verimli çözümünü bulmuş, ve literatüre geçirmiş.

Öncelikle, her yerden erişmek istediğiniz nesnenizin MyObject olduğunu varsayalım. (örnek kod c#)

class MyObject { public string MyValue; }

nesnenize erişmek için, başka bir sınıf daha tanımlıyorsunuz:

class MyObjectSingleton
{
private static MyObject _myOnlyObject;
public static MyObject GetInstance() {
if ( _myOnlyObject == null ) _myOnlyObject = new MyObject();
return _myOnlyObject;
}
}

Özetle, GetInstance() metodu ilk çağrıldığında(ilk ihtiyaç olduğunda), MyObject nesnesinden sadece bir tane yaratıyor ve _myOnlyObject static üyesinde tutuyoruz. GetInstance() metodunun daha sonraki çağrılarında yenisini yaratmadan, aynı MyObject nesnesini gönderiyoruz.

Önemli bir nokta, _myOnlyObject üyesinin private olması. Eğer bu üyeye dışarıdan erişime izin verseydik, daha biz onu initialize etmeden birileri erişmek isteyebilirdi. (Null reference exception :) )

Bu arada, şu ‘mecbur olana kadar nesneyi oluşturmama’ işine ‘lazy initializing‘, tersine de ‘early initializing’ diyor büyüklerimiz :)

Birileri delphi‘de singleton yazarken TObject.NewInstance metodunu override ediyormuş. Bunlar saman altından su yürüten, sinsi hareketler. Sahalarda görmek istemediğimiz davranışlardan . :)

Başka bir yönden, tasarım desenleri sadece sorunun nasıl çözüleceğine dair yöntem sunarlar. Geliştirme şekli, büyük oranda programcıya/tasarımcıya bağlıdır.  Örneğin c#’ta şu da bir singleton örneğidir:

class MyObject
{
public string MyValue;
private MyObject {} // private constructor
private static MyObject _instance;
public static MyObject Instance
{
if (_instance==null) _instance = new MyObject();
return _instance;
}
}

Kategoriler: .NET · Design Patterns · Güzel şeyler · Programlama

7 cevap so far ↓

  • Sinemaki_33 // 7 Kasım, 2006 22:32 | Yanıtla

    Hep yalan hep dolan :) )) Sen değil miydin tüm değişkenleri global yapan ve bunu savnan. Ben yazılım dünyasında yeni bir ekol başlatacağım diyen. Global pesoz akımını :) )))))))

    Hey arkadaşım çok yaşa sen Dr.Dobidik’de yazmaya layıksın böyle blog köşelerinde çürüyecek adam mıydın beaaa :) ))

  • Görkem PAÇACI // 7 Kasım, 2006 22:39 | Yanıtla

    dalga geçme corç :) sen de yaz okuyalım. global mühendisi seni… :)
    mandrive glx’i sahiplenmiş, işi götürüyor. buna bir el at bakalım ?

  • Sinemaki_33 // 7 Kasım, 2006 22:43 | Yanıtla

    buldun G noktasını :) ) valla bir zamanlar yapıyorduk biliyorsun. sonra birlikte FM tarzı birşeyler yapalım dedik ama yatıyor daha. Bakalım hayırlısı. Benim blogda yatıyor bu topraklarda biliyorsun. Ellenmemiş, bakir :) ) http://monolit.wordpress.com/ bi halt yapmama rağmen 169 hit almış. artık yanlışıkla mı nedir kimbilir :)

  • Görkem PAÇACI // 7 Kasım, 2006 22:46 | Yanıtla

    ah şu spam botları da olması hit alacağımız yok :) )

  • Sinemaki_33 // 7 Kasım, 2006 22:49 | Yanıtla

    Sende mi kardeş. Vay be. Ben de kendimi çok yalnız hissediyordum. İnsan klamdı zaten hep makine peh.

  • Görkem PAÇACI // 7 Kasım, 2006 22:53 | Yanıtla

    :) kendi sitemde tutarken her gün en az 10 tane spam comment geliyordu. başedemiyordum. umarım wordpress salmıyordur spam’leri, yoksa hayallerim yıkılır :)

  • Sinemaki_33 // 7 Kasım, 2006 22:55 | Yanıtla

    Geçmiş olsun kardeş. Salmıyormuş bu wordpress. Baya sıkıymış. Öyle diyorlar ya bakalım hayırlısı. Zaman gösterecek artık.

Yorum Yapın