Bilmeniz ama kullanmamanız gereken programlama yöntemi.
ÜNOG’a Katıl — Bültenimize Abone Ol — Geçmiş Yayınlarımızı Oku
Haftalarca bu medium postunu yazmayı geçiktirdim… Zaten fazlaca kullanılan Singleton programlama kalıbını daha da yaymak istemedim çünkü yanlış kullanıldığında artıdan çok eksisi olan bir programlama yöntemi. Yine de kullanıldığında işinizi kolaylaştırdığı yerler de yok değil. Bakalım neymiş bu Singleton.
Sınıfın sadece tek bir nesnesi (instance) olduğunu garantile, ve o nesneye global erişim sağla.
Singleton bu tanımdan ibaret. Bu tanımı ikiye bölüp ayrı ayrı inceleyelim:
Sınıfın sadece tek bir nesnesi olduğunu garantile
Bir sınıfın birden fazla nenesi varsa doğru şekilde çalışamayacağı zamanlar vardır. Sık sık karşılaşılan bir örnek herhangi bir sınıfımızın kendi durmunu takip etmek durumunda kalan başka bir sınıfla etkileşime geçmesidir. Ne demek istedik bu karmaşık cümle ile bir örnek ile inceleyelim.
Dosya işlemleri ile ilgilenen bir sınıf yazdığınızı varsayın. Dosya yazma-okuma işlemlerinin tamamlanması biraz zaman alabileceğinden dolayı, genellikle dosya sistemleri işlemleri paralel olarak gerçekleştirir. Bu, birden fazla işlemin aynı anda çalışabileceği anlamına gelir ve bu nedenle paralel işlemlerin birbirleriyle koordineli olmaları gerekir. Mesela bir dosya oluşturmak için bir çağrı başlatırsak ve aynı dosyayı silmek için başka bir çağrı başlatırsak, kodumuzun doğru çalışması için işlemlerin biribirininden haberdar olması gerekir.
Bunu yapmak için dosya sistemi sınıfımızda yapılan her işlemin önceki her işleme erişebilmesi gerekir. Eğer bu sınıfın birden fazla nesnesi (instance) var ise, bir nesle diğer nesnenin başlattığı işlemler hakkında bilgi sahibi olamayabilir ve bu da sorunlara yol açabilir. Singleton kalıbının sunduğu tek nesne zorunluluğu bu problemi çözmeye yarar.
Global erişim sağla
Oyunumzdaki bir çok farklı sistem dosya işlemlerine ihtiyaç duyacaktır: Debugging, içerik yükleme, oyun durumu kaydetme, vb. Bu sistemler dosya sistemi sınıfının kendi nesnelerini oluşturmadan nasıl kullanabilirler?
Singleton kalıbı bu duruma da bir çözüm sunar. Bu kalıp tek nesne oluşturmayı zorulu tutmanın yanı sıra, o nesneye küresel erişimin de yolunu sağlar. Bu şekilde, herhangi bir yerdeki kod sistemimiz o eşsiz singleton nesnemize ulaşabilirler. Basit bir singleton kod örneği bu şekilde gözükebilir:
Singleton programlama kalıbı bu kadar basit. Bu kod ile bahsettiğimiz problemlerin her ikisini de çözüyoruz! Hem sadece bir Singleton nesne olmasını garantiliyoruz, hem de o nesneye static olduğu için kolayca ulaşım sağlıyoruz. Peki ya Singleton kullanmanın sıkıntıları neler?
Singleton Kullanmanın Sıkıntıları
Ne zaman bir singleton yaratırsanız aslında bir global değişken yaratmış olursunuz. Eğer kendi başınıza küçük bir gamejam oyunu yapıyorsanız bu büyük bir problem olmayabilir, ama projeniz büyüdükçe global değişken yaratmanın yarattığı problemler de büyümeye başlar.
Global değişkenler kodda oluşan problemleri çözmeyi zorlaştırır. Artık ne zamn bir fonksiyondaki problemi çözmeye çalışsak, o fonksiyonun yerel problemlerinin yanısıra Global değişkeni de kontrol etmek durumundayız çünkü problem Singletonumuzdan kaynaklanıyor olabilir. Bu da kodun esnekliğini azltıp problemleri çözmeyi zorlaştırır.
Paralelleştirme dostu değiller. Bir çok farklı sistemin ulaşmak istediği tek bir obje var ise, bu objenin kullanımına dikkat edilmesi gerekir. Paralel bir mimaride dikkat edilmezise kilitlenmelere ve race-conditionlara oluşabilir.
Peki sonuçta Singleton kullanmalımıyız? Bu size, takımınıza ve projenizin büyüklüğüne kalmış!
Bu hafta Singleton kalıbının ne olduğunu konuştuk, önümüzdeki hafta ise artıları ve eksileri üzerine biraz daha derine ineceğiz. Ama şimdiden daha da detaya inmek istiyorsanız her zaman ki gibi Game Programming Patterns kitabını öneririz.
Eğer Singleton ile ilgili güçlü görüşleriniz var ise bize ulaşın, önümüzdeki hafta sizin düşüncelerinize de yer verelim!
Yazar: Batu Aytemiz
ÜNOG’a Katıl — Bültenimize Abone Ol — Geçmiş Yayınlarımızı Oku