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.
Görev
KolayHaydi 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 tablonmusicVolume(70 ile başlayacak),sfxVolume(100 ile başlayacak) vedifficulty("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:
- Yeni müzik ses düzeyi (bir sayı)
- 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
hardGirdiler 25 ve easy ise çıktı şöyle olmalı:
25
100
easysfx 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
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
1'Self' Kavramı
Fonksiyonlu TablolarAçık 'self'İki Nokta SözdizimiNokta vs İki NoktaÖzet - Hareket Eden Nokta4Proje: Dijital Banka
Proje KurulumuPara Yatırma Metodu7Çok Biçimlilik ve Geçersiz Kılma
Metotları Geçersiz KılmaÜst Sınıf Metotlarını ÇağırmaDuck TypingOrtak ArayüzTür KontrolüÖzet - Çalışan Rolleri2Sınıf Prototip Kalıbı
Prototip Kavramı__index ile Bağlama:new() KurucusuÖznitelikleri BaşlatmaBağımsız ÖrneklerÖzet - Araba Fabrikası5OOP'de Operatör Aşırı Yükleme
Nesneleri ToplamaNesneleri ÇıkarmaNesneleri BirleştirmeNesneleri Karşılaştırma (<, >)Özet - Cüzdan Matematiği8Kapsülleme
Adlandırma KurallarıGizlilik için Closure'larClosure'lar Aracılığıyla ErişimSalt Okunur TablolarDoğrulama MantığıÖzet - Güvenli Kasa11Tasarım Kalıpları (Lite)
Fabrika FonksiyonlarıSingleton TablosuIterator KalıbıObserver (Dinleyici)Özet - Logger Fabrikası3Nesne Durumu ve Davranışı
Örnek DeğişkenleriGetter MetotlarıSetter MetotlarıHesaplanmış ÖzelliklerString BiçimlendirmeEşitlik KontrolleriÖzet - Öğrenci Notu6Kalıtımın Temelleri
Kalıtım KurulumuMetot KalıtımıConstructor'ı GenişletmeAlt Sınıf Metotları EklemePaylaşılan ve BenzersizÖzet - Şekil HiyerarşisiKendi başına pratik yap: Online Lua derleyicisi