The Good, The Bad, The Singleton

ÜNOG
ÜNOG
Published in
3 min readDec 24, 2020

Artısı ve eksisi ile Singleton, ve yerine kullanabileceğimiz yöntemler.

ÜNOG’a Katıl Bültenimize Abone OlGeçmiş Yayınlarımızı Oku

Geçen haftalarda Oyun Programlama Kalıpları serimizin son üyesi olan Singleton programlama kalıbını değerlendirdik. Singleton nedir hatırlatalım: Bir sınıfı Singleton olarak yapmak bu sınıfın sadece tek bir nesnesi (instance) olduğunu garantiler, ve o nesneye global erişim sağlar.

Geçtiğimiz makalemizde her ne kadar Singleton kalıbının ne olduğundan bahsetsek de, kullanılmalı mı, kaçınılmalı mı üzerinde fazla durmadık.

Bu makalemizde ise konu ile ilgili iyisi ile, kötüsü ile bir çok kaynak topladık ki Singleton kullanımı ile ilgili kendi projenize uygun karara varabilesiniz. Vaktiniz olduğunda bu kaynakları derinine incelemenizi öneririz, minik detaylar önemli çünkü! Uzatmadan başlayalım.

The Good — Singleton’un Artıları

Açıkcası Singleton programlama kalıbının problemsiz olduğunu savunan tecrübeli bir mühendis bulmak çok zor. Onun yerine Singleton programlama kalıbının artılarının (genellikle programlama ivmesinin) eksilerinden fazla olduğunu savunuluyor. Bunu savunanlardan biri de Blizzard Entertainment!

Bu konuşmada Overwatch oyununda nasıl Singleton kullandıklarını ve sıkıntılı yönlerini nasıl çözdüklerini anlatıyorlar.

Biraz daha küçük boyuttaki, bizim de yapabileceğimiz oyunlarda Singleton kullanımına göz atmak istersek Zarvot oyununu inceleyebiliriz.

Bu videoda Singleton patternın nasıl abartılıp ama sonunda piyasaya sürülen bir oyun yapabileceğinden bahsediliyor.

Bu iki videoda daSingleton kalıbını kullanılarak başarılı olan oyunlardan bahsediliyor. Ama her Singleton başarısı bir çok da problemi gizleyebiliyor.

The Bad — Singleton’un Sıkıntıları

Singleton kullanmanın problemlerini size kısaca hatırlatalım:

  1. Global değişkenler kodda oluşan problemleri çözmeyi zorlaştırır.
  2. Paralelleştirme dostu değillerdir.

Ama tabi ki gerçek hayatta problemler burada sınırlı kalmıyor.

Infallible Code oyun programlaması konusunda en saygı saygı duyduğumuz kaynaklardan bir tanesi. Bu videolarında Singleton Pattern’ın oyun geliştirme temposuna neden uygun olmadığını inceliyorlar. Özellikle Singleton kullanmanın uzun vadede kodunuzu değiştirmeyi, kodu daha bağlı yaparak nasıl zorlaştırdığını açıklıyorlar.

Tabi ki Singleton kalıbının problematik olması oyun geliştirmesine veya C#’a özgü değil. Bu konuşmada ise Singleton programlama kalıbının C++ yönünden problemlerini değerlendiriyorlar.

Bu kaynakları incelerseniz göreceğiniz şey Singleton kullanıldığında uzun vadede başımızın ağrıma şansı yüksek. Peki o zaman Singleton yerine önerimiz nedir?

The Ugly — Peki ya ne kullanmalı?

Eğer Singleton kullanmayı kafaya koyduysanız onun yerine ServiceLocater kalıbını kullanmanızı öneriyoruz. Yapmanız gereken çok basit bir değişiklik. Diyelim bir AudioManager’ınız var.

AudioManager.Instance;

Audio Manager’i direkt olarak Singleton şeklinde yazmak yerine, diğer tüm servisleri — yani normalde Singleton olarak yazacağınız sistemleri — bulmak ile yükümlü ServiceLocator adında tek bir Singleton yazıyorsunuz.

ServiceLocator.Get<AudioManager>();

Bu değişiklik ile AudioManager’ı kodunuzun diğer parçalarından decouple etmiş oluyorsunuz. Farklı farklı problematik Singletonlar yaratmak yerine diğer servisleri bulmak için kullandığınız tek bir problematic Singleton yaratıyorsunuz. Bu yaklaşım iyi demiyoruz, ama daha iyi diyoruz.

Daha derine girmek isterseniz de detaylarını bu video da bulabilirsiniz.

Peki ya ben Singleton kullanmadan oynumu yapmak istiyorum derseniz? Tabi ki her problemi çözebilecek bir mükemmel kalıp yok… Onun yerine size bir örnek göstermek istiyoruz.

Bu Unity dev log’unda ScriptleableObjectler ile Singleton kullanmadan nasıl bir decoupled mimari yazabileceğimizi bir örnek oyun üzerinden anlatıyorlar.

Umarım artık Singleton kalıbının artıları ve eksileri ile ilgili daha çok bilginiz vardır. Eğer Singleton gibi konularda söylecekleriniz var ise sizi Discord sunucumuzda #kod-mimarisi kanalına bekliyoruz. Bu makale için bulduğumuz bir fikir kanaldaki tartışmalardan ortaya çıktı. Özellikle Sercan Altun’a ServiceLocator kalıbını paylaştığı için teşekkür ediyoruz.

Eğer kod kalitenizi yükseltmeye devam etmek istiyorsanız size Oyun Programlama Kalıpları serimizin devamını öneririz.

  1. Command: Farklı input sistemleri kullanabilmek için.
  2. Flyweight: Memory problemlerini çözmek için.
  3. Observer: Mimarinizi daha esnek yapabilmek için.
  4. Prototype: Daha az kod yazarak OOP kullanmak için.
  5. Singleton: Hmm.
  6. State: Daha komplike controllerlar yazabilmek için.

Sizlerle bir sonraki makalede görüşmek üzere!

Yazar: Batu Aytemiz

ÜNOG’a Katıl Bültenimize Abone OlGeçmiş Yayınlarımızı Oku

--

--

ÜNOG
ÜNOG
Editor for

Türkiye’nin en güzel oyun geliştirme topluluğu. https://unog.dev