323

Programmierung · Funktionale Programmierung

Funktional programmieren

Du lernst, Programme aus kleinen, vorhersehbaren Funktionen zusammenzusetzen, die keine versteckten Nebenwirkungen haben.

Anspruchsvoll Anspruchsvoll ca. 25 Std. SelbststudiumApplikationsentwicklung: 3. Lehrjahr · Berufsfachschule
#Funktionale Programmierung#Pure Functions#Immutability#Higher-Order Functions#map / filter / reduce#Lambdas#Rekursion#Streams

Überblick

Worum geht es?

In der objektorientierten Welt verändern Objekte laufend ihren Zustand. Funktional zu denken heisst, Daten nicht zu verändern, sondern neue Daten zu erzeugen, und Abläufe als Kette von Transformationen zu beschreiben. Du schreibst reine Funktionen, arbeitest mit unveränderlichen Datenstrukturen und übergibst Funktionen als Werte. Mit map, filter und reduce ersetzt du viele Schleifen und baust bestehenden imperativen Code so um, dass er kürzer, testbarer und weniger fehleranfällig wird.

Wofür brauchst du das?

Funktionale Konzepte stecken heute in fast jeder Sprache, die du im Lehrbetrieb antriffst: Java Streams, C# LINQ, JavaScript-Array-Methoden, React-Hooks oder Redux-Reducer. Wer sie versteht, liest modernen Code schneller, macht weniger Fehler mit geteiltem Zustand und schreibt Logik, die sich leicht testen und parallelisieren lässt. Das zahlt sich direkt in Modul 321 (verteilte Systeme) und 450 (Testen) aus.

Das solltest du schon können

  • Klassen, Methoden, Listen und Interfaces sicher einsetzen (Modul 320)
  • Schleifen, Verzweigungen und Funktionen mit Parametern und Rückgabewerten schreiben (Modul 319)
  • Einfache Unit-Tests schreiben und ausführen

Typische Tools & Technologien

JavaScript / TypeScriptJava StreamsC# LINQKotlinNode.jsJest / JUnitVisual Studio Code / IntelliJ

Lernziele

Was musst du können?

