Menu
Coddy logo textTech

Singleton Tablosu

Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 63 / 70.

Bazen tüm programınızda bir şeyin tam olarak bir örneğine ihtiyaç duyarsınız: bir yapılandırma yöneticisi, bir günlük kaydı sistemi veya oyun ayarları. Birden fazla kopya oluşturmak sorunlara yol açar: Hangisi doğru verilere sahip? Singleton pattern yalnızca bir örneğin var olmasını sağlar.

Lua'da, modüllerin çalışma biçimi sayesinde Singleton uygulamak şaşırtıcı derecede basittir. Bir modülü require ettiğinde Lua sonucu önbelleğe alır. Sonraki require çağrıları yeni bir tablo yerine önbelleğe alınmış tabloyu döndürür.

-- GameConfig.lua
local GameConfig = {
    volume = 80,
    difficulty = "normal"
}

function GameConfig:setVolume(v)
    self.volume = v
end

return GameConfig

Şimdi, programınızın herhangi bir yerinde:

local config1 = require("GameConfig")
local config2 = require("GameConfig")

config1:setVolume(50)
print(config2.volume)  -- 50 (aynı tablo!)

Hem config1 hem de config2 tamamen aynı tabloya başvurur. Bir değişken üzerinden yapılan değişiklikler diğerinde görünür. Bu, Lua'nın require tarafından döndürülen değeri package.loaded içinde saklayıp yeniden kullanması sayesinde otomatik olarak gerçekleşir.

Yeni nesneler oluşturan Factory deseninin aksine, Singleton tüm uygulamanız genelinde paylaşılan bir durumu garanti eder. Bu, kodunuzun birden fazla bölümünün tutarlı bir şekilde erişmesi ve değiştirmesi gereken global ayarlar için idealdir.

challenge icon

Görev

Kolay

Haydi Singleton desenini kullanarak bir oyun ayarları yöneticisi oluşturalım! Programının her bölümünün, kaç kez gerekirse gereksin, tamamen aynı ayarlara erişmesini sağlayan bir yapılandırma modülü oluşturacaksın.

Kodunu iki dosyaya ayıracaksın:

  • GameSettings.lua: Oyun yapılandırmasını depolayan bir Singleton modülü oluştur. Ayarlar tablon musicVolume (70 ile başlayacak), sfxVolume (100 ile başlayacak) ve difficulty ("normal" ile başlayacak) değerlerini içermeli. Bu ayarları değiştirmek için :setMusicVolume(value), :setSfxVolume(value) ve :setDifficulty(level) olmak üzere üç yöntem ekle. Modülün sonunda tabloyu döndürmeyi unutma!
  • main.lua: GameSettings modülünü iki kez farklı değişkenlere aktararak Singleton'ın çalıştığını göster. Müzik ses düzeyini ve zorluk seviyesini değiştirmek için ilk değişkeni kullan. Ardından ikinci değişkeni kullanarak üç ayarın tümünü yazdır. Singleton doğru çalışıyorsa her iki değişken de aynı tabloya başvurur; bu nedenle biri üzerinden yapılan değişiklikler diğeri üzerinden görünür.

İki girdi alacaksın:

  1. Yeni müzik ses düzeyi (bir sayı)
  2. Yeni zorluk seviyesi ("easy" veya "hard" gibi bir dize)

Ayarları ilk değişken üzerinden değiştirdikten sonra üç ayarı, her biri kendi satırında olacak şekilde şu sırayla ikinci değişkeni kullanarak yazdır: müzik ses düzeyi, sfx ses düzeyi, ardından zorluk seviyesi.

Örneğin girdiler 50 ve hard ise çıktı şöyle olmalı:

50
100
hard

Girdiler 25 ve easy ise çıktı şöyle olmalı:

25
100
easy

sfx ses düzeyinin varsayılan 100 değerinde kaldığına dikkat et; çünkü onu hiç değiştirmedik. Ancak müzik ses düzeyi ve zorluk seviyesi, ilk değişken üzerinden yapılan değişiklikleri yansıtıyor. Bu da her iki değişkenin de aynı Singleton örneğine işaret ettiğini kanıtlıyor!

Kendin dene

-- main.lua - Singleton desenini göster

-- Girdileri oku
local newMusicVolume = tonumber(io.read())
local newDifficulty = io.read()

-- TODO: GameSettings modülünü bir değişkene require et (ör. settings1)

-- TODO: GameSettings modülünü TEKRAR FARKLI bir değişkene require et (ör. settings2)
-- (Singleton doğru çalışıyorsa, her iki değişken de aynı tabloya referans verir!)

-- TODO: İLK değişkeni kullanarak:
--   - Müzik ses seviyesini newMusicVolume olarak ayarla
--   - Zorluğu newDifficulty olarak ayarla

-- TODO: İKİNCİ değişkeni kullanarak ayarları yazdır
-- Her birini kendi satırına yazdır: musicVolume, sfxVolume, difficulty
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Lua derleyicisi