Namenskonventionen
Teil des Abschnitts Object Oriented Programming 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. Obwohl Lua keine Zugriffsbeschränkungen erzwingt, verwenden Programmierer Namenskonventionen, um ihre Absicht zu kommunizieren – sie signalisieren damit, welche Felder als interne Implementierungsdetails behandelt werden sollten.
Die gängige Konvention ist es, 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 Verfolgung
}
setmetatable(obj, Player)
return obj
end
function Player:getHealth()
return self._health
end
function Player:takeDamage(amount)
self._health = self._health - amount
endDer Unterstrich ändert nichts daran, wie Lua funktioniert – player._health ist technisch gesehen immer noch zugänglich. Es dient jedoch als deutliche Warnung für andere Programmierer (und Ihr zukünftiges Ich): „Dieses Feld ist als privat gedacht. Greifen Sie stattdessen über Methoden darauf zu.“
Diese Konvention ist wichtig, da sie die Schnittstelle (was andere verwenden sollten) von der Implementierung (wie es intern funktioniert) trennt. Wenn Sie später eine Validierung hinzufügen oder die Art und Weise ändern müssen, wie die Gesundheit gespeichert wird, ändern Sie nur die Methoden – Code, der :getHealth() verwendet, funktioniert weiterhin unverändert.
Aufgabe
EinfachLassen Sie uns eine BankAccount-Klasse erstellen, die mithilfe der Unterstrich-Namenskonvention korrekt signalisiert, welche Felder als privat gedacht sind!
Sie werden Ihren Code auf zwei Dateien aufteilen:
BankAccount.lua: Erstellen Sie eine Klasse, die Kontoinformationen verwaltet. Der Konstruktor:new(ownerName, initialBalance)sollte den Namen des Besitzers als öffentliches Feld (owner) und den Kontostand als privates Feld (_balance) speichern. Fügen Sie drei Methoden hinzu::getBalance()— gibt den aktuellen Kontostand zurück:deposit(amount)— fügt den Betrag zu_balancehinzu:getOwner()— gibt den Namen des Besitzers zurück
main.lua: Binden Sie Ihr BankAccount-Modul ein, lesen Sie den Namen des Besitzers, den Anfangskontostand und den Einzahlungsbetrag aus der Eingabe. Erstellen Sie ein Konto, tätigen Sie eine Einzahlung und geben Sie dann den Besitzer und den Endkontostand aus.
Sie erhalten drei Eingaben:
- Der Name des Besitzers
- Der Anfangskontostand (eine Zahl)
- Der Einzahlungsbetrag (eine Zahl)
Ihre Ausgabe sollte aus zwei Zeilen bestehen, die den Besitzer und den Endkontostand nach der Einzahlung zeigen:
Owner: {ownerName}
Balance: {finalBalance}Wenn die Eingaben beispielsweise Maria, 500 und 150 sind, sollte die Ausgabe wie folgt aussehen:
Owner: Maria
Balance: 650Denken Sie daran: Das Unterstrich-Präfix bei _balance signalisiert anderen Programmierern, dass auf dieses Feld über Methoden wie :getBalance() und :deposit() zugegriffen werden sollte und nicht direkt. Das Feld owner ohne Unterstrich zeigt an, dass ein öffentlicher Zugriff in Ordnung ist.
Spickzettel
In Lua sind standardmäßig alle Tabellenfelder öffentlich zugänglich. Um zu kommunizieren, welche Felder als interne Implementierungsdetails behandelt werden sollten, verwenden Sie die Underscore-Namenskonvention, indem Sie privaten Feldern einen Unterstrich (_) voranstellen.
Der Unterstrich erzwingt keine Privatsphäre – er ist ein Signal an andere Programmierer, dass auf das Feld über Methoden statt direkt zugegriffen werden sollte.
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 Verfolgung
}
setmetatable(obj, Player)
return obj
end
function Player:getHealth()
return self._health
end
function Player:takeDamage(amount)
self._health = self._health - amount
endDiese Konvention trennt die Schnittstelle (was andere verwenden sollten) von der Implementierung (wie es intern funktioniert), wodurch der Code wartungsfreundlicher wird, wenn Änderungen erforderlich sind.
Probier es selbst
-- Erfordert das BankAccount-Modul
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 Endstand 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 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