Das sind die Fähigkeiten, die am Ende des Moduls sitzen sollten. Jedes Ziel mit einem Beispiel aus dem Lehrbetrieb.

  1. 1

    Funktionen ohne Seiteneffekte schreiben

    Kompetenz A

    Eine reine Funktion liefert für dieselbe Eingabe immer dasselbe Ergebnis und verändert nichts ausserhalb von sich selbst: keine globale Variable, keine Datei, keine Konsole. Du erkennst unreine Stellen und trennst Berechnung von Ein- und Ausgabe.

    Situation

    In einer Lohnsoftware eines Treuhandbüros in Zug liest die Funktion 'berechneNetto()' den Beitragssatz direkt aus einer globalen Konfiguration und schreibt das Ergebnis gleich in die Datenbank.

    Deine Aufgabe

    Trenne Berechnung und Speicherung, sodass die Berechnung isoliert testbar ist.

    Gutes Ergebnis

    'berechneNetto(brutto, saetze)' bekommt alle Werte als Parameter und gibt nur den Betrag zurück. Das Speichern passiert eine Ebene höher. Für die Berechnung gibt es jetzt zehn Tests ohne Datenbank.

    reine FunktionSeiteneffektreferenzielle TransparenzDeterminismus
  2. 2

    Mit unveränderlichen Daten arbeiten

    Kompetenz A

    Statt eine Liste oder ein Objekt zu ändern, erzeugst du eine neue Version mit der gewünschten Änderung. So kann kein anderer Programmteil unbemerkt deine Daten verändern, und Fehler durch geteilten Zustand verschwinden.

    Situation

    In einer Webapp für Kantinenmenüs eines Spitals erscheinen Änderungen an einem Menü plötzlich auch in der Vorwoche, weil beide Wochen auf dasselbe Array zeigen.

    Deine Aufgabe

    Ändere die Bearbeitungsfunktion so, dass sie das Original nicht verändert.

    Gutes Ergebnis

    Mit Spread-Syntax bzw. 'List.copyOf' und Records wird eine neue Woche erzeugt. Die Vorwoche bleibt unverändert, und der Fehler ist mit einem Test belegt und behoben.

    ImmutabilityKopie statt MutationRecord / readonlyReferenz vs. Wert
  3. 3

    Funktionen als Parameter übergeben und zurückgeben

    Kompetenz B

    Funktionen sind Werte wie Zahlen oder Texte. Du übergibst sie als Lambda an andere Funktionen, speicherst sie in Variablen und baust Funktionen, die neue Funktionen erzeugen. So wird Verhalten austauschbar, ohne Klassenhierarchien.

    Situation

    Ein Onlineshop für Outdoor-Ausrüstung in Chur hat sechs fast identische Sortierfunktionen für Preis, Name, Bewertung usw.

    Deine Aufgabe

    Ersetze sie durch eine einzige Funktion, der man das Sortierkriterium mitgibt.

    Gutes Ergebnis

    'sortiereNach(produkte, kriterium)' nimmt eine Funktion wie 'p => p.preis' entgegen. Eine kleine Fabrikfunktion 'absteigend(kriterium)' dreht die Reihenfolge. Aus 90 Zeilen werden 15.

    LambdaHigher-Order FunctionClosureFunktionstyp / Functional Interface
  4. 4

    Datenverarbeitung mit map, filter und reduce ausdrücken

    Kompetenz C

    Viele Schleifen machen eigentlich nur drei Dinge: Elemente umwandeln, auswählen oder zusammenfassen. Du schreibst solche Abläufe als lesbare Kette dieser Operationen, z.B. mit Java Streams, LINQ oder JavaScript-Array-Methoden.

    Situation

    Eine Spedition in Basel exportiert täglich 3000 Sendungen als Liste. Die Disposition will den Umsatz aller zugestellten Sendungen pro Kanton.

    Deine Aufgabe

    Berechne die Werte in einer einzigen Pipeline ohne Hilfsvariablen.

    Gutes Ergebnis

    filter auf Status 'zugestellt', dann groupBy Kanton, dann reduce zur Summe der Frachtkosten. Ergebnis z.B. BS: CHF 18'420, AG: CHF 12'905. Die Pipeline ist in sechs Zeilen klar lesbar.

    mapfilterreduce / foldgroupByLazy Evaluation
  5. 5

    Kleine Funktionen zu grösseren Abläufen zusammensetzen

    Kompetenz D

    Du baust komplexe Logik aus kleinen, einzeln getesteten Bausteinen, die du hintereinanderschaltest. Mit Komposition und Currying entstehen wiederverwendbare Schritte, die du wie Lego neu kombinierst.

    Situation

    Ein Kundendienst-Tool einer Versicherung in Lausanne muss Telefonnummern aus Formularen normalisieren: Leerzeichen entfernen, 0 durch +41 ersetzen, Format prüfen.

    Deine Aufgabe

    Setze die Normalisierung aus einzelnen Schritten zusammen.

    Gutes Ergebnis

    Drei Funktionen 'trimmen', 'laendervorwahl', 'formatPruefen', verbunden mit 'pipe'. Ein neuer Schritt für ausländische Nummern lässt sich einfügen, ohne die anderen anzufassen.

    Funktionskompositionpipe / composeCurryingpartielle Anwendung
  6. 6

    Rekursive Lösungen für verschachtelte Strukturen schreiben

    Kompetenz D

    Wenn Daten ineinander verschachtelt sind, wie Ordner, Organigramme oder Stücklisten, ist eine Funktion, die sich selbst aufruft, oft die natürlichste Lösung. Du definierst immer zuerst die Abbruchbedingung.

    Situation

    Ein Maschinenbauer im Jura speichert Stücklisten verschachtelt: Eine Baugruppe enthält Teile und weitere Baugruppen.

    Deine Aufgabe

    Berechne den Gesamtpreis einer Maschine aus allen Ebenen.

    Gutes Ergebnis

    'preis(element)' gibt bei einem Einzelteil den Teilepreis zurück, bei einer Baugruppe die Summe von 'preis' über alle Kinder. Die Lösung funktioniert für beliebig tiefe Strukturen.

    RekursionAbbruchbedingungBaumstrukturStack Overflow
  7. 7

    Imperativen Code schrittweise funktional umbauen

    Kompetenz E

    Du nimmst bestehenden Code mit Schleifen, Zählvariablen und geteiltem Zustand und baust ihn Stück für Stück um, abgesichert durch Tests. Du erkennst auch, wo ein funktionaler Stil keinen Mehrwert bringt.

    Situation

    Ein Reporting-Modul einer Gemeinde berechnet Steuerstatistiken mit verschachtelten for-Schleifen und fünf Hilfslisten. Niemand traut sich, es anzupassen.

    Deine Aufgabe

    Sichere das Verhalten mit Tests ab und baue die Berechnung funktional um.

    Gutes Ergebnis

    Zuerst acht Charakterisierungstests mit echten Beispieldaten. Danach ersetzen drei Pipelines die Schleifen. Alle Tests bleiben grün, der Code schrumpft von 140 auf 45 Zeilen.

    RefactoringCharakterisierungstestdeklarativ vs. imperativLesbarkeit

