Namenskonventionen
Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 43 von 70.
In Lua sind standardmäßig alle Tabellenfelder öffentlich zugänglich. Jeder kann self.health direkt lesen oder ändern. Lua erzwingt zwar keine Privatsphäre, aber Programmierer verwenden Namenskonventionen, um die Absicht zu vermitteln: Sie signalisieren, welche Felder als interne Implementierungsdetails behandelt werden sollten.
Die standardmäßige Konvention besteht darin, privaten Feldern einen Unterstrich voranzustellen:
local Player = {}
Player.__index = Player
function Player:new(name)
local obj = {
name = name, -- Öffentlich: direkter Zugriff ist okay
_health = 100, -- Privat: stattdessen Methoden verwenden
_score = 0 -- Privat: interne Nachverfolgung
}
setmetatable(obj, Player)
return obj
end
function Player:getHealth()
return self._health
end
function Player:takeDamage(amount)
self._health = self._health - amount
endDer Unterstrich verändert nicht, wie Lua funktioniert: player._health ist technisch gesehen weiterhin zugänglich. Er dient jedoch als deutlicher Hinweis für andere Programmierer (und dein zukünftiges Ich): „Dieses Feld ist als privat gedacht. Greife stattdessen über Methoden darauf zu.“
Diese Konvention ist wichtig, weil sie die Schnittstelle (was andere verwenden sollten) von der Implementierung (wie sie intern funktioniert) trennt. Wenn du später eine Validierung hinzufügen oder ändern musst, wie die Gesundheit gespeichert wird, änderst du nur die Methoden: Code, der :getHealth() verwendet, funktioniert weiterhin unverändert.
Aufgabe
EinfachErstellen wir eine BankAccount-Klasse, die mithilfe der Namenskonvention mit Unterstrich eindeutig kennzeichnet, welche Felder privat sein sollen!
Du verteilst deinen Code auf zwei Dateien:
BankAccount.lua: Erstelle eine Klasse, die Kontoinformationen verwaltet. Der Konstruktor:new(ownerName, initialBalance)soll den Namen des Besitzers als öffentliches Feld (owner) und den Kontostand als privates Feld (_balance) speichern. Füge drei Methoden hinzu::getBalance(): gibt den aktuellen Kontostand zurück:deposit(amount): addiert den Betrag zu_balance:getOwner(): gibt den Namen des Besitzers zurück
main.lua: Binde dein BankAccount-Modul ein und lies den Namen des Besitzers, den anfänglichen Kontostand sowie den Einzahlungsbetrag aus der Eingabe ein. Erstelle ein Konto, zahle den Betrag ein und gib anschließend den Besitzer und den endgültigen Kontostand aus.
Du erhältst drei Eingaben:
- Den Namen des Besitzers
- Den anfänglichen Kontostand (eine Zahl)
- Den Einzahlungsbetrag (eine Zahl)
Deine Ausgabe sollte aus zwei Zeilen bestehen, die den Besitzer und den endgültigen Kontostand nach der Einzahlung anzeigen:
Owner: {ownerName}
Balance: {finalBalance}Wenn die Eingaben beispielsweise Maria, 500 und 150 lauten, sollte die Ausgabe folgendermaßen aussehen:
Owner: Maria
Balance: 650Denke daran: Das Unterstrich-Präfix bei _balance signalisiert anderen Programmierern, dass auf dieses Feld über Methoden wie :getBalance() und :deposit() und nicht direkt zugegriffen werden sollte. Das Feld owner ohne Unterstrich zeigt an, dass es problemlos öffentlich verwendet werden kann.
Probier es selbst
-- BankAccount-Modul einbinden
local BankAccount = require('BankAccount')
-- Eingaben lesen
local ownerName = io.read()
local initialBalance = tonumber(io.read())
local depositAmount = tonumber(io.read())
-- TODO: Erstelle ein neues BankAccount mit ownerName und initialBalance
-- TODO: Führe eine Einzahlung mit dem depositAmount durch
-- TODO: Gib den Besitzer und den Endsaldo im erforderlichen Format aus
-- Format:
-- Owner: {ownerName}
-- Balance: {finalBalance}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
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-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Übe selbstständig: Online-Lua-Compiler