Menu
Coddy logo textTech

Logika walidacji

Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 47 z 70.

Do tej pory poznaliśmy różne sposoby ochrony danych: konwencje nazewnicze sygnalizują zamiar, domknięcia całkowicie ukrywają zmienne, a tabele tylko do odczytu uniemożliwiają wszelkie modyfikacje. Często jednak potrzebujesz czegoś pośredniego: możliwości wprowadzania zmian, ale tylko prawidłowych.

W tym miejscu metody ustawiające stają się potężne. Zamiast tylko przypisywać wartość, metoda ustawiająca może sprawdzić, czy nowa wartość ma sens, zanim ją zaakceptuje:

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

Gdy ktoś wywoła person:setAge(-5), metoda wykrywa nieprawidłowe dane wejściowe i odmawia aktualizacji. Stan obiektu pozostaje spójny. Bez tej ochrony błędne dane mogłyby po cichu uszkodzić program: wyobraź sobie obliczanie świadczeń emerytalnych dla osoby w ujemnym wieku.

Walidacja może być tak prosta lub złożona, jak to konieczne. Możesz sprawdzać zakresy, weryfikować typy lub upewniać się, że wartości odpowiadają oczekiwanym formatom. Kluczowa zasada jest taka, że setter pełni funkcję strażnika, dbając o to, by do obiektu trafiały tylko sensowne dane.

challenge icon

Wyzwanie

Łatwy

Zbudujmy klasę Player, która chroni atrybuty zdrowia i poziomu za pomocą logiki walidacji w metodach ustawiających! Dzięki temu postacie w grze nigdy nie będą miały niemożliwych statystyk.

Podzielisz swój kod na dwa pliki:

  • Player.lua: Utwórz klasę, która zarządza statystykami gracza, stosując odpowiednią walidację. Konstruktor :new(name) powinien inicjalizować gracza z imieniem, ustawiając _health na 100 i _level na 1. Dodaj następujące metody:
    • :getName(): zwraca imię gracza
    • :getHealth(): zwraca aktualne zdrowie
    • :getLevel(): zwraca aktualny poziom
    • :setHealth(value): aktualizuje zdrowie tylko wtedy, gdy wartość mieści się w przedziale od 0 do 100 (włącznie). Jeśli jest nieprawidłowa, wyświetl Error: Health must be between 0 and 100 i nie zmieniaj wartości.
    • :setLevel(value): aktualizuje poziom tylko wtedy, gdy wartość wynosi co najmniej 1. Jeśli jest nieprawidłowa, wyświetl Error: Level must be at least 1 i nie zmieniaj wartości.
  • main.lua: Załaduj moduł Player i odczytaj imię gracza, a następnie dwie wartości do przetestowania metod ustawiających. Utwórz gracza, spróbuj ustawić jego zdrowie na pierwszą wartość, spróbuj ustawić jego poziom na drugą wartość, a następnie wyświetl końcowe statystyki gracza.

Otrzymasz trzy dane wejściowe:

  1. Imię gracza
  2. Wartość zdrowia, którą chcesz ustawić (liczba, może być prawidłowa lub nieprawidłowa)
  3. Wartość poziomu, którą chcesz ustawić (liczba, może być prawidłowa lub nieprawidłowa)

Wynik powinien zawierać wszystkie komunikaty o błędach dotyczące nieprawidłowych prób, a następnie końcowe statystyki gracza:

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

Na przykład, jeśli dane wejściowe to Hero, -20 i 5, wynik powinien wyglądać następująco:

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

Metoda ustawiająca zdrowie odrzuciła wartość -20 (pozostawiając zdrowie na poziomie 100), a metoda ustawiająca poziom zaakceptowała wartość 5 jako prawidłową.

Jeśli dane wejściowe to Warrior, 75 i 0, wynik powinien wyglądać następująco:

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

Spróbuj swoich sił

-- Załaduj moduł Player
local Player = require('Player')

-- Odczytaj dane wejściowe
local name = io.read()
local healthValue = tonumber(io.read())
local levelValue = tonumber(io.read())

-- TODO: Utwórz nowego gracza o podanym imieniu

-- TODO: Spróbuj ustawić zdrowie gracza na healthValue

-- TODO: Spróbuj ustawić poziom gracza na levelValue

-- TODO: Wyświetl końcowe statystyki gracza w formacie:
-- Imię: {name}
-- Zdrowie: {finalHealth}
-- Poziom: {finalLevel}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Lua online