Zusammenfassung – Sicherer Tresor
Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 48 von 70.
Aufgabe
EinfachErstellen wir eine Vault-Klasse, die Privatsphäre auf Grundlage von Closures verwendet, um ein wirklich sicheres Speichersystem zu erstellen! Der Tresor enthält geheime Inhalte, auf die nur durch die Eingabe des korrekten Passworts zugegriffen werden kann.
Du wirst deinen Code auf zwei Dateien verteilen:
Vault.lua: Erstelle eine Klasse, in der sowohl die Inhalte als auch das Passwort in lokalen Variablen innerhalb des Konstruktors gespeichert werden: vollständig vor dem Zugriff von außen verborgen. Der Konstruktor:new(contents, password)soll diese Werte in lokalen Variablen speichern und anschließend direkt in der Objektinstanz eine Methode definieren::open(attemptedPassword): Prüft, ob das eingegebene Passwort mit dem gespeicherten Passwort übereinstimmt. Wenn es korrekt ist, werden die geheimen Inhalte zurückgegeben. Wenn es falsch ist, wird"Access Denied"zurückgegeben.
main.lua: Binde dein Vault-Modul ein und lies drei Eingaben ein: die zu speichernden geheimen Inhalte, das festzulegende Passwort und einen Passwortversuch. Erstelle einen Tresor mit den Inhalten und dem Passwort, versuche anschließend, ihn mit dem eingegebenen Passwort zu öffnen, und gib das Ergebnis aus. Zeige außerdem, dass die Inhalte wirklich privat sind, indem du versuchst, direkt aufvault.contentszuzugreifen, und ausgibst, was du erhältst.
Du erhältst drei Eingaben:
- Die geheimen Inhalte, die im Tresor gespeichert werden sollen
- Das Passwort, mit dem der Tresor geschützt werden soll
- Ein Passwortversuch, mit dem versucht werden soll, den Tresor zu öffnen
Deine Ausgabe sollte aus zwei Zeilen bestehen:
Result: {resultFromOpen}
Direct access: {whatYouGetFromVaultContents}Wenn die Eingaben beispielsweise Gold Coins, secret123 und secret123 lauten, sollte die Ausgabe folgendermaßen aussehen:
Result: Gold Coins
Direct access: nilWenn die Eingaben Diamond, mypass und wrongpass lauten, sollte die Ausgabe folgendermaßen aussehen:
Result: Access Denied
Direct access: nilDie entscheidende Erkenntnis ist, dass sowohl contents als auch password nur als lokale Variablen innerhalb des Konstruktors existieren. Die Methode :open() kann über eine Closure auf sie zugreifen, aber sonst niemand – nicht einmal über vault.contents, vault._contents oder vault.password. Das ist echte Kapselung!
Probier es selbst
-- Das Vault-Modul einbinden
local Vault = require('Vault')
-- Eingaben lesen
local contents = io.read()
local password = io.read()
local attemptedPassword = io.read()
-- TODO: Erstelle einen Vault mit dem Inhalt und dem Passwort
-- TODO: Versuche, den Vault mit dem versuchten Passwort zu öffnen
-- TODO: Gib das Ergebnis im Format aus: "Result: {resultFromOpen}"
-- TODO: Versuche, direkt auf vault.contents zuzugreifen und gib aus, was du erhältst
-- Print in the format: "Direct access: {whatYouGetFromVaultContents}"
Alle Lektionen in Objektorientierte Programmierung
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-KlasseKreis-KlasseUmfang-MethodeFormen-SammlungGesamtflächeFormen filtern2Klassen-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-Mathematik8Kapselung
NamenskonventionenClosures für private DatenZugriff über ClosuresSchreibgeschützte TabellenValidierungslogikZusammenfassung – Sicherer Tresor3Objektzustand 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Übe selbstständig: Online-Lua-Compiler