In Lektion 5 hast du gelernt, dass eine Funktion wiederverwendbarer Code ist, der Befehle zum Ausführen einer Aktion oder zum Erstellen eines Outputs je nach Input bereitstellt.
Zum Definieren einer Funktion sind drei Hauptbestandteile erforderlich: eine einzigartige Kennung, der als Ergebnis zu erwartende Informationstyp und die Wirkungsweise der Funktion, wenn sie aufgerufen wird.
So definierst du eine Funktion
Funktionssignaturen
In Lektion 3 hast du gelernt, wie man eine Variable oder Konstante deklariert, indem man sie benennt und den Typ des zu verwendenden Werts vergibt.
Eine Funktionssignatur funktioniert ähnlich. Die Funktionssignatur verwendet eine einzigartige Kennung für die Funktion zusammen mit den Parametern, die den benötigten Input beschreiben, und schließlich den Rückgabetyp für das Ergebnis oder den Output.
Die eigentliche Wirkungsweise der Funktion ist im Codeblock definiert.
Codeblock
Der Codeblock ist die Gruppe der Ausdrücke, die auf die Funktionssignatur folgt. Dies ist die Syntax der Funktion und ihres Codeblocks:
name() : type =
codeblock
Es gibt mehrere Methoden zur Formatierung eines Codeblocks. Eine Möglichkeit besteht darin, die Codezeilen nach der Kennung einzurücken. Das siehst du in der obigen Funktionssyntax. (Später erfährst du mehr darüber, wie Codeblocks eingerichtet werden. Bis dahin kannst du diese verwenden.)
Die Ausdrücke im Codeblock definieren die eigentliche Wirkungsweise dieser Funktion bei ihrem Aufruf.
Diese Ausdrücke werden nur ausgeführt, wenn diese Funktion aufgerufen wird. Wenn das Programm am Ende dieses Codeblocks angelangt ist, sind diese Ausdrücke fertig – zumindest bis zum nächsten Aufruf dieser Funktion. Dann führt das Programm das nächste Stück Code aus, das auf diesen Funktionsaufruf folgt.
Körper
Der Codeblock wird auch Körper genannt, wenn er die Wirkungsweise der Funktion definiert.
Bereich
Bisher hast du Folgendes gelernt:
- Eine Funktion verfügt über eine einzigartige Kennung, mit der sie aktiviert wird, um etwas im Programm zu bewirken.
- Die Wirkungsweise einer Funktion basiert auf den Ausdrücken im Funktionskörper.
- Wenn die letzte Codezeile im Körper fertig ist, wird der Funktionsaufruf beendet, und das Programm geht zur nächsten Codezeile nach dem Funktionsaufruf im Programm über.
Die Befehle in dieser Funktion und jegliche Werte, die aus der Funktion kommen, bestimmen den Bereich der Funktion.
An dieser Stelle wollen wir auf die Ausdrücke zurückkommen, die man zum Definieren der Funktion verwenden kann. Du kannst Konstanten und Variablen (die du aus Lektion 3 kennst) erstellen und zum Funktionskörper hinzufügen.
Wenn du eine Variable in den Körper einfügst, befindet sie sich lokal im Funktionsbereich. Lokal bedeutet in diesem Zusammenhang, dass dieser Code nur in diesem Körper existiert und funktioniert und nur, wenn die Funktion aufgerufen wird.
Was ist dann der Bereich? Es ist die Assoziation des Funktionsnamens mit dem von der Funktion erzeugten Wert. Dieser Wert kann nur innerhalb des Codeblocks verwendet werden, in dem er erstellt wird – oder innerhalb dieses Bereichs.
Instanziierung
Eine Instanz ist eine einzigartige Anwendung dieser Funktion, wenn sie aufgerufen oder ausgeführt wird. Wenn diese Instanz erstellt wird, ist das die Instanziierung. Beachte, dass es sich dabei um sehr kurze Zeitspannen handelt.
Was uns zum Konzept der Lebenszeit führt.
Lebenszeit
Eine Instanz hat eine Lebenszeit – mit Anfang, Mitte und Ende.
Das bedeutet, dass die Lebenszeit dessen, was sich in diesem Funktionskörper befindet, auf den Bereich des Körpers begrenzt ist und man nicht auf die lokalen Variablen (die auf diesen aktuellen Bereich begrenzt sind) außerhalb des Bereichs zugreifen kann.
Bedingungen
Im folgenden Beispiel siehst du, wie die maximale Anzahl an Mausefallen, die ein Spieler mit seinen Münzen kaufen kann, berechnet wird.
Die Konstante MousetrapsYouCanBuy wird innerhalb des if-Blocks erstellt, und der Bereich ist auf den if-Block begrenzt.
Wenn die Konstante MaxMousetrapsYouCanBuy außerhalb des if-Codeblocks verwendet wird, führt dies zu einem Fehler, da der Name MaxMousetrapsYouCanBuy nicht außerhalb des Bereichs existiert. Die Fehlermeldung Unbekannte Kennung wird angezeigt. Das bedeutet, dass MaxMousetrapsYouCanBuy nur innerhalb dieses Bereichs gültig ist.
Wenn der Ausdruck abgeschlossen ist, existieren die im Körper erstellten lokalen Konstanten und lokalen Variablen nicht mehr. Sie haben das Ende ihrer Lebenszeit erreicht.
Stell dir den Bereich als einen kleinen Brocken Code vor, bei dem Dinge nur so lange funktionieren, bis sie fertig sind.
Funktionssyntax
Werfen wir noch einmal einen Blick auf die Funktionssyntax, aber diesmal schauen wir etwas genauer hin.
name() : type =
codeblock
name() : type = |
Dies ist die Funktionssignatur. Sie besteht aus Die Funktionssignatur enthält den Typ des zu verwendenden Inputs. Der Wert, den die Funktion zurückgibt (der Teil nach dem |
codeblock |
Im Codeblock der Funktion, oder Körper, fügst du Konstanten, Variablen oder andere Ausdrücke hinzu, welche die Wirkungsweise der Funktion beim Aufruf zeigen. |
Eine Funktion zum Bezahlen einer Mausefalle könnte beispielsweise wie folgt aussehen:
var Coins : int = 500
CoinsPerMousetrap : int = 100
BuyMousetrap() : void =
set Coins = Coins - CoinsPerMousetrap
Print("Du hast eine Mausefalle gekauft! Du hast noch {Coins} Münzen übrig.")
Die Benennungskonventionen und -regeln für Funktionsnamen sind die gleichen wie die, die du für Variablen und Konstanten verwenden würdest. Da Funktionen eine Sequenz von Aktionen durchführen, ist es eine gute Vorgehensweise, sie so zu benennen, dass sie die durchgeführten Aktionen widerspiegeln, z. B. BuyMousetrap().
Void
Vielleicht ist dir void in der Funktionssignatur für BuyMousetrap() aufgefallen. Der Void-Typ für eine Funktion bedeutet, dass dessen Funktionsaufruf nichts zurückgibt. In der nächsten Lektion erfährst du mehr darüber, was 'void' ist und wie du es verwendest.
Wiederhol dich nicht (das „DRY-Prinzip“)
Ein wichtiges Prinzip in der Programmierung lautet: Don’t Repeat Yourself (also „Wiederhol dich nicht“).
Das DRY-Prinzip besagt: Wenn du eine Codezeile dreimal oder öfter wiederholst, solltest du in Betracht ziehen, sie anders zu schreiben. Und ja, dafür gibt es einen Grund!
Je mehr Codezeilen du schreibst, desto schwieriger ist dieser Code zu pflegen. Zudem werden Bugs umso wahrscheinlicher, wenn du den Code an einer Stelle änderst, an einer anderen aber nicht.
Durch Funktionen kannst du ebenso wie durch Konstanten vermeiden, dass du Code unnötig wiederholst. Somit ersparen dir Funktionen nicht nur das Duplizieren von Code, sondern sie Verringern auch den Wartungsaufwand und die Wahrscheinlichkeit von Codefehlern.
Achte beim Schreiben von Code auf die verwendeten Großbuchstaben. Das gilt sowohl für die Benennung deiner Ausdrücke und Funktionen als auch für die Verwendung von Schlüsselwörtern und eingebauten Funktionen. In Verse gilt die Berücksichtigung der Groß-/Kleinschreibung. Falsch und uneinheitlich verwendete Großbuchstaben können zu Bugs und Kompilierungsfehlern führen.
Zusammenfassung
- Eine Funktion ist wiederverwendbarer Code, der Befehle zum Ausführen einer Aktion oder zum Erstellen eines Outputs je nach Input bereitstellt.
- Funktionen brauchen drei Bestandteile: eine Kennung, einen Typ und einen Codeblock mit dem Ergebnis der Funktion bei deren Aufruf.
- Funktionen werden nach ihren Funktionssignaturen aufgerufen.
- Ein Codeblock wird auch Körper genannt, wenn er die Wirkungsweise der Funktion definiert.
- Der Bereich bezieht sich auf den einer Funktion zugehörigen Wert, der wiederum durch den Inhalt des Codeblocks definiert wird.
- Code innerhalb eines Codeblocks befindet sich lokal in diesem Bereich.
- Die Lebenszeit ist die Spanne dieses Bereichs.
- Wiederhol dich nicht (das „DRY-Prinzip“).
Zeit zum Üben!
%learn-code-basics-6-practice-time-in-verse:topic%