Fachkonzept - Verwendung von Hilfsfunktionen
Die Grundidee
Ein Datenverarbeitungsproblem wird meist nicht mit einer einzigen Funktion gelöst. Vielmehr versucht man, für unterschiedliche Teilaufgaben bei der Datenverarbeitung eigenständige Funktionen einzuführen und diese dann geeignet zu verknüpfen.
Als einfaches Beispiel betrachten wir die Berechnung der Minimalanzahl an Fliesen für einen quaderförmigen Swimming-Pool. Die Fliesen sollen dabei quadratisch sein. Am Rand müssen ggf. Fliesen abgeschnitten werden, die Restfliesen können dann nicht weiter verwendet werden.
Verwendung einer einzigen Funktion
Die Berechnung lässt sich mit der Funktion anzahlFliesenPool
durchführen.
Funktionsdefinition:
anzahlFliesenPool laenge breite hoehe seiteFliese =
(1 * (ceiling (laenge / seiteFliese)) * (ceiling (breite / seiteFliese))) +
(2 * (ceiling (laenge / seiteFliese)) * (ceiling (hoehe / seiteFliese))) +
(2 * (ceiling (breite / seiteFliese)) * (ceiling (hoehe / seiteFliese)))
Funktionsaufruf:
> anzahlFliesenPool 5 3 2 0.38
376 : Int
In der vorliegenden Implementierung wird das Verarbeitungsproblem mit einer einzigen Funktion bearbeitet. Es fällt auf, dass der Ausdruck in der Funktion sehr lang und damit recht komplex ist. Zudem fällt auf, dass es in dem Ausdruck Teilausdrücke mit gleicher Struktur gibt: Die Anzahl der Fliesen wird mehrfach für unterschiedliche Rechtecke beschrieben. Es liegt hier Codeduplizierung vor, derselbe Teilausdruck kommt in ähnlicher Form mehrfach vor.
Verwendung mehrerer Funktionen
Ziel ist es, den Audruck in der Funktion möglichst einfach zu gestalten und insbesondere Codeduplizierung zu vermeiden. Das gelingt, wenn man eine zusätzliche Funktion als Hilfsfunktion einführt.
Hier eine Implementierung der Funktion anzahlFliesenPool
mit einer zusätzlichen Hilfsfunktion.
Funktionsdefinitionen:
anzahlFliesenRechteck laengeRechteck breiteRechteck seiteFliese =
(ceiling (laengeRechteck / seiteFliese)) * (ceiling (breiteRechteck / seiteFliese))
anzahlFliesenPool laenge breite hoehe seiteFliese =
(1 * anzahlFliesenRechteck laenge breite seiteFliese) +
(2 * anzahlFliesenRechteck laenge hoehe seiteFliese) +
(2 * anzahlFliesenRechteck breite hoehe seiteFliese)
Funktionsaufruf:
> anzahlFliesenPool 5 3 2 0.38
376 : Int
Im Funktionsausdruck der Funktion anzahlFliesenPool
wird die vorab definierte Hilfsfunktion anzahlFliesenRechteck
verwendet.
Auswertung bei der Verwendung mehrerer Funktionen
Bei einem Funktionsaufruf der Funktion anzahlFliesenPool
wird die Hilfsfunktion anzahlFliesenRechteck
wiederholt aktiviert und
liefern die jeweils Teilergebnisse, aus denen dann das Gesamtergebnis berechnet wird.
anzahlFliesenPool 5 3 2 0.38 -> (1 * anzahlFliesenRechteck 5 3 0.38) + (2 * anzahlFliesenRechteck 5 2 0.38) + (2 * anzahlFliesenRechteck 3 2 0.38) -> (1 * (ceiling (5 / 0.38)) * (ceiling (3 / 0.38))) + (2 * anzahlFliesenRechteck 5 2 0.38) + (2 * anzahlFliesenRechteck 3 2 0.38) -> 112 + (2 * anzahlFliesenRechteck 5 2 0.38) + (2 * anzahlFliesenRechteck 3 2 0.38) -> 112 + 168 + (2 * anzahlFliesenRechteck 3 2 0.38) -> 112 + 168 + (2 * (ceiling (3 / 0.38)) * (ceiling (2 / 0.38))) -> 112 + 168 + 96 -> 376
Verwendung von Hilfsfunktionen
Das Beispiel oben verdeutlicht, dass es günstig sein kann, wenn Teilaufgaben von Hilfsfunktionen ausgeführt werden.
Hilfsfunktionen tragen zur Strukturierung von Programmen bei:
Jeder, der schon einmal versucht hat, ein langes und kompliziertes Programm zu verstehen, weiß, wie schwierig das ist - insbesondere, wenn man das Programm nicht selbst geschrieben hat. Viel leichter wird es, wenn das Programm gut strukturiert ist. Dazu gehört insbesondere, Lösungen von Teilproblemen in Hilfsfunktionen auszulagern.
Hilfsfunktionen dienen zur Vermeidung von Code-Duplizierungen:
Es kommt öfters vor, dass ein Teilproblem mehrfach auftritt. Ohne Hilfsfunktionen müsste man ein und denselben Teilausdruck wiederholt in den Ausdruck einer Funktion schreiben. Mit Hilfsfunktionen kann dieses Teilproblem einmal gelöst werden. Danach kann man mit diese Hilfsfunktion im Ausdruck einer anderen Funktion verwenden.
Hilfsfunktionen nutzt man insbesondere dann, wenn diese eigenständige Probleme lösen und somit auch in anderen Kontexten verwendet werden können.