X
    Categories: Technik

Programmcode in Unterprogrammen / Funktionen modularisieren

Die Gliederung eines Programms in Unterprogramme (Funktionen) bringt viele Vorteile mit sich. Dieser Artikel beschreibt Unterprogramme sprachunabhängig.

In diesem Artikel lernen Sie die Grundlagen zu Funktionen kennen. Dabei wird nicht auf die Syntax von C / C++ oder einer anderen Programmiersprache eingegangen, sondern es werden nur die theoretischen Grundlagen erläutert.

Was sind Funktionen?

Funktionen sind sogenannte Unterprogramme – Programmteile, die aus dem Hauptprogramm ausgegliedert werden. Das Hauptprogramm und die Unterprogramme sind prinzipiell unabhängig voneinander. Das Hauptprogramm kann Unterprogramme aufrufen, aber Unterprogramme können sich auch gegenseitig aufrufen.

Da diese Programmteile voneinander unabhängig sind, kennen die Unterprogramme die in anderen Unterprogrammen deklarierten Variablen nicht. Aus diesem Grund müssen die Funktionen sich gegenseitig Variablen übergeben.

Das Programm startet mit dem Hauptprogramm, der Main-Funktion. Sie ist streng genommen ebenfalls eine Funktion, die genau einmal aufgerufen wird. Dies geschieht automatisch. Die Main-Funktion kann, wie in Bild 1 zu sehen, Unterprogramme aufrufen. Aber auch Unterprogramme selbst können andere Funktionen aufrufen. Dieser Sachverhalt ist in Bild 2 dargestellt.

In beiden Fällen geschieht folgendes: Eine Funktion ruft an einer bestimmten Stelle im Quellcode eine andere Funktion auf. Die aufrufende Funktion wird unterbrochen und stattdessen wird das Unterprogramm durchgeführt, bis dieses beendet ist. Anschließend fährt die aufrufende Funktion mit ihrer Arbeit fort. Funktionsaufrufe können beliebig häufig geschehen.

Was bedeutet Parameterübergabe?

Parameter oder Argumente sind Variablen, die eine Funktion an eine andere Funktion übergibt. Bild 3 zeigt die Funktionsweise einer Parameterübergabe. In der aufrufenden Funktion, im Bild die Main-Funktion, werden Variablen deklariert. Diese Variablen werden an das Unterprogramm übergeben und dieses kann die Variablen weiterverarbeiten. Übergabeparameter darf es beliebig viele geben.

Ein einfaches Beispiel: Stellen Sie sich eine Funktion namens Quadriere vor. Im Hauptprogramm gibt der Benutzer eine Zahl ein. Anschließend ruft das Hauptprogramm Quadriere auf und übergibt die vom Benutzer eingegebene Zahl an die Funktion. Diese kann diesen Wert nun weiterverarbeiten, also das Quadrat dieser Zahl berechnen.

Die Parameterübergabe kann in C++ auf zwei Arten erfolgen:

  • Call-by-Value
  • Call-by-Reference

Normalerweise wird eine Funktion per Call-by-Value aufgerufen. Dabei wird eine Kopie der übergebenen Variable angelegt und an das Unterprogramm weitergegeben. Wenn der Übergabewert im Unterprogramm verändert wird, hat das keinerlei Auswirkungen auf die Originalvariable im Hauptprogramm, denn es wird schließlich nur mit einer Kopie gearbeitet.

Bei Call-by-Reference wird keine Kopie angelegt, sondern es wird mit einem Verweis auf die Originalvariable gearbeitet. Damit haben Änderungen im Unterprogramm direkte Auswirkungen auf die Originalvariable. Call-by-Reference wird mit den sogenannten Zeigern realisiert und soll kein Thema dieses Artikels sein.

Was bedeutet Werterückgabe?

