Kapitel 10
Ein Programm über mehrere Dateien organisieren
Warum ein funktionierendes Programm aufteilen
Mit diesem Kapitel ändert sich etwas, noch bevor du eine Zeile schreibst.
Bisher gab dir jede Lektion einen Editor mit einem Programm. Dieses Kapitel gibt dir ein Projekt: mehrere Dateien, die von einer Lektion zur nächsten erhalten bleiben. Was du in Lektion 2 schreibst, ist in Lektion 8 noch da. Über die Dateiansicht neben dem Editor wechselst du zwischen ihnen.
Das Projekt enthält bereits eine Datei. Öffne main.py und lies sie.
Was du vor dir hast
Dieses Kapitel beginnt mit einem neuen, kleineren Quiz mit vertrauten Verantwortlichkeiten: einem Question, das seine Antwort kennt, einem Quiz, das Fragen hält, einem Attempt, das Antworten bewertet, einer Funktion, die einen Versuch in Berichtszeilen umwandelt, und einem main, das alles verbindet.
Es behält eine Textfrageart und einen laufenden Punktestand, damit du dich darauf konzentrieren kannst, Verantwortlichkeiten zwischen Dateien zu verschieben. Es ersetzt weder die umfangreichere Familie aus Kapitel 9 noch deren Validierungsregeln. Bewahre das Verhalten dieses vorgegebenen Programms während des gesamten Kapitels.
Mit ungefähr sechzig Zeilen passt es noch bequem in eine Datei. Wir üben die Grenzen, die nützlich werden, wenn das Programm wächst.
Was eine einzelne Datei kostet
Programme werden nicht wegen ihrer Länge schwer bearbeitbar. Sie werden es, weil alles darin auf alles andere zugreifen kann.
Dinge finden. report_lines steht ohne besonderen Grund zwischen Attempt und build_quiz. In einer Datei mit tausend Zeilen wird „Wo ist die Bewertungsregel?“ zu einer Suche statt zu einem bekannten Ort.
Lesen. Um Attempt zu verstehen, scrollst du an Question und Quiz vorbei. Nichts sagt dir, von welchen davon Attempt tatsächlich abhängt, denn in einer Datei lautet die Antwort immer „von allem Möglichen“.
Ändern. Zwei Personen bearbeiten dieselbe Datei. Ihre Änderungen geraten in Konflikt, selbst wenn sich die Aufgaben nicht überschneiden.
Wiederverwenden. Ein anderes Programm kann Question aus dieser Datei mit geschütztem Programmeinstieg importieren. Dabei lädt es aber auch Definitionen zur Berichtsformatierung und zum Quizaufbau. Ein gezieltes Modul macht die kleinere Abhängigkeit deutlich.
Testen. Kapitel 13 schreibt echte Tests. Question allein zu testen ist viel einfacher, wenn Question an einem eigenen Ort liegt.
Was ist der stärkste Grund, dieses Programm in Module aufzuteilen?
Was wir anstreben
Am Ende des Kapitels sieht main.py ungefähr so aus:
from models import Question, Quiz
from report import report_lines
def main():
...
Das ist die flache Zwischenstruktur. Lektion 7 ergänzt das Paketpräfix quizapp. Die Importzeilen zeigen die Abhängigkeiten. Wer diese Datei öffnet, erkennt in drei Sekunden, dass das Programm eine Domäne und eine Berichtsschicht hat und der Einstieg beide verwendet. Dieser Satz steht nirgends als Kommentar. Er steht in der Struktur.
Das Kapitel erreicht dieses Ziel Schritt für Schritt:
Lektionen 2 und 3 erstellen dein erstes Modul und importieren daraus.
Lektion 4 betrachtet, was Python bei einem Import tatsächlich tut.
Lektion 5 macht
main.pyzum Programmeinstieg statt zur Sammelstelle.Lektion 6 zieht die Grenze zwischen Regeln und Darstellung, diesmal in Dateien.
Lektion 7 fasst Module zu einem Paket zusammen und begegnet dem Importproblem, das Einsteiger häufig trifft.
Lektion 8 schließt die Aufteilung ab.
Ein Wort zur Arbeitsumgebung
Weil die Dateien erhalten bleiben, bleiben auch Fehler erhalten. Verhält sich eine spätere Lektion seltsam, kann die Ursache in einer früher geschriebenen Datei liegen. Genau auf diese Situation bereitet dich das Kapitel vor.
Run führt immer main.py aus, auch wenn eine andere Datei geöffnet ist. Submit prüft die Dateien, die die aktuelle Lektion verlangt.
Die Schaltfläche Reset stellt den Anfangszustand des Projekts wieder her. Sie löscht deine Kapiteldateien, behält aber die Abschlussmarkierungen. Spätere Übungen benötigen dann möglicherweise erneut die frühere Arbeit. Verwende sie nur, wenn du das Projekt tatsächlich neu beginnen willst.