Menu
Coddy logo textTech

Doğrulama Mantığı

Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 47 / 70.

Şu ana kadar verileri korumanın farklı yollarını inceledik; isimlendirme kuralları niyeti belirtir, closure'lar değişkenleri tamamen gizler ve salt okunur tablolar tüm değişiklikleri engeller. Ancak çoğu zaman ikisinin arasında bir şeye ihtiyaç duyarsınız: değişikliklere izin veren, ancak sadece geçerli olanlara.

Setter metotlarının güçlü hale geldiği yer burasıdır. Sadece bir değer atamak yerine, bir setter yeni değerin kabul edilmeden önce mantıklı 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, metot geçersiz girdiyi yakalar ve güncellemeyi reddeder. Nesnenin durumu tutarlı kalır. Bu koruma olmadan, hatalı veriler programınızı sessizce bozabilir; negatif bir yaşla emeklilik haklarını hesapladığınızı hayal edin.

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

challenge icon

Görev

Kolay

Setter metotlarındaki doğrulama mantığını kullanarak sağlık ve seviye özniteliklerini koruyan bir Player sınıfı oluşturalım! Bu, oyun karakterlerinin asla imkansız istatistiklere sahip olmamasını sağlar.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • Player.lua: Bir oyuncunun istatistiklerini uygun doğrulama ile yöneten bir sınıf oluşturun. Yapıcı metot (constructor) :new(name), oyuncuyu bir isimle, _health değeri 100 ve _level değeri 1 olarak başlatmalıdır. Şu metotları dahil edin:
    • :getName() — oyuncunun ismini döndürür
    • :getHealth() — mevcut sağlığı döndürür
    • :getLevel() — mevcut seviyeyi döndürür
    • :setHealth(value) — sağlığı yalnızca değer 0 ile 100 (dahil) 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) — seviyeyi yalnızca değer 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üzü dahil edin (require) ve bir oyuncu ismi, ardından setter'ları test etmek için iki değer okuyun. Bir oyuncu oluşturun, sağlığını ilk değere ayarlamaya çalışın, seviyesini ikinci değere ayarlamaya çalışın ve ardından oyuncunun son istatistiklerini yazdırın.

Üç girdi alacaksınız:

  1. Oyuncunun ismi
  2. Ayarlanmaya çalışılacak bir sağlık değeri (geçerli veya geçersiz olabilen bir sayı)
  3. Ayarlanmaya çalışılacak bir seviye değeri (geçerli veya geçersiz olabilen bir sayı)

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

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

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

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

Sağlık setter'ı -20 değerini reddetti (sağlığı 100'de tuttu), seviye setter'ı ise 5 değerini geçerli olarak kabul etti.

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

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

Kopya kağıdı

Setter metotları, nesne özelliklerini güncellemeden önce verileri doğrulamanıza olanak tanıyarak yalnızca geçerli değerlerin kabul edilmesini sağlar.

Doğrulama içeren temel bir setter:

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

Setter bir bekçi görevi görür; dahili özelliği güncellemeden önce yeni değerin geçerli olup olmadığını kontrol eder. Doğrulama başarısız olursa, bir hata yazdırır ve veriyi değiştirmeden erkenden döner.

Doğrulama şunları içerebilir:

  • Aralık kontrolleri (örneğin, age >= 0)
  • Sınır limitleri (örneğin, 0 <= health <= 100)
  • Tür doğrulama
  • Format doğrulaması

Bu, geçersiz verilerin nesnenizin durumunu bozmasını önler ve programınızın tutarlı kalmasını sağlar.

Kendin dene

-- Player modülünü dahil et
local Player = require('Player')

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

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

-- YAPILACAK: Oyuncunun canını healthValue değerine ayarlamaya çalış

-- YAPILACAK: Oyuncunun seviyesini levelValue değerine ayarlamaya çalış

-- YAPILACAK: Oyuncunun son istatistiklerini şu formatta yazdır:
-- Name: {name}
-- Health: {finalHealth}
-- Level: {finalLevel}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Object Oriented Programming bölümündeki tüm dersler