The Good, The Bad, The Singleton

ÜNOG
ÜNOG
Dec 24, 2020 · 3 min read

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:

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.

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

Türkiyenin en güzel oyun geliştirme grubu. https://unog.dev

ÜNOG

Written by

ÜNOG

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

ÜNOG

ÜNOG

Profesyonel, bağımsız ve hatta öğrenci oyun geliştiricilerinin bir araya geldiği ÜNOG Oyun Geliştirici Topluluğu, bilgi ve tecrübe paylaşımına özendiriyoruz.

ÜNOG

Written by

ÜNOG

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

ÜNOG

ÜNOG

Profesyonel, bağımsız ve hatta öğrenci oyun geliştiricilerinin bir araya geldiği ÜNOG Oyun Geliştirici Topluluğu, bilgi ve tecrübe paylaşımına özendiriyoruz.

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store