Menu
Coddy logo textTech

Doğrulama Mantığı

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

Şimdiye kadar verileri korumanın farklı yollarını inceledik: adlandırma kuralları amacı belirtir, closure'lar değişkenleri tamamen gizler ve salt okunur tablolar tüm değişiklikleri önler. Ancak çoğu zaman arada bir şeye ihtiyaç duyarsın: değişikliklere izin vermek, ama yalnızca geçerli olanlara.

Setter metotlarının güçlü hâle geldiği yer burasıdır. Bir setter yalnızca bir değer atamak yerine, kabul etmeden önce yeni değerin anlamlı olup olmadığını kontrol edebilir:

local Person = {}
Person.__index = Person

function Person:new(name, age)
    local obj = {
        _name = name,
        _age = age
    }
    setmetatable(obj, Person)
    return obj
end

function Person:setAge(newAge)
    if newAge < 0 then
        print("Error: Age cannot be negative")
        return
    end
    self._age = newAge
end

Birisi person:setAge(-5) çağırdığında, yöntem geçersiz girdiyi yakalar ve güncelleme yapmayı reddeder. Nesnenin durumu tutarlı kalır. Bu koruma olmadan, hatalı veriler programınızı sessizce bozabilir: negatif bir yaşla emeklilik ödemelerini hesapladığınızı düşünün.

Doğrulama, gerektiği kadar basit veya karmaşık olabilir. Aralıkları kontrol edebilir, türleri doğrulayabilir veya değerlerin beklenen biçimlerle eşleştiğinden emin olabilirsiniz. Temel ilke, setter'ın bir bekçi görevi görerek yalnızca makul verilerin nesnenize girmesini sağlamasıdır.

challenge icon

Görev

Kolay

Setter metotlarındaki doğrulama mantığını kullanarak health ve level özelliklerini koruyan bir Player sınıfı oluşturalım! Bu, oyun karakterlerinin hiçbir zaman mümkün olmayan istatistiklere sahip olmamasını sağlar.

Kodunuzu iki dosya arasında düzenleyeceksiniz:

  • Player.lua: Bir player'ın istatistiklerini uygun doğrulamayla yöneten bir sınıf oluşturun. Constructor :new(name), player'ı bir adla, _health değeri 100 ve _level değeri 1 olacak şekilde başlatmalıdır. Aşağıdaki metotları ekleyin:
    • :getName(): player'ın adını döndürür
    • :getHealth(): mevcut health değerini döndürür
    • :getLevel(): mevcut level değerini döndürür
    • :setHealth(value): health değerini yalnızca value 0 ile 100 (inclusive) arasındaysa günceller. Geçersizse Error: Health must be between 0 and 100 yazdırın ve değeri değiştirmeyin.
    • :setLevel(value): level değerini yalnızca value 1 veya daha büyükse günceller. Geçersizse Error: Level must be at least 1 yazdırın ve değeri değiştirmeyin.
  • main.lua: Player modülünü require edin ve bir player adı, ardından setter'ları test etmek için iki value okuyun. Bir player oluşturun, health değerini ilk value olarak ayarlamayı deneyin, level değerini ikinci value olarak ayarlamayı deneyin, ardından player'ın son istatistiklerini yazdırın.

Üç input alacaksınız:

  1. Player'ın adı
  2. Ayarlanmaya çalışılacak bir health değeri (bir number; geçerli veya geçersiz olabilir)
  3. Ayarlanmaya çalışılacak bir level değeri (bir number; geçerli veya geçersiz olabilir)

Çıktınız, geçersiz denemelerden kaynaklanan hata mesajlarını ve ardından player'ın son istatistiklerini göstermelidir:

Name: {name}
Health: {finalHealth}
Level: {finalLevel}

Örneğin input'lar Hero, -20 ve 5 ise çıktı şöyle olmalıdır:

Error: Health must be between 0 and 100
Name: Hero
Health: 100
Level: 5

health setter'ı -20 değerini reddetti (health değerini 100'de tuttu), level setter'ı ise 5 değerini geçerli olarak kabul etti.

Input'lar Warrior, 75 ve 0 ise çıktı şöyle olmalıdır:

Error: Level must be at least 1
Name: Warrior
Health: 75
Level: 1

Kendin dene

-- Player modülünü yükle
local Player = require('Player')

-- Girdileri oku
local name = io.read()
local healthValue = tonumber(io.read())
local levelValue = tonumber(io.read())

-- TODO: Verilen isimle yeni bir oyuncu oluştur

-- TODO: Oyuncunun sağlığını healthValue değerine ayarlamayı dene

-- TODO: Oyuncunun seviyesini levelValue değerine ayarlamayı dene

-- TODO: Oyuncunun son istatistiklerini şu formatta yazdır:
-- İsim: {name}
-- Sağlık: {finalHealth}
-- Seviye: {finalLevel}
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