Selbsteinschätzung

Wo stehst du?

Die Kompetenzmatrix zerlegt das Modul in Themenstränge und drei Stufen. Für den Kompetenznachweis solltest du überall mindestens Stufe 2 erreichen. Dein Stand bleibt in diesem Browser gespeichert und färbt Lernweg und Übungen ein.

Tippe auf eine Aussage, um deinen Stand zu setzen: offen unsicher sitzt
A

Reine Funktionen und unveränderliche Daten

Ziel 1Ziel 2

Grundlagen

Fortgeschritten

Erweitert

B

Funktionen als Werte

Ziel 3

Grundlagen

Fortgeschritten

Erweitert

C

Datenpipelines

Ziel 4

Grundlagen

Fortgeschritten

Erweitert

D

Komposition und Rekursion

Ziel 5Ziel 6

Grundlagen

Fortgeschritten

Erweitert

E

Funktional refaktorieren

Ziel 7

Grundlagen

Fortgeschritten

Erweitert

Praxisfall

Die Stromauswertung des Energiewerks Seetal

Samira ist im 3. Lehrjahr als Informatikerin Applikationsentwicklung bei der Energiewerk Seetal AG in Hochdorf, einem regionalen Stromversorger mit 140 Mitarbeitenden. Seit alle Haushalte Smart Meter haben, berechnet ein TypeScript-Skript die Monatsrechnungen aus Viertelstundenwerten, doch einzelne Rechnungen sind falsch. Ihre Teamleiterin gibt ihr den Auftrag, die Auswertung verlässlich und nachvollziehbar zu machen.

  1. Kapitel 1

    Warum stimmt die Summe beim zweiten Mal nicht?

    Samira stellt fest, dass der Monatsverbrauch beim zweiten Aufruf doppelt so hoch ist wie beim ersten. Die Ursache: Eine globale Variable total wird nie zurückgesetzt, und die Messwertliste wird beim Sortieren direkt verändert. Sie markiert alle Seiteneffekte im Skript und schreibt summiereVerbrauch(messwerte) als reine Funktion. Statt die Liste zu sortieren, arbeitet sie mit einer Kopie per toSorted, damit die Originaldaten unverändert bleiben.

    Ziel 1Ziel 2

  2. Kapitel 2

    Hochtarif und Niedertarif

    Haushalte zahlen von Montag bis Freitag zwischen 7 und 20 Uhr 28 Rappen pro kWh, sonst 19 Rappen, Gewerbekunden haben eigene Zeiten. Statt einer weiteren if-Kette schreibt Samira eine Fabrikfunktion tarifFuer(regeln), die eine passende Preisfunktion zurückgibt. Ein neuer Gewerbetarif ist damit nur noch ein neues Regelobjekt. Ihr Kollege staunt, dass der Rechnungscode dafür nicht angefasst werden muss.

    Ziel 3

  3. Kapitel 3

    35'040 Werte pro Zähler

    Ein Jahr Viertelstundenwerte ergibt 35'040 Messpunkte pro Zähler, und das Werk hat über 2000 Gewerbezähler. Samira beantwortet die Fragen nach Verbrauch pro Monat, Spitzen-Viertelstunde und Anteil Niedertarif mit einer Pipeline aus filter, map und reduce. Die erste Version durchläuft die Daten dreimal und braucht 40 Sekunden. Sie fasst die Auswertung in einem einzigen reduce zusammen und kommt auf 12 Sekunden.

    Ziel 4

  4. Kapitel 4

    Zähler in Gebäuden in Arealen

    Auf einem Industrieareal hängen Unterzähler an Gebäudezählern, die wiederum am Arealzähler hängen, teils vier Ebenen tief. Samira schreibt eine rekursive Funktion, die den Verbrauch eines Knotens samt aller Unterzähler summiert. Die Rohdaten bereinigt sie mit einer pipe aus entferneDuplikate, fuelleLuecken und rundeAufWattstunden. Als ein falsch erfasster Zähler auf sich selbst verweist, läuft die Rekursion endlos, worauf sie besuchte IDs in einem Set mitführt.

    Ziel 6Ziel 5

  5. Kapitel 5

    Umbau ohne Risiko

    Das alte Rechnungsmodul hat 400 Zeilen voller verschachtelter Schleifen. Bevor Samira etwas ändert, hält sie mit 15 Jest-Tests auf anonymisierten Echtdaten fest, was das Modul heute liefert. Danach baut sie es in kleinen Schritten zu Pipelines um und lässt nach jedem Schritt die Tests laufen. Ein Test zeigt eine Abweichung von einem Rappen, die sich als alter Rundungsfehler herausstellt, und im Code-Review erklärt sie, warum der Dateiexport bewusst imperativ bleibt.

    Ziel 7

