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
endWenn 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.
Aufgabe
EinfachLass 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_healthauf100und_levelauf1gesetzt 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, gibError: Health must be between 0 and 100aus und ändere den Wert nicht.:setLevel(value)— aktualisiert das Level nur, wenn der Wert 1 oder größer ist. Falls ungültig, gibError: Level must be at least 1aus 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:
- Der Name des Spielers
- Ein Gesundheitswert für den Setzversuch (eine Zahl, kann gültig oder ungültig sein)
- 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: 5Der 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: 1Spickzettel
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
endDer 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}
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
1Das 'self'-Konzept
Tabellen mit FunktionenExplizites 'self'Die Doppelpunkt-SyntaxPunkt vs. DoppelpunktZusammenfassung – Beweglicher Punkt4Projekt: Digitale Bank
Projekt-SetupEinzahlungsmethode7Polymorphie & Überschreiben
Methoden überschreibenElternmethoden aufrufenDuck TypingGemeinsames InterfaceTyp prüfenRückblick - Mitarbeiterrollen10Projekt: Formen-Manager
Projekt-SetupRechteck-Klasse2Klassen-Prototyp-Muster
Das Prototyp-KonzeptVerknüpfung mit __indexDer :new()-KonstruktorAttribute initialisierenUnabhängige InstanzenZusammenfassung – Autofabrik5Operatorüberladung in OOP
Objekte addierenObjekte subtrahierenObjekte verkettenObjekte vergleichen (<, >)Rückblick – Wallet-Mathematik3Objektzustand und -verhalten
InstanzvariablenGetter-MethodenSetter-MethodenBerechnete EigenschaftenStrings formatierenGleichheitsprüfungenZusammenfassung – Studentennote6Grundlagen der Vererbung
Das Vererbungs-SetupMethoden vererbenDen Konstruktor erweiternChild-Methoden hinzufügenGemeinsam vs. EinzigartigZusammenfassung - Formen-Hierarchie9Komposition & Mixins
Has-A-BeziehungDelegationEinfache MixinsAnwendung mehrerer MixinsMixins vs. VererbungZusammenfassung – Roboter-Montage12Abschluss-Herausforderungen
Wiederholung - InventarsystemWiederholung - BenutzerverwaltungWiederholung - Score-TrackerFinaler OOP-Check