Menu
Coddy logo textTech

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
end

Der 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.

challenge icon

Aufgabe

Einfach

Lassen 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 _balance hinzu
    • :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:

  1. Der Name des Besitzers
  2. Der Anfangskontostand (eine Zahl)
  3. 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: 650

Denken 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
end

Diese 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}
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