Konzepterklärung
Architektur klingt nach einem großen Wort, aber in kleinen Python-Skripten bedeutet es etwas Einfaches: Platzieren Sie jede Verantwortung an der richtigen Stelle. Daten sollten an einem Ort geformt werden, die Formatierung sollte an einem anderen Ort erfolgen und die Ausgabe sollte am Rand des Programms bleiben. In dieser Lektion erstellen Sie einen kleinen Profil-Formatierer. Der eigentliche Punkt sind nicht die Profile selbst. Es geht darum zu lernen, wie man Daten von der Präsentation trennt, damit Ihr Skript lesbar bleibt, wenn es wächst. Viel Anfängercode wird unübersichtlich, weil alles in `main()` passiert. Das funktioniert für fünf Zeilen, verwandelt sich dann aber schnell in einen Haufen vermischter Logik. Hier üben Sie ein saubereres Layout: Eine Funktion bereitet Daten vor, eine Funktion formatiert sie, und `main()` verbindet nur die Teile. Am Ende dieser Lektion sollten Sie in der Lage sein: • zu erklären, warum die Ausgabe an den Rand des Programms gehört, • Entscheidungen zur Datenstruktur von der Ausgabeformatierung zu trennen, • zu beschreiben, wie dieses Skript später Testdaten gegen Datenbankzeilen oder API-Ergebnisse austauschen könnte. Warum das wichtig ist: Gute Architektur geht nicht darum, Code fortgeschritten aussehen zu lassen. Es geht darum, Code einfacher änderbar zu machen, ohne unabhängige Teile zu beschädigen.
Wo der Code hingehört
- Definieren Sie Farb- und Positionsvariablen oben.
- Erstellen Sie die Logik zum Zeichnen oder Platzieren von Formen in der Mitte.
- Rendern Sie die Ausgabe (Druck, Canvas, SVG oder gestylter Block) am Ende.
Befehlsreferenz
- Halten Sie `main()` klein; es soll Teile verbinden, nicht die gesamte Geschäftslogik verstecken.
- Verwenden Sie eine Funktion zum Laden von Daten und eine andere zum Formatieren von Daten, damit jeder Teil leicht änderbar bleibt.
- Geben Sie Strings von Rendering-Funktionen zurück, anstatt sie darin zu drucken, wann immer möglich.
- Wählen Sie Namen, die die Rolle jeder Funktion beschreiben, nicht nur den Typ des zurückgegebenen Werts.
Schritt-für-Schritt-Anleitung
- Führen Sie das Skript einmal aus und beachten Sie, dass `load_learners()` Daten vorbereitet, während `render_profile_card()` die Präsentation steuert.
- Fügen Sie einen weiteren Lernenden zur Liste hinzu und bestätigen Sie, dass keine andere Funktion geändert werden muss.
- Ändern Sie nur den Formatierungsstring in `render_profile_card()` und überprüfen Sie, ob der Datenlader unberührt bleibt.
- Fügen Sie ein neues Feld wie `level` oder `country` zum TypedDict hinzu und aktualisieren Sie den Renderer sorgfältig.
- Schreiben Sie eine kurze Notiz, die erklärt, warum das Drucken innerhalb von `main()` sauberer ist als das Drucken innerhalb der Datenladefunktion.
Übungsaufgaben
- Schreiben Sie das Beispiel mit einer Dataclass anstelle von TypedDict neu und entscheiden Sie, welche Version Ihnen klarer erscheint.
- Erklären Sie, warum das Speichern vorformatierter Strings in den Rohdaten zukünftige Änderungen erschweren würde.
- Stellen Sie sich vor, die Daten stammen später aus SQLite oder einer API. Welche Funktion sollte zuerst geändert werden und welche sollte gleich bleiben?
Coding-Challenges
- Fügen Sie einen zweiten Renderer hinzu, der eine kürzere Zusammenfassungszeile ausgibt, während die gleiche Datenquelle wiederverwendet wird.
- Erstellen Sie einen kleinen Filterschritt, der nur Lernende mit Punktzahlen über 900 ausgibt, ohne die Filterlogik in den Renderer zu mischen.
Kleine Übungsaufgaben
- Zeichnen Sie drei Kästchen in Ihre Notizen: Daten, Formatierung, Ausgabe.
- Sagen Sie den Ablauf einmal laut: Daten laden, ein Element formatieren, das Ergebnis ausgeben.
- Behalten Sie eine Regel aus dieser Lektion bei: Lader laden, Renderer rendern, main verbindet.
Häufiger Fehler
Mixing x and y axes or using wrong coordinate origin causes shapes to appear in unexpected places.
Mini-Challenge aus der Praxis
Draw one square, one triangle, and one circle, then move X marker 2 steps right and 1 step down.