Funktionsdefinition und -parameter

5 min 2 Abschnitte
Was du nach diesem Konzept kannst 5
  1. Du bist in der Lage, den Gültigkeitsbereich von Parametern und lokalen Variablen zu erklären ,

    indem die Unterschiede zwischen lokalen und globalen Variablen sowie die Auswirkungen auf den Programmablauf anhand von Codebeispielen in einer modernen Programmiersprache (z.B. Python, JavaScript) erläutert werden.

  2. Du bist in der Lage, die Bedeutung von Funktionen als fundamentale Bausteine strukturierter Programmierung zu erklären ,

    indem die Prinzipien der strukturierten Programmierung (Zerlegung, Abstraktion) auf die Verwendung von Funktionen bezogen werden.

  3. Du bist in der Lage, die Anwendung des Single-Responsibility-Prinzips (SRP) auf Funktionen zur Verbesserung von Wartbarkeit und Testbarkeit zu interpretieren ,

    indem dargelegt wird, wie die Beschränkung einer Funktion auf eine einzige, klar definierte Aufgabe zu kohäsiverem, weniger fehleranfälligem und leichter testbarem Code führt.

  4. Du bist in der Lage, die Definition einer Funktion zu erklären ,

    indem die grundlegende Syntax und Struktur einer Funktionsdefinition in einer modernen Programmiersprache (z.B. Python, JavaScript) erläutert und anhand eines einfachen Beispiels veranschaulicht wird.

  5. Du bist in der Lage, den Unterschied zwischen formalen Parametern (in der Funktionsdefinition) und tatsächlichen Argumenten (beim Funktionsaufruf) zu differenzieren ,

    indem anhand von Codebeispielen die jeweilige Rolle und der Zeitpunkt ihres Auftretens (Definition vs. Aufruf) erläutert und die Notwendigkeit der Übereinstimmung (Anzahl, ggf. Typ) von Argumenten mit Parametern begründet wird.

Warum sind Funktionen unverzichtbare Bausteine beim Programmieren?

Strukturierte Programmierung: Zerlegung und Abstraktion

Wenn du Programme schreibst, wächst der Quellcode schnell an und wird unübersichtlich. Hier greift das Konzept der strukturierten Programmierung, das auf zwei Hauptprinzipien beruht: Zerlegung (Decomposition) und Abstraktion.

Stell dir vor, du entwickelst die Software für einen Onlineshop. Anstatt den gesamten Code in einen riesigen, monolithischen Block zu schreiben, zerlegst du das Programm in kleinere, logische Einheiten – die Funktionen. Eine Funktion ist ein benannter, wiederverwendbarer Codeblock, der eine ganz spezifische Aufgabe ausführt (z. B. berechne_warenkorb_summe).

Durch die Abstraktion verbirgt die Funktion ihre komplexe interne Logik. Wenn du die Funktion später an einer anderen Stelle im Code aufrufst, musst du nicht mehr wissen, wie sie die Summe berechnet, sondern nur noch, dass sie es tut. Das macht deinen Code lesbarer, vermeidet redundante Wiederholungen und erleichtert die Fehlersuche enorm.

Das Single-Responsibility-Prinzip (SRP): Eine Aufgabe pro Funktion

Ein zentrales Qualitätsmerkmal für gut geschriebene Funktionen ist das Single-Responsibility-Prinzip (SRP). Es besagt, dass eine Funktion genau eine einzige, klar definierte Aufgabe haben sollte.

Ein Negativbeispiel: Eine Funktion liest Kund:innendaten aus einer Datenbank, berechnet einen Rabatt und generiert ein PDF-Dokument. Wenn sich nun das PDF-Format ändert, musst du diese überladene Funktion anpassen – mit der Gefahr, versehentlich die Rabattberechnung zu beschädigen.

Trennst du diese Aufgaben in drei separate Funktionen auf, wird dein Code kohäsiver (zusammenhängender). Da du bereits die Grundlagen von Software-Tests kennst, wird dir der größte Vorteil sofort einleuchten: Leichtere Testbarkeit. Eine Funktion, die ausschließlich den Rabatt berechnet, lässt sich hervorragend isoliert mit einem Unit-Test prüfen, ohne dass echte PDFs generiert werden müssen. Zudem sinkt die Fehleranfälligkeit und die Rabatt-Funktion kann problemlos in anderen Teilen der Applikation wiederverwendet werden.

Funktionsdefinition und -parameter — dec-software-engineering-programming-basics-functions-and-modularization-function-definition-and-parameters.svg

Wie werden Funktionen definiert und mit Daten versorgt?

Die Anatomie einer Funktionsdefinition

Um eine Funktion nutzen zu können, musst du sie zunächst definieren. In modernen Programmiersprachen wie Python oder JavaScript folgt dies einem klaren strukturellen Aufbau.

Eine Funktionsdefinition besteht aus einem Schlüsselwort zur Einleitung (in Python def, in JavaScript function), einem aussagekräftigen Funktionsnamen, runden Klammern für mögliche Eingabewerte und dem Funktionskörper (Body), der die eigentlichen Anweisungen enthält. Oft liefert eine Funktion am Ende ein Ergebnis über das Schlüsselwort return an die aufrufende Stelle zurück.

# Definition der Funktion in Python
def berechne_rechteck_flaeche(laenge, breite):
    # Funktionskörper mit der Logik
    flaeche = laenge * breite
    # Rückgabewert, der an den Aufrufer zurückgegeben wird
    return flaeche

Parameter vs. Argumente: Die Datenübergabe

Damit Funktionen flexibel arbeiten können, nehmen sie Daten von außen entgegen. Hierbei ist die strikte Unterscheidung zwischen Parametern und Argumenten essenziell:

  • Formale Parameter: Das sind die Platzhalter in der Funktionsdefinition (im Beispiel oben: laenge und breite). Sie verhalten sich wie Variablen, die darauf warten, beim Aufruf mit Werten gefüllt zu werden.
  • Tatsächliche Argumente: Das sind die konkreten Werte, die du beim Funktionsaufruf übergibst.
# Aufruf der Funktion mit den Argumenten 5 und 10
ergebnis = berechne_rechteck_flaeche(5, 10)
print(f"Die Fläche beträgt: {ergebnis}")

Wichtig: Beim Aufruf muss in der Regel eine strikte Übereinstimmung herrschen. Wenn die Funktion zwei Parameter erwartet, musst du exakt zwei Argumente übergeben. In streng typisierten Sprachen (wie Java oder C#) muss zudem der Datentyp (z. B. Integer) exakt passen, da das Programm sonst mit einem Fehler abbricht.

Der Gültigkeitsbereich (Scope): Lokal vs. Global

Ein entscheidendes Konzept beim Arbeiten mit Funktionen ist der Gültigkeitsbereich (Scope) von Variablen. Er bestimmt, wo im Code eine Variable existiert und gelesen werden kann.

  • Lokale Variablen: Variablen, die innerhalb einer Funktion erstellt werden (dazu zählen auch die Parameter!), sind lokal. Sie werden beim Aufruf der Funktion erschaffen und zerstört, sobald die Funktion beendet ist. Von außen kannst du nicht auf sie zugreifen.
  • Globale Variablen: Variablen, die außerhalb aller Funktionen definiert werden, sind global und im gesamten Skript sichtbar.
rabatt_aktion = 0.20  # Globale Variable (überall sichtbar)

def berechne_preis(basispreis):
    # 'basispreis' und 'endpreis' sind LOKALE Variablen
    endpreis = basispreis - (basispreis * rabatt_aktion)
    return endpreis

neuer_preis = berechne_preis(100)

# print(endpreis) --> FEHLER (NameError)! 
# Die Variable 'endpreis' existiert außerhalb der Funktion nicht.

Diese strikte Trennung ist ein Feature, kein Fehler: Sie schützt deinen Programmablauf. Da lokale Variablen nach außen abgeschirmt sind, kannst du in verschiedenen Funktionen denselben Variablennamen verwenden, ohne dass sie sich gegenseitig überschreiben oder unerwünschte Seiteneffekte auslösen.

Teste dein Wissen

Du entwickelst ein Kassensystem. Statt 2000 Zeilen Code am Stück zu schreiben, teilst du ihn in Blöcke wie `drucke_beleg` auf. Welches Prinzip wendest du hier an?

Bereit für mehr?

Thema verstanden?

Teste dein Wissen interaktiv in unserer App. 7 Tage kostenlos, dann nur 5 € im Monat.