Berechnete Eigenschaften
Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 15 von 70.
Getter und Setter bieten Zugriff auf gespeicherte Werte, aber manchmal benötigen Sie Daten, die nicht als gespeichertes Feld existieren – sie müssen aus anderen Attributen berechnet werden. Diese werden als berechnete Eigenschaften bezeichnet.
Betrachten Sie ein Rechteck. Sie speichern dessen Breite und Höhe, aber die Fläche wird nirgendwo gespeichert – sie wird berechnet, indem diese beiden Werte miteinander multipliziert werden. Anstatt redundante Daten zu speichern, erstellen Sie eine Methode, die das Ergebnis berechnet und zurückgibt:
local Rectangle = {}
Rectangle.__index = Rectangle
function Rectangle:new(width, height)
local instance = {}
setmetatable(instance, self)
instance.width = width
instance.height = height
return instance
end
function Rectangle:getArea()
return self.width * self.height
endDie :getArea()-Methode gibt keinen gespeicherten Wert zurück – sie berechnet die Fläche jedes Mal neu, wenn Sie sie aufrufen. Dieser Ansatz hat einen entscheidenden Vorteil: Wenn sich die Breite oder Höhe ändert, spiegelt die Fläche automatisch die neuen Dimensionen wider, ohne dass Sie etwas aktualisieren müssen.
local box = Rectangle:new(5, 3)
print(box:getArea()) -- Ausgabe: 15
box.width = 10
print(box:getArea()) -- Ausgabe: 30Berechnete Eigenschaften halten Ihre Objekte konsistent. Anstatt Werte zu speichern, die von anderen Feldern abhängen (und zu riskieren, dass diese veralten), berechnen Sie diese bei Bedarf. Dieses Muster gilt für alle abgeleiteten Daten – Umfänge, Durchschnitte, formatierte Zeichenfolgen oder jeden Wert, der aus vorhandenen Attributen bestimmt werden kann.
Aufgabe
EinfachLassen Sie uns eine Box-Klasse erstellen, die ihr Volumen bei Bedarf berechnet! Anstatt das Volumen als Feld zu speichern, erstellen Sie eine berechnete Eigenschaft, die es bei Bedarf aus den Abmessungen der Box berechnet.
Sie werden Ihren Code auf zwei Dateien aufteilen:
Box.lua: Definieren Sie IhreBox-Klasse mit dem Standard-Prototyp-Muster. Jede Box speichert drei Dimensionen:width,heightunddepth. Fügen Sie Folgendes hinzu:- Einen
:new(width, height, depth)-Konstruktor, der alle drei Dimensionen speichert - Eine
:getVolume()-Methode, die das Volumen berechnet und zurückgibt (width × height × depth) - Eine
:getSurfaceArea()-Methode, die die gesamte Oberfläche berechnet und zurückgibt
- Einen
main.lua: Binden Sie Ihr Box-Modul ein, erstellen Sie eine Box-Instanz und demonstrieren Sie, wie die berechneten Eigenschaften automatisch die aktuellen Dimensionen widerspiegeln.
Die Oberfläche einer Box wird wie folgt berechnet: 2 × (width×height + height×depth + width×depth)
Sie erhalten drei Eingaben, die die Abmessungen der Box darstellen:
- Breite (Width)
- Höhe (Height)
- Tiefe (Depth)
Erstellen Sie in Ihrer Hauptdatei eine Box mit den angegebenen Dimensionen und geben Sie dann zwei Zeilen aus:
- Das Volumen unter Verwendung von
:getVolume() - Die Oberfläche unter Verwendung von
:getSurfaceArea()
Wenn die Eingaben beispielsweise 3, 4 und 5 sind, sollte die Ausgabe wie folgt aussehen:
60
94Das Schöne an berechneten Eigenschaften ist, dass sie immer korrekt bleiben. Wenn Sie später eine der Dimensionen der Box ändern würden, würde ein erneuter Aufruf von :getVolume() automatisch den korrekten neuen Wert zurückgeben – keine manuellen Aktualisierungen erforderlich!
Spickzettel
Berechnete Eigenschaften sind Methoden, die Werte auf der Grundlage anderer Attribute berechnen und zurückgeben, anstatt sie direkt zu speichern. Dies gewährleistet die Datenkonsistenz und vermeidet Redundanz.
Beispiel für eine berechnete Eigenschaft für die Fläche:
local Rectangle = {}
Rectangle.__index = Rectangle
function Rectangle:new(width, height)
local instance = {}
setmetatable(instance, self)
instance.width = width
instance.height = height
return instance
end
function Rectangle:getArea()
return self.width * self.height
endDie Methode :getArea() berechnet die Fläche bei jedem Aufruf neu und berücksichtigt dabei automatisch alle Änderungen an Breite oder Höhe:
local box = Rectangle:new(5, 3)
print(box:getArea()) -- Ausgabe: 15
box.width = 10
print(box:getArea()) -- Ausgabe: 30Berechnete Eigenschaften sind nützlich für alle abgeleiteten Daten wie Umfänge, Volumina, Mittelwerte oder formatierte Zeichenfolgen, die aus vorhandenen Attributen bestimmt werden können.
Probier es selbst
-- Erfordert das Box-Modul
local Box = require('Box')
-- Eingabedimensionen lesen
local width = tonumber(io.read())
local height = tonumber(io.read())
local depth = tonumber(io.read())
-- TODO: Erstelle eine Box-Instanz mit den gegebenen Dimensionen
-- TODO: Gib das Volumen mit :getVolume() aus
-- TODO: Gib die Oberfläche mit :getSurfaceArea() aus
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