Lernweg

Wie lernst du das?

  1. 1

    Umdenken: rein und unveränderlich

    ca. 4 Std.

    Du lernst den Kern des funktionalen Denkens: Funktionen ohne Nebenwirkungen und Daten, die sich nicht ändern.

    • In fünf Codeschnipseln alle Seiteneffekte markieren und begründen
    • Eine Funktion mit globalem Zustand in eine reine Funktion umschreiben
    • Ein Objekt per Spread oder Record kopieren statt verändern und den Unterschied im Debugger zeigen

    Trainiert Kompetenz A1A2

    Lernziel12

  2. 2

    Funktionen als Bausteine

    ca. 4 Std.

    Du übst Lambdas, Higher-Order Functions und Closures in deiner Hauptsprache.

    • Eigene Versionen von map und filter ohne Bibliothek programmieren
    • Eine Fabrikfunktion schreiben, die Rabattfunktionen für verschiedene Prozentsätze erzeugt
    • Erklären, welche Variable eine Closure festhält und warum

    Trainiert Kompetenz B1B2

    Lernziel3

  3. 3

    Daten in Pipelines verarbeiten

    ca. 5 Std.

    Du löst typische Auswertungsaufgaben mit map, filter, reduce und Gruppierungen.

    • Einen CSV-Export mit 500 Bestellungen einlesen und fünf Fragen per Pipeline beantworten
    • Dieselbe Aufgabe einmal mit Schleife und einmal mit Streams/LINQ lösen und vergleichen
    • Mit Lazy Evaluation experimentieren: Wann wird eine Pipeline wirklich ausgeführt?

    Trainiert Kompetenz C1C2

    Lernziel4

  4. 4

    Zusammensetzen und verschachteln

    ca. 5 Std.

    Du kombinierst kleine Funktionen und löst Aufgaben auf Baumstrukturen rekursiv.

    • Eine eigene 'pipe'-Funktion bauen und damit eine Textbereinigung zusammensetzen
    • Eine Ordnerstruktur rekursiv durchlaufen und die Gesamtgrösse berechnen
    • Currying an einem Beispiel mit Mehrwertsteuer-Sätzen ausprobieren

    Trainiert Kompetenz D1D2B3

    Lernziel56

  5. 5

    Bestehenden Code umbauen

    ca. 5 Std.

    Du überträgst das Gelernte auf echten, gewachsenen Code und sicherst jeden Schritt mit Tests ab.

    • Für ein imperatives Modul zuerst Charakterisierungstests schreiben
    • Schleifen schrittweise durch Pipelines ersetzen und nach jedem Schritt testen
    • Im Code-Review begründen, wo du bewusst imperativ geblieben bist

    Trainiert Kompetenz E2E3A3C3

    Lernziel714

Üben

Übungen aus der Praxis

Notenauswertung ohne Schleifen

Einstieg Einstieg

Eine Berufsfachschule in Olten hat die Modulnoten einer Klasse als Liste von Objekten mit Name, Modul und Note.

Weist nach B1C1

  1. Alle ungenügenden Noten (unter 4.0) herausfiltern
  2. Den Klassenschnitt pro Modul berechnen
  3. Die Namen aller Lernenden mit Schnitt ab 5.0 alphabetisch ausgeben
Tipp anzeigen

Wenn du eine Variable mit '= 0' initialisierst und in einer Schleife hochzählst, versuche es stattdessen mit reduce.

Lösungsskizze anzeigen

filter für ungenügende Noten. groupBy Modul, dann pro Gruppe Durchschnitt über reduce oder eine fertige Aggregatfunktion. Für die Namen: groupBy Person, Schnitt berechnen, filter ab 5.0, map auf Namen, sortieren.

Warenkorb ohne Mutation

Fortgeschritten Fortgeschritten

Ein Lebensmittel-Lieferdienst in Zürich hat einen Fehler: Nach dem Entfernen eines Artikels zeigt die Bestellübersicht manchmal noch den alten Stand.

Weist nach A2

  1. Den Warenkorb als unveränderliche Struktur modellieren
  2. Funktionen 'hinzufuegen', 'entfernen' und 'mengeAendern' als reine Funktionen schreiben
  3. Mit Tests nachweisen, dass das Original nach jeder Operation unverändert ist
Tipp anzeigen

Jede Funktion bekommt den alten Warenkorb und gibt einen neuen zurück. Prüfe in Tests auch die Referenz, nicht nur den Inhalt.

Lösungsskizze anzeigen

Warenkorb als Record oder readonly-Objekt mit einer Liste von Positionen. Jede Operation erzeugt eine neue Liste per map, filter oder Spread. Die Tests speichern das Original, führen die Operation aus und prüfen, dass Original und Ergebnis verschieden sind und das Original seinen alten Inhalt hat.

Organigramm-Auswertung umbauen

Anspruchsvoll Anspruchsvoll

Ein Kantonsspital speichert seine Organisation als Baum: Departemente enthalten Kliniken, Kliniken enthalten Teams mit Stellenprozenten. Die bestehende Auswertung besteht aus 150 Zeilen verschachtelter Schleifen.

Weist nach B2D2D3E3

  1. Charakterisierungstests für die heutigen Ergebnisse schreiben
  2. Die Summe der Stellenprozente pro Ebene rekursiv berechnen
  3. Filter wie 'nur Pflege' oder 'nur unterbesetzte Teams' als austauschbare Funktionen übergeben
  4. Den Ablauf aus kleinen Funktionen per Komposition zusammensetzen und das Ergebnis mit den Tests vergleichen
Tipp anzeigen

Schreib zuerst eine generische Funktion, die einen Baum durchläuft und für jeden Knoten eine übergebene Funktion anwendet. Alle Auswertungen bauen darauf auf.

Lösungsskizze anzeigen

Eine rekursive Funktion 'faltBaum(knoten, fn, start)' mit Abbruch bei Teams ohne Kinder. Filter und Aggregationen werden als Funktionen übergeben. Die Auswertung ist eine Komposition aus Filter, Faltung und Formatierung. Die Charakterisierungstests bleiben unverändert grün.

Selbstcheck

Kannst du das beantworten?

Woran erkennst du eine reine Funktion?

Gleiche Eingabe gibt immer gleiche Ausgabe, und sie verändert nichts ausserhalb, also keine globalen Variablen, Dateien, Datenbanken oder Ausgaben.

Warum sind unveränderliche Daten in Programmen mit mehreren Threads ein Vorteil?

Weil niemand sie ändern kann, gibt es keine Konflikte beim gleichzeitigen Zugriff und keine Sperren sind nötig.

Was ist eine Higher-Order Function?

Eine Funktion, die eine andere Funktion als Parameter nimmt oder eine Funktion zurückgibt, z.B. map oder filter.

Was macht reduce mit der Liste [2, 5, 3] und der Funktion (summe, x) => summe + x mit Startwert 0?

Es rechnet 0+2=2, 2+5=7, 7+3=10 und liefert 10.

Was ist eine Closure?

Eine Funktion, die Variablen aus ihrer Entstehungsumgebung festhält und auch später noch darauf zugreifen kann.

Was passiert, wenn eine rekursive Funktion keine Abbruchbedingung hat?

Sie ruft sich endlos auf, bis der Aufrufstapel voll ist und ein Stack Overflow auftritt.

Was bedeutet Lazy Evaluation bei Java Streams oder LINQ?

Die Pipeline wird erst ausgeführt, wenn ein Ergebnis verlangt wird, z.B. durch toList() oder eine Schleife darüber.

Prüfung

Stolpersteine & Prüfungstipps

Typische Stolpersteine

  • In map oder filter heimlich Daten verändern oder etwas loggen. Dann ist die Pipeline nicht mehr rein und schwer zu verstehen.
  • Eine Pipeline mit 15 Schritten ohne Zwischennamen bauen. Lieber in benannte Teilfunktionen zerlegen.
  • Glauben, eine 'const'-Variable mache ein Objekt unveränderlich. Nur die Referenz ist fix, der Inhalt nicht.
  • Rekursion für sehr tiefe Strukturen nutzen, ohne an das Stack-Limit zu denken.
  • Alles krampfhaft funktional schreiben, auch wo eine einfache Schleife lesbarer ist.

Tipps für den Kompetenznachweis

  • Zerlege eine Pipeline-Aufgabe zuerst in Worte: 'nur die …, davon jeweils …, zusammengefasst als …'. Daraus ergeben sich filter, map und reduce.
  • Schreib bei jeder Funktion kurz dazu, ob sie rein ist. Prüfer achten genau darauf.
  • Teste Zwischenschritte einer langen Pipeline einzeln, wenn das Ergebnis nicht stimmt.
  • Bei Rekursion immer zuerst die Abbruchbedingung hinschreiben, dann den rekursiven Fall.

Glossar

Begriffe kurz erklärt

Reine Funktion
Funktion ohne Seiteneffekte, deren Ergebnis nur von den Parametern abhängt.
Seiteneffekt
Jede Wirkung einer Funktion ausserhalb ihres Rückgabewerts, z.B. Schreiben in eine Datei oder Ändern einer Variable.
Immutability
Eigenschaft von Daten, nach der Erzeugung nicht mehr verändert werden zu können.
Lambda
Anonyme Funktion, die direkt im Code definiert und als Wert übergeben wird.
Higher-Order Function
Funktion, die Funktionen als Parameter nimmt oder zurückgibt.
Closure
Funktion samt der Variablen aus ihrer Umgebung, die sie sich gemerkt hat.
Currying
Umwandlung einer Funktion mit mehreren Parametern in eine Kette von Funktionen mit je einem Parameter.
Rekursion
Lösungstechnik, bei der eine Funktion sich selbst mit einem kleineren Teilproblem aufruft.

Mit KI-Tutor

Jeder Kurs hat einen persönlichen KI-Tutor

  • Erklärt in deinem Tempo
  • Debuggt mit dir
  • Fachgespräch wie im QV
  • Unbegrenzt neue Übungen

Denkanstösse statt fertiger Lösungen. In der Gratis-Lektion zum Ausprobieren.

KI-Tutor · Modul 164Nur Tipps

Mein JOIN liefert plötzlich doppelte Zeilen. Was mache ich falsch?
Gute Frage! Schau dir die Spalte an, über die du verbindest: Ist sie in beiden Tabellen eindeutig? Was passiert mit einer Kundin, die zwei Bestellungen hat?
Ah, dann kommt sie zweimal vor …
Genau. Willst du die Bestellungen zählen oder nur die Kundinnen sehen? Je nachdem hilft dir GROUP BY oder DISTINCT.

Tutavio

So helfen wir dir bei Modul 323

  • Wir nehmen ein Stück Code aus deinem Lehrbetrieb oder Unterricht und bauen es gemeinsam Schritt für Schritt in Pipelines um.
  • Wir zeichnen mit dir auf, was bei reduce, Closures oder Rekursion intern passiert, bis du es selbst erklären kannst.
  • Wir üben mit dir das Übersetzen zwischen Java Streams, C# LINQ und JavaScript-Array-Methoden, falls Schule und Betrieb verschiedene Sprachen nutzen.
  • Vor dem Kompetenznachweis lösen wir typische Auswertungsaufgaben auf Zeit und prüfen deine Funktionen auf versteckte Seiteneffekte.

Unverbindlich anfragen. Wir melden uns innert 24 Stunden.

Tutor:in für Modul 323 finden

Passende Module

Diese Seite ist eine eigene Lernhilfe von Tutavio und keine offizielle Modulbeschreibung. Nummer, Titel und Einordnung stammen aus den öffentlichen Bildungsplänen. Die verbindliche Modulidentifikation findest du im Modulbaukasten von ICT-Berufsbildung Schweiz.

Gratis-LektionNachhilfe