Was ist eine Funktion?-Oder, warum das Rad neu erfinden?

Keylearnings:

  • Was ist eine Funktion bzw. Methode?
  • Was ist die Parameterliste einer Funktion?
  • Was ist der Rückgabewert einer Funktion?
  • Gibt es einen Unterschied zwischen einer Funktion und einer Methode?

Erwischt! Du führst gerade eine Funktion aus!!

Was ich?

Ja du!! Und das finde ich super!

Lass mich das erklären!

Du schaust dir gerade die Seite www.codeadventurer.de (Danke dafür!!) in deinem Webbrowser an. Dies ist nur möglich, weil dein Browser eine Funktion verwendet, mit der der HTML Code (die Beschreibungssprache einer Webseite) in das umgewandelt wird was du gerade auf dem Bildschirm siehst.

Selbstveständlich kann dein Browser auch andere Webseiten, wie z.B. facebook oder Google darstellen.

Mit jeder dieser Seiten muss der Browser dasselbe Prozedre durchführen. Immer muss der HTML Code in das übersetzt werden, was du auf deinem Bildschirm siehst.

Funktion google anzeigen

Es gibt also drei Programme, eines für codeadventurer.de, ein zweites für google und ein drittes für facebook, welches den HTML Code der jeweiligen Seite übesetzt.

NEIN!!!! Das ist natürlich blanker Unsinn!

Danke Funktion!

Funktionen ermöglichen es uns den SELBEN Programmcode auf unterschiedliche Eingabedaten anzuwenden.

Der Programmcode, der den HTML-Code übersetzt und im Browser darstellt, muss also nur ein EINZIGES mal geschrieben werden und kann dann mit Hilfe von Funktionen auf jedes HTML-Dokument der Welt angewendet werden.

Wie ist eine Funktion aufgebaut?

Eine Funktion hat drei wesentliche Bestandteile:

  1. Übergabeparameter (Parameterliste)
  2.  einen Funktionsnamen
  3. genau einen Rückgabewert

In unserem Beispiel gibt es genau einen Übergabeparameter, der den Namen der aufzurufenden Seite also codeadventurer.de, google.de oder facebook.com annimmt.

Ein sinnvoller Funktionsname wäre z.B. HTMLSeiteAnzeigen. Der Rückgabewert ist dann die aus dem HTML -Code übersetzte Seite, die du auf dem Bildschirm siehst.

Am besten kann man sich den Aufbau einer Funktion anhand einer Skizze veranschaulichen.

Funktion bzw. Methode in Java

Die Skizze zeigt den Funktionskopf einer Funktion in JAVA. Aber keine Bange, wenn du das verstanden hast, dann wirst du auch in jeder anderen Programmiersprache damit keine Probleme haben.

Lass uns mit einem Köpper vom 10er ins eiskalte Wasser springen! Schauen wir uns an, wie Funktionen in Java verwendet werden.

Wir gehen in zwei Schritten vor. Als erstes werde ich dir zeigen wie du eine eigene Funktion erstellst. Anschließend wirst du sehen wie man diese dann auf verschiedene Eingadaten anwendet.

Die Funktionsdefinition!

Achtung ! Jetzt kommt eine JAVA Funktion!

1: public static boolean genugGeld(double dKontoStand,
                                     double dBetrag){
2:    if (dKontoStand >= dBetrag){
3:        return true;
4:    }else{
5:        return false;
6:    }
7:}

Streng dich an! 😉 Hast du eine Vorstellung wofür das gut ist?

Du erinnerst dich bestimmt an Franka’s Bohrmaschine. Franka’s Bohrmaschine kostete 190 Euro, welche sie sich natürlich nur leisten kann, wenn sie genügend Geld auf ihrem Konto hat.

Über die Funktion genugGeld können wir überprüfen, ob ein bestimmter Geldbetrag von Franka’s Konto gedeckt werden kann.  Das passiert über eine if-Abfrage, die überprüft, ob der Betrag für die Kosten der Bohrmaschine kleiner oder gleich dem Kontostand ist.

Ist die Bedingung erfüllt, ist der Rückgabewert der Funktion der Wahrheitswert true andernfalls false.

Also tun wir Butter bei die Fische!

Der Funktionsaufruf!

1:if (genugGeld(1500.99,190) == true){
2:    System.out.println("Franka freut sich über eine
                                      neue Bohrmaschine!");
3:}else{
4:    System.out.println("Franka kann sich leider keine 
                                         Bohrmaschine kaufen!");
5:}

Gleich vorweg! Die Ausgabe dieses Programms ist "Franka freut sich über eine neue Bohrmaschine!".

In dem Bedingungsteil der if..then..else Anweisung rufen wir die Funktion genugGeld auf wodurch der Programmcode in der Funktionsdefinition, der zwischen dem ersten Paar geschweifter Klammern steht (Zeile 2 bis 6) ausgeführt wird. Diesen Teil nennt man Funktionsrumpf.

Welche Werte haben die Variablen dKontostand und dBetrag?

Hier kommen die Parameter innerhalb der Klammern direkt nach dem Funktionsnamen, die der Fachmann Parameterliste nennt ins Spiel.

Entscheidend ist hier der Kopf der Funktion.

public static boolean genugGeld(double dKontoStand,
                                       double dBetrag)

Vergiss bitte im Moment die Schlüsselwörter public und static. Hierzu kommen wir später.

Du musst auf die Reihenfolge achten, in der die Parameter in der Parameterliste stehen!

In den Klammern nach dem Funktionsnamen genugGeld, also in der Parameterliste, steht an erster Stelle die Variable dKontoStand.

In unserem Funktionsaufruf haben wir an erster Stelle den Wert 1500.99 stehen, weshalb dKontoStand den Wert 1500.99 zugewiesen bekommt.

An zweiter Stelle, der Fachmann redet von Parameter Nummer zwei, steht die Variable dBetrag. Um herauszufinden, welchen Wert diese Variable bekommt müssen wir wieder unseren Funktionsaufruf

genugGeld(1500.99,190);

betrachten. Genauer den zweiten Wert innerhalb der runden Klammern. Hier steht 190, weshalb die Variable dBetrag den Wert 190 bekommt.

Die Werte, die wir an die Funktion übergeben werden Argumente genannt.

Kim, und wie funktioniert das jetzt mit dem Rückgabewert?

Um aus einer Funktion einen Wert zurückzugeben gibt es das Schlüsselwort return. Dieses sorgt dafür, dass in unserem Beispiel, in Abhängigkeit von Franka’s Kontostand und dem Preis der Bohrmaschine entweder der Wert FALSE oder TRUE zurückgeliefert wird.

Auf den Rückgabewert greifen wir in unserer if..then..else Anweisung in Zeile eins einfach über den Funktionsnamen zu!

Wichtig ist, dass du bei der Definition der Funktion den Typ des Rückgabewertes festlegst. Das machst du in dem du den Typ des Rückgabewertes einfach vor den Namen der Funktion schreibst.

In unserem Beispiel ist der Rückgabewert ein Wahrheitswert, also vom Typ boolean.

Abarbeitung einer JAVA Methode

Kim, muss jede Funktion einen Rückgabewert haben?

Nein! Hierfür gibt es das Schlüsselwort void. Dieses musst du verwenden, wenn deine Funktion keine Rückgabe liefern soll. Natürlich macht dann auch das Schlüsselwort return innerhalb der Funktion keinen Sinn und muss weggelassen werden.

Kim, aber wozu ist das gut?

Die besondere Sexiness an Funktionen ist, dass man Programmteile nur EINMAL programmieren muss und diese dann beliebig oft mit verschiedenen Eingabedaten aufrufen kann.

Häufig sind das Programmteile die zwar eine Aktion ausführen, die aber zu keinem Ergebnis führen, welches als Rückgabewert zurückgeliefert werden kann.

Einzigster Sinn deser Funktionen ist es Arbeit zu sparen!

Jippieh, wir dürfen also Faul sein?

Methoden erlauben Faulheit

Ja, so ist es!

Stell dir nur mal vor, du möchtest nicht nur von Franka wissen, ob sie sich eine Bohrmaschine leisten kann, sondern auch von ihrer Freundin Monika.

Die fleißigen unter uns würden jetzt den Programmcode für Franka kopieren und überall da wo Franka steht Monika hinschreiben.

Natürlich das geht! Aber clever ist das nicht!!

Der smarte Programmierer löst das Problem mit Hilfe von Fuktionen! Und zwar so:

1: public static void neueBohrmaschine(double dKontoStand,
                         double dBetrag,String personenName){
2:    if dKontoStand >= dBetrag{
3:      System.out.println(personenName+" freut sich über eine 
                                       neue Bohrmaschine!");
4:    }else{
5:      System.out.println(personenName+" kann sich leider keine 
                               neue Bohrmaschine leisten.");
6:    }
7:}

Okay, was macht diese Funktion?

Was haben wir nochmal über das Wörtchen void gelernt?

Korrekt, es handelt sich um eine Funktion ohne Rückagebewert. Deshalb ist auch nirgends das Schlüsselwort return zu entdecken.

Neben den üblichen Parametern für den Kontostand und den Preis für die Bohrmaschine haben wir als weiteren Parameter einen String PersonenName, über den wir Steuern können, für welche Person wir den Preis der Bohrmaschine gegen den Kontostand prüfen.

Der Name der Person, der in PersonenName gespeichert ist, wird dann in den Zeilen drei und fünf in der Bildschirmausgabe verwendet.

Jetzt haben wir es einfach! Hast du eine Idee, wie wir das ganze zu unserem Vorteil nutzen können?

Richtig! Wir müssen jetzt einfach die Funktion einmal für Franka und einmal für Monika aufrufen!

1: neueBohrmaschine(1500.99,190,"Franka");
2: neueBohrmaschine(100,190,"Monika");

Okay, welche Programmausgabe ist zu erwarten?

In Zeile eins rufen wir unsere Funktion mit den Parametern dKontoStand = 1500.99, dBohrmaschine = 190 und personenName = Franka auf, da der Kontostand bei Franka zum Kauf einer neuen Bohrmaschine ausreicht, ist die Ausgabe;

Franka freut sich über eine neue Bohrmaschine!

In Zeile zwei rufen wir unsere Funktion mit den Parametern dKontoStand = 100, dBohrmaschine = 190 und personenName = Monika auf, da der Kontostand bei Monika nicht zum Kauf einer neuen Bohrmaschine ausreicht, ist die Ausgabe:

Monika kann sich leider keine neue Bohrmaschine leisten.

Variablen als Parameter übergeben

In unserem Beispiel haben wir immer konkrete Werte wie 1500.99 oder "Franka" als Parameter an die Funktion übergeben.

Natürlich ist es auch möglich Variablen als Parameter zu verwenden. Schau dir mal folgendes Beispiel an:

1: double dKontostandFranka = 1500.99;
2: double dkostenBohrMaschineFranka = 190;
3: if (genugGeld(dKontostandFranka,dkostenBohrMaschineFranka) == true){
4:	System.out.println("Franka freut sich über 
                                     eine neue Bohrmaschine!");
5: }else{
6:	System.out.println("Franka ist traurig, weil 
                          sie keine neue Bohrmaschine bekommt.");
7:}

Okay, was ist das Ergebnis? Richtig! Kein anderes als oben. Auch hier darf sich Franka über eine neue Bohrmaschine freuen.

Einzigster Unterschied ist, dass wir in der if-Abfrage in Zeile drei anstatt der Werte 1500.99 und 190, Variablen dKontostandFranka und dkostenBohrMaschineFranka in denen diese Werte gespeichert sind an die Funktion genugGeld übergeben.

Was passiert wenn wir die Variablen, die wir übergeben innerhalb der Funktion manipulieren?

Nehmen wir mal an, Franka bekommt als gute Kundin einen Rabatt von 10 Euro auf jede Bohrmaschine. Um den Rabatt zu berücksichtigen müssen wir unsere Funktion wie folgt anpassen.

1: public static boolean genugGeld(double dKontoStand, 
                                       double dBetrag){
2:  double dRabatt = 10;
3:  dBetrag = dBetrag - dRabatt;
4:  if (dKontoStand >= dBetrag){
5:	return true;
6:  }else{
7:	return false;
8:}

In Zeile zwei initialisieren wir eine Variable dRabatt mit dem Rabatt-Betrag von 10Euro, den wir in Zeile drei von den Kosten für die Bohrmaschine subtrahieren.

Hat diese Manipulation Auswirkungen auf den Wert, der in der Variable dkostenBohrMaschineFranka gespeichert ist?

Probier es ruhig mal aus indem du dkostenBohrMaschineFranka auf dem Bildschirm ausgibst!

Die Antwort ist Nein! Das liegt einfach daran, dass innerhalb der Funktion lediglich mit einer Kopie namens dBetrag von dkostenBohrMaschineFranka gearbeitet wird, die nur während der Ausführung der Funktion existiert.

Innerhalb der Funktion kannst du auch nur mit dieser Kopie arbeiten. Die Variablen dKontostandFranka und dkostenBohrMaschineFranka sind innerhalb von genugGeld nicht bekannt.

Diese Kopie gibt es nur solange wie die Funktion genugGeld abgearbeitet wird.

Der Unterschied zwischen einer Funktion und einer Methode

Gerade im Zusammenhang mit objekorientierten Programmiersprachen wird gerne von Methoden anstatt von Funktionen gesprochen. Merke: Beides beschreibt die gleiche Logik es handelt sich lediglich um unterschiedliche Vokabeln!

Auch wird dir, insbesondere in der nicht objektorientierten Welt, häufiger der Name Unterprogramm begegnen. Meistens ist hiermit eine sogenannte Prozedur gemeint, was aber nichts anderes ist, als eine Funktion ohne Rückgabewert.

Ich hoffe ich konnte dir die Frage „Was ist eine Funktion?“ verständlich beantworten.

Wie immer freue ich mich über deine Fragen im Kommentarbereich!

Hat dir der Artikel gefallen? Dann folge uns doch am besten gleich auf Facebook!

Hallo ich bin Kim und ich möchte ein großer Programmierer werden. Machst du mit?

Kommentare (6)

  • Antworte

    Hi Kim
    sehr schön geschriebener Artikel !
    In dem Beispiel
    if dKontostand >= dBetrag {

    fehlen allerdings die runden Klammern um die Bedingung

    Gruß
    Sascha

    • Hallo Sascha, vielen Dank für den Hinweis. Habe es geändert! Viele Grüße Kim

  • Antworte

    Hi Kim
    guter Artikel, aber zu „Vergiss bitte im Moment die Schlüsselwörter public und static. Hierzu kommen wir später.“

    Entweder uebersehe ich es oder es wurde leider die Erklearung fuer static nicht mehr mitreingenommen?

    Gruss Sebastian

  • Antworte

    Hallo Kim, ich möchte ja nicht kleinlich sein, aber hier hast du beim Wort „Eingabedaten“ ein paar Buchstaben vergessen 😉
    „Wir gehen in zwei Schritten vor. Als erstes werde ich dir zeigen wie du eine eigene Funktion erstellst. Anschließend wirst du sehen wie man diese dann auf verschiedene Eingadaten anwendet.“

    • Hallo Josef, danke für den Hinweis. Ich habe es korrigiert. Viele Grüße Kim

Hinterlasse ein Kommentar