Tabel Singleton
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 63 dari 70.
Terkadang kamu hanya membutuhkan satu instance dari sesuatu di seluruh programmu: pengelola konfigurasi, sistem logging, atau pengaturan game. Membuat beberapa salinan dapat menimbulkan masalah: mana yang memiliki data yang benar? Pola Singleton memastikan hanya ada satu instance.
Di Lua, mengimplementasikan Singleton ternyata sangat mudah berkat cara kerja module. Saat kamu memanggil require untuk sebuah module, Lua menyimpan hasilnya dalam cache. Pemanggilan require berikutnya mengembalikan tabel yang tersimpan dalam cache, bukan tabel baru.
-- GameConfig.lua
local GameConfig = {
volume = 80,
difficulty = "normal"
}
function GameConfig:setVolume(v)
self.volume = v
end
return GameConfig
Sekarang, di mana pun dalam programmu:
local config1 = require("GameConfig")
local config2 = require("GameConfig")
config1:setVolume(50)
print(config2.volume) -- 50 (tabel yang sama!)
config1 dan config2 merujuk ke tabel yang sama persis. Perubahan yang dibuat melalui satu variabel akan terlihat melalui variabel lainnya. Hal ini terjadi secara otomatis karena require di Lua menyimpan nilai yang dikembalikan di package.loaded dan menggunakannya kembali.
Berbeda dengan pola Factory yang membuat object baru, Singleton menjamin state bersama di seluruh aplikasi. Ini ideal untuk pengaturan global yang perlu diakses dan diubah secara konsisten oleh beberapa bagian kodemu.
Tantangan
MudahMari buat pengelola pengaturan game menggunakan pola Singleton! Kamu akan membuat module konfigurasi yang memastikan setiap bagian programmu mengakses pengaturan yang sama persis, berapa pun kali module itu dibutuhkan.
Kamu akan menyusun kodemu dalam dua file:
GameSettings.lua: Buat module Singleton yang menyimpan konfigurasi game. Tabel pengaturanmu harus mencakupmusicVolume(diawali dengan 70),sfxVolume(diawali dengan 100), dandifficulty(diawali dengan"normal"). Tambahkan tiga method::setMusicVolume(value),:setSfxVolume(value), dan:setDifficulty(level)untuk mengubah pengaturan ini. Ingat untuk mengembalikan tabel di akhir module!main.lua: Buktikan bahwa Singleton berfungsi dengan meminta module GameSettings dua kali ke dalam variabel yang berbeda. Gunakan variabel pertama untuk mengubah volume musik dan tingkat kesulitan. Lalu gunakan variabel kedua untuk mencetak ketiga pengaturan. Jika Singleton berfungsi dengan benar, kedua variabel merujuk ke tabel yang sama, sehingga perubahan melalui salah satunya akan terlihat melalui yang lain.
Kamu akan menerima dua input:
- Volume musik baru (angka)
- Tingkat kesulitan baru (string seperti
"easy"atau"hard")
Setelah mengubah pengaturan melalui variabel pertama, cetak ketiga pengaturan menggunakan variabel kedua, masing-masing pada baris tersendiri dengan urutan berikut: volume musik, volume sfx, lalu tingkat kesulitan.
Misalnya, jika inputnya adalah 50 dan hard, outputnya adalah:
50
100
hardJika inputnya adalah 25 dan easy, outputnya adalah:
25
100
easyPerhatikan bahwa volume sfx tetap pada nilai default 100 karena kita tidak pernah mengubahnya, tetapi volume musik dan tingkat kesulitan mencerminkan perubahan yang dilakukan melalui variabel pertama. Ini membuktikan bahwa kedua variabel menunjuk ke instance Singleton yang sama!
Coba sendiri
-- main.lua: Tunjukkan pola Singleton
-- Baca input
local newMusicVolume = tonumber(io.read())
local newDifficulty = io.read()
-- TODO: Muat module GameSettings ke dalam variabel (misalnya, settings1)
-- TODO: Muat module GameSettings LAGI ke dalam variabel yang BERBEDA (misalnya, settings2)
-- (Jika Singleton berfungsi dengan benar, kedua variabel merujuk ke tabel yang sama!)
-- TODO: Gunakan variabel PERTAMA untuk:
-- - Atur volume musik ke newMusicVolume
-- - Atur tingkat kesulitan ke newDifficulty
-- TODO: Gunakan variabel KEDUA untuk mencetak pengaturan
-- Cetak masing-masing pada baris terpisah: musicVolume, sfxVolume, difficulty
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Konsep "Self"
Tabel dengan Fungsi'self' EksplisitSintaks Titik DuaTitik vs Titik DuaRangkuman, Titik Bergerak4Proyek: Bank Digital
Penyiapan Proyekmethod Setoran7Polimorfisme & Overriding
Menimpa methodMemanggil method indukDuck TypingAntarmuka UmumMemeriksa TipeRingkasan: Peran Karyawan10Proyek: Pengelola Bentuk
Penyiapan Proyekclass Rectangleclass Circlemethod KelilingKumpulan BentukLuas TotalSaring Bentuk2Pola Prototype untuk class
Konsep PrototypeMenghubungkan dengan __indexKonstruktor :new()Menginisialisasi AtributInstans yang MandiriRangkuman: Pabrik Mobil5Pembebanan Operator dalam OOP
Menjumlahkan ObjekMengurangkan ObjekMenggabungkan ObjekMembandingkan Objek (<, >)Ulasan: Aritmetika Dompet8Enkapsulasi
Konvensi PenamaanClosure untuk PrivasiAkses melalui ClosureTabel Hanya-BacaLogika ValidasiRangkuman: Brankas Aman11Pola Desain (Ringan)
Fungsi FactoryTabel SingletonPola IteratorObserver (Listener)Rangkuman, Factory Logger3State dan Behavior pada object
Variabel InstansGetter methodSetter methodProperty TerhitungMemformat stringPemeriksaan KesetaraanRangkuman: Nilai Siswa6Dasar-Dasar Pewarisan
Menyiapkan PewarisanMewarisi methodMemperluas KonstruktorMenambahkan method untuk ChildSama vs UnikRangkuman: Hierarki BentukLatihan sendiri: Compiler Lua online