2.1 KiB
2.1 KiB
Task 10 — Queries auslagern
Rückblick Task 9: PoiType als StrEnum
Ihr habt den Magic String "bergbahn" durch eine StrEnum ersetzt. Die wichtigsten Punkte:
- Magic Strings sind rohe Strings, die eine bestimmte Bedeutung haben, aber nirgends
formal definiert oder geprüft werden. Tippfehler wie
"Bergbahn"oder"berg_bahn"fallen erst zur Laufzeit auf — oder gar nicht. PoiType("bergbahn")funktioniert beiStrEnum— Python findet den passenden Member anhand des Wertes. Das ist nützlich, wenn Werte aus einer Config oder Datenbank kommen.- Grenzen: Enums sind statisch — neue POI-Typen erfordern eine Code-Änderung. Für sehr dynamische Systeme (Typen kommen aus der DB) wäre eine andere Lösung nötig.
Aufgabe
In main.py steht aktuell die Overpass-Query als langer hardcodierter String direkt
im Code. Das hat mehrere Nachteile: Der String ist schwer lesbar, nicht wiederverwendbar,
und für jeden neuen POI-Typ muss main.py angefasst werden.
Konkret:
- Lege einen Unterordner
queries/im Package an. - Verschiebe die Bergbahn-Query in eine Datei
queries/bergbahn.overpassql. Der Platzhalter{bbox}bleibt erhalten — ergänze zusätzlich{timeout}und{maxsize}als Platzhalter (statt Hardcoding im Query-String). - Schreibe in
fetcher.pyeine neue Funktionload_query():
def load_query(poi_type: PoiType, bbox: tuple, timeout: int, maxsize: int) -> str:
...
Sie soll die passende .overpassql-Datei laden und alle Platzhalter befüllen.
4. Passe _fetch_overpass() an: Sie bekommt nun die fertige Query (kein
bbox-Parameter mehr) und sendet sie direkt.
5. Passe load_pois() und main.py entsprechend an.
Fragen zum Nachdenken:
- Welche Vorteile hat es, Queries in eigenen Dateien zu speichern?
- Warum ist
Path(__file__).parent / "queries"besser als ein relativer Pfad"queries/"? - Was passiert, wenn die
.overpassql-Datei für einen bestimmtenPoiTypefehlt — wie sollteload_query()damit umgehen? - Welches Design-Prinzip steckt hinter dieser Änderung? (Stichwort: Separation of Concerns)