Ein Unterprogramm kann einen Wert an die aufrufende Funktion zurückgeben. Diesen Sachverhalt sehen Sie in Bild 4. Im Beispiel kann die Funktion Quadriere das Quadrat des Übergabeparameters berechnen. Anschließend liefert sie den berechneten Wert an das Hauptprogramm zurück, so dass dieses den Wert auf dem Bildschirm ausgeben kann. Wichtig ist dabei, dass ein Unterprogramm nur höchstens einen Wert zurückgeben kann.

Warum sollte man in Unterprogrammen keine Werte auf dem Bildschirm ausgeben?

Sie sollten in Unterprogrammen Ausgaben vermeiden. Die Funktionen sollten nur Berechnungen durchführen. Überlassen Sie die Bildschirmausgabe nicht den Berechnungsfunktionen, sondern schreiben Sie sich eigene Funktionen für diesen Zweck.

Das hat den folgenden Vorteil: Nehmen wir einmal an, Sie vermischen die Ausgabe- und Berechnungsfunktionalitäten in einem Unterprogramm. In unserem Beispiel programmieren Sie die Ausgabe der quadrierten Zahl im Unterprogramm Quadriere. Dabei handelt es sich um eine Konsolenausgabe.

Nun möchten Sie ein Programm mit grafischer Oberfläche schreiben und Ihr Unterprogramm Quadriere in diesem verwenden. Sie müssen nun im Unterprogramm Veränderungen vornehmen, um dieses an die grafische Oberfläche anzupassen. Halten Sie die Berechnungsfunktionen jedoch unabhängig von der Ausgabe, ist dies nicht notwendig. Da sich in unserem Beispiel das Hauptprogramm und nicht das Unterprogramm um die Bildschirmausgabe kümmert, kann es Ihrer Funktion vollkommen gleichgültig sein, wie die Ausgabe erfolgt. Somit kann das Unterprogramm überall verwendet werden, ohne dass Änderungen notwendig werden.

Denn die Realisierung der Bildschirmausgabe ist die Aufgabe von anderen Programmteilen. Und diese rufen Quadriere auf, übergeben den eingegebenen Wert, warten auf das Ergebnis und geben dieses auf die gewünschte Art aus. Und das Unterprogramm bekommt nicht mit, ob das Ergebnis nun in der DOS-Box, einer grafischen Fensteroberfläche oder auf einer Internetseite ausgegeben wird.

Vorteile von Unterprogrammen

Nun stellt sich natürlich die Frage, wozu man Unterprogramme überhaupt braucht. Funktionen haben einige sehr große Vorteile. Der größte Vorteil ist die Modularisierung des Programms. Das bedeutet, dass der gleiche Quellcode nicht mehrmals in den Quelltext eingetragen werden muss. Das erhöht natürlich die Übersichtlichkeit, die Erweiterbarkeit und die Wartbarkeit.

Wenn Sie denselben Code mehrmals eintragen und dann feststellen, dass er fehlerhaft ist, oder wenn sie ihn erweitern müssen, müssen Sie diese Änderungen an mehreren Stellen durchführen. Haben Sie den entsprechenden Code in ein Unterprogramm ausgegliedert, müssen Sie nur an einer einzigen Stelle Änderungen durchführen.

Dadurch wird Ihr Quellcode auch besser wiederverwertbar. Sie können eine Funktion für ein Programm schreiben. Wenn Sie später feststellen, dass Sie sie auch in einem anderen Programm benötigen könnten, brauchen Sie den Code nicht neu zu schreiben. Sie können das Unterprogramm im Idealfall ohne Änderungen in ein anderes Programm übernehmen. Dafür ist es natürlich wichtig, dass das Unterprogramm möglichst unabhängig vom Hauptprogramm ist. Voraussetzung dafür ist eine durchdachte Schnittstellendeklaration – also richtige Übergabe- und Rückgabewerte, denn über diese kommuniziert das Unterprogramm mit anderen Programmteilen.

Die Unterprogrammtechnik ist eine sehr wichtige Technik, um gute Programme zu schreiben. Sie sollten sich die Arbeit mit Funktionen möglichst früh aneignen und auch konsequent durchführen. Die Vorteile werden Sie zu schätzen lernen.