| Nr. | Stil | Merkmal im Code | Verändert bestehende Daten? |
|---|---|---|---|
| 1 | imperativ | Schleife über einen Bereich, Akkumulator summe wird mehrfach überschrieben (+=) | ja – die Variable summe |
| 2 | deklarativ | sum(…) beschreibt das Ergebnis, kein Zwischenzustand sichtbar | nein – neuer Wert |
| 3 | imperativ | sort() als Methode auf der Liste, gibt None zurück | ja – die Liste namen selbst |
| 4 | deklarativ | sorted() liefert eine neue Liste zurück, Original bleibt unangetastet | nein – neuer Wert |
| 5 | deklarativ | Es wird beschrieben, was dargestellt wird; Schriftgrösse, Position und Aufzählungszeichen entscheidet der Browser | nein |
| 6 | imperativ | leeres Gefäss [], for-Schleife, append – Ergebnis wird Schritt für Schritt aufgebaut | ja – die Liste gefiltert wächst |
| 7 | deklarativ | List Comprehension, liest sich als Satz über das Ergebnis | nein – neuer Wert |
| 8 | deklarativ | SQL beschreibt was geändert werden soll, nicht wie die Datenbank die Zeilen findet | ja – der Zustand der Datenbank |
| 9 | imperativ | global plus += – der Zustand ausserhalb der Funktion wird verändert | ja – die globale Variable zaehler |
| 10 | deklarativ | map beschreibt die Transformation, die Iteration steckt im Sprachkonstrukt | nein – neue Liste |
Ausschnitt 8 (UPDATE). Die Behauptung, deklarativ sei automatisch seiteneffektfrei, ist falsch. Seiteneffektfreiheit ist eine Eigenschaft der puren funktionalen Programmierung, nicht der deklarativen Programmierung insgesamt.
Ein UPDATE beschreibt zwar deklarativ, welche Zeilen betroffen sind – die Wirkung auf die Datenbank bleibt aber ein handfester Seiteneffekt. Mehr dazu in LU02 (Pure Functions).
Ausschnitt 3 (namen.sort()) ist gefährlicher. Die Methode sortiert die Liste an Ort und Stelle. Jede andere Stelle im Programm, die dieselbe Liste referenziert, sieht ab sofort die veränderte Reihenfolge – auch dann, wenn sie auf die ursprüngliche Eingabereihenfolge angewiesen war. Solche Fehler treten oft erst weit entfernt von der Ursache auf und sind entsprechend mühsam zu finden.
sorted() erzeugt dagegen eine neue Liste und lässt das Original in Ruhe. Wer die alte Reihenfolge noch braucht, hat sie noch.
HTML ist deklarativ, kennt aber überhaupt keine Funktionen. Daraus folgt: deklarativ ist der Oberbegriff, funktional eine Teilmenge davon. Funktionale Programmierung ist ein deklarativer Stil, der zusätzlich Funktionen als Bausteine und Unveränderlichkeit verlangt. Andere deklarative Familien sind zum Beispiel die logische Programmierung (Prolog), Abfragesprachen (SQL) und Auszeichnungssprachen (HTML, CSS).
Häufige Fehler in dieser Aufgabe
lambda nach Code aussieht. Entscheidend ist aber: Es wird keine Schleife geschrieben und kein Zwischenzustand aufgebaut.