Salt Okunur Tablolar
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 46 / 70.
Kapanışlar gerçek gizlilik sağlar, ancak yöntemlerin oluşturucu içinde tanımlanmasını gerektirir. Farklı bir kullanım durumu için başka bir yaklaşım daha vardır: bir nesneyi oluşturulduktan sonra salt okunur hâle getirmek. Bu, sabit bir noktanın koordinatları gibi alanların görünür ancak değiştirilemez olmasını istediğinizde kullanışlıdır.
__newindex metametodu, bir tabloya yeni değerler atama girişimlerini yakalar. Tüm atamaları engellemesini sağlayarak bir nesneyi dondurabilirsin:
local ImmutablePoint = {}
function ImmutablePoint.new(x, y)
local data = {x = x, y = y}
local proxy = {}
setmetatable(proxy, {
__index = data,
__newindex = function()
error("Cannot modify immutable object")
end
})
return proxy
endİşin püf noktası proxy tablosu kullanmaktır. Gerçek veriler data içinde bulunurken kullanıcı boş proxy ile etkileşime girer.
Okurken __index, data içinden getirir. Yazarken bunun yerine __newindex tetiklenir ve bunu engelleriz:
local p = ImmutablePoint.new(10, 20)
print(p.x) -- 10 (okuma çalışır)
p.x = 50 -- Hata: Değişmez nesne değiştirilemezBu desen, yapılandırma nesneleri, matematiksel sabitler veya başlatma işleminden sonra asla değişmemesi gereken herhangi bir veri için değerlidir. Nesne tamamen okunabilir durumda kalır. Yalnızca onu değiştiremezsin.
Görev
KolaySalt okunur yapılandırma nesneleri oluşturan bir ImmutableConfig sınıfı oluşturalım! Oluşturulduktan sonra bu yapılandırma nesneleri, ayarlarının okunmasına izin vermeli ancak onları değiştirmeye yönelik tüm girişimleri tamamen engellemelidir.
Kodunuzu iki dosya arasında düzenleyeceksiniz:
ImmutableConfig.lua: Dondurulmuş yapılandırma nesneleri üreten bir modül oluşturun..new(appName, version, maxUsers)işleviniz bu üç değeri dahili olarak saklamalı, ardından tüm alanların okunmasına izin veren ancak herhangi bir değişikliği engelleyen bir proxy tablosu döndürmelidir. Birisi bir değeri değiştirmeye çalıştığında gerçek bir hata oluşturmak yerineError: Config is read-onlyyazdırılmalıdır.main.lua: ImmutableConfig'i hayata geçirin! Yapılandırma değerleri için üç girdi okuyun, bir yapılandırma nesnesi oluşturun, ardından şu işlemleri yaparak doğru çalıştığını gösterin:- Üç özgün değerin tümünü yazdırma
maxUsersalanını değiştirmeyi deneme (bu, hata mesajını tetiklemelidir)- Gerçekte değiştirilmediğini kanıtlamak için
maxUsersdeğerini tekrar yazdırma
Üç girdi alacaksınız:
- Uygulama adı (bir dize)
- Sürüm (bir dize)
- Maksimum kullanıcı sayısı (bir sayı)
Çıktınız yapılandırma değerlerini, değiştirme girişimindeki hatayı ve değerin değişmeden kaldığının doğrulamasını göstermelidir:
App: {appName}
Version: {version}
Max Users: {maxUsers}
Error: Config is read-only
Max Users: {maxUsers}Örneğin girdiler MyApp, 2.0 ve 100 ise çıktı şu şekilde olmalıdır:
App: MyApp
Version: 2.0
Max Users: 100
Error: Config is read-only
Max Users: 100Unutmayın: proxy deseni, kullanıcının etkileşimde bulunduğu boş bir tablo kullanırken gerçek veriler ayrı bir dahili tabloda bulunur. __index metamethod'u veri tablosundan veri alır ve __newindex tüm yazma girişimlerini yakalayıp engeller!
Kendin dene
-- ImmutableConfig modülünü içe aktar
local ImmutableConfig = require('ImmutableConfig')
-- Girdileri oku
local appName = io.read()
local version = io.read()
local maxUsers = tonumber(io.read())
-- TODO: ImmutableConfig.new() kullanarak bir config nesnesi oluştur
-- TODO: Üç orijinal değeri şu formatta yazdır:
-- App: {appName}
-- Version: {version}
-- Max Users: {maxUsers}
-- TODO: maxUsers alanını değiştirmeyi dene (bu hata mesajını tetiklemelidir)
-- TODO: Değiştirilmediğini kanıtlamak için maxUsers'ı tekrar yazdır
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