Menu
Coddy logo textTech

Validierungslogik

Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 47 von 70.

Bisher haben wir verschiedene Möglichkeiten zum Schutz von Daten untersucht – Namenskonventionen signalisieren die Absicht, Closures verbergen Variablen vollständig und schreibgeschützte Tabellen verhindern jegliche Änderungen. Aber oft benötigt man etwas dazwischen: Änderungen zulassen, aber nur gültige.

Hier werden Setter-Methoden mächtig. Anstatt nur einen Wert zuzuweisen, kann ein Setter prüfen, ob der neue Wert sinnvoll ist, bevor er ihn akzeptiert:

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

Wenn jemand person:setAge(-5) aufruft, fängt die Methode die ungültige Eingabe ab und verweigert die Aktualisierung. Der Zustand des Objekts bleibt konsistent. Ohne diesen Schutz könnten fehlerhafte Daten Ihr Programm unbemerkt beschädigen – stellen Sie sich vor, Sie würden Rentenansprüche mit einem negativen Alter berechnen.

Validierung kann so einfach oder komplex sein wie nötig. Sie könnten Bereiche prüfen, Typen verifizieren oder sicherstellen, dass Werte den erwarteten Formaten entsprechen. Das Grundprinzip besteht darin, dass der Setter als Gatekeeper fungiert und sicherstellt, dass nur sinnvolle Daten in Ihr Objekt gelangen.

challenge icon

Aufgabe

Einfach

Lass uns eine Player-Klasse erstellen, die ihre Attribute für Gesundheit und Level mithilfe von Validierungslogik in Setter-Methoden schützt! Dies stellt sicher, dass Spielcharaktere niemals unmögliche Statuswerte erhalten.

Du wirst deinen Code auf zwei Dateien aufteilen:

  • Player.lua: Erstelle eine Klasse, die die Statuswerte eines Spielers mit ordnungsgemäßer Validierung verwaltet. Der Konstruktor :new(name) sollte den Spieler mit einem Namen initialisieren, wobei _health auf 100 und _level auf 1 gesetzt wird. Füge diese Methoden hinzu:
    • :getName() — gibt den Namen des Spielers zurück
    • :getHealth() — gibt die aktuelle Gesundheit zurück
    • :getLevel() — gibt das aktuelle Level zurück
    • :setHealth(value) — aktualisiert die Gesundheit nur, wenn der Wert zwischen 0 und 100 (einschließlich) liegt. Falls ungültig, gib Error: Health must be between 0 and 100 aus und ändere den Wert nicht.
    • :setLevel(value) — aktualisiert das Level nur, wenn der Wert 1 oder größer ist. Falls ungültig, gib Error: Level must be at least 1 aus und ändere den Wert nicht.
  • main.lua: Binde dein Player-Modul ein und lies einen Spielernamen sowie zwei Werte ein, um die Setter zu testen. Erstelle einen Spieler, versuche seine Gesundheit auf den ersten Wert zu setzen, versuche sein Level auf den zweiten Wert zu setzen und gib dann die endgültigen Statuswerte des Spielers aus.

Du wirst drei Eingaben erhalten:

  1. Der Name des Spielers
  2. Ein Gesundheitswert für den Setzversuch (eine Zahl, kann gültig oder ungültig sein)
  3. Ein Levelwert für den Setzversuch (eine Zahl, kann gültig oder ungültig sein)

Deine Ausgabe sollte alle Fehlermeldungen von ungültigen Versuchen anzeigen, gefolgt von den endgültigen Statuswerten des Spielers:

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

Wenn die Eingaben zum Beispiel Hero, -20 und 5 sind, sollte die Ausgabe wie folgt aussehen:

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

Der Gesundheits-Setter hat -20 abgelehnt (wodurch die Gesundheit bei 100 blieb), während der Level-Setter 5 als gültig akzeptiert hat.

Wenn die Eingaben Warrior, 75 und 0 sind, sollte die Ausgabe wie folgt aussehen:

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

Spickzettel

Setter-Methoden ermöglichen es Ihnen, Daten zu validieren, bevor Sie Objekteigenschaften aktualisieren, wodurch sichergestellt wird, dass nur gültige Werte akzeptiert werden.

Ein einfacher Setter mit Validierung:

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

Der Setter fungiert als Gatekeeper – er prüft, ob der neue Wert gültig ist, bevor die interne Eigenschaft aktualisiert wird. Wenn die Validierung fehlschlägt, gibt er einen Fehler aus und bricht vorzeitig ab, ohne die Daten zu ändern.

Die Validierung kann Folgendes umfassen:

  • Bereichsprüfungen (z. B. age >= 0)
  • Grenzwerte (z. B. 0 <= health <= 100)
  • Typüberprüfung
  • Formatvalidierung

Dies verhindert, dass ungültige Daten den Zustand Ihres Objekts korrumpieren, und hält Ihr Programm konsistent.

Probier es selbst

-- Erfordert das Player-Modul
local Player = require('Player')

-- Eingaben lesen
local name = io.read()
local healthValue = tonumber(io.read())
local levelValue = tonumber(io.read())

-- TODO: Erstelle einen neuen Spieler mit dem angegebenen Namen

-- TODO: Versuche, die Gesundheit des Spielers auf healthValue zu setzen

-- TODO: Versuche, das Level des Spielers auf levelValue zu setzen

-- TODO: Gib die endgültigen Statistiken des Spielers in folgendem Format aus:
-- Name: {name}
-- Gesundheit: {finalHealth}
-- Level: {finalLevel}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Object Oriented Programming