Menu
Coddy logo textTech

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ştirilemez

Bu 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.

challenge icon

Görev

Kolay

Salt 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 yerine Error: Config is read-only yazdı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
    • maxUsers alanını değiştirmeyi deneme (bu, hata mesajını tetiklemelidir)
    • Gerçekte değiştirilmediğini kanıtlamak için maxUsers değerini tekrar yazdırma

Üç girdi alacaksınız:

  1. Uygulama adı (bir dize)
  2. Sürüm (bir dize)
  3. 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: 100

Unutmayı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
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