# Projektstruktur Elterndienstplaner ## Dateien ### `csv_io.py` - CSV Input/Output Module **Zweck**: Trennung von Datei-I/O und Business-Logik **Klassen**: - `EingabeParser`: Parst alle CSV-Eingabedateien - `parse_eingabe_csv()`: Lädt eingabe.csv mit Terminen und Präferenzen - `parse_eltern_csv()`: Lädt eltern.csv mit Dienstfaktoren - `parse_vorherige_ausgaben_csv()`: Lädt vorherige-ausgaben.csv für Fairness - `AusgabeWriter`: Schreibt Ergebnisse in CSV - `schreibe_ausgabe_csv()`: Schreibt Lösung in ausgabe.csv **Vorteile**: - ✅ Testbar: CSV-Parsing kann isoliert getestet werden - ✅ Wiederverwendbar: Andere Formate (JSON, Excel) leicht hinzufügbar - ✅ Klare Verantwortlichkeiten: I/O getrennt von Optimierung ### `elterndienstplaner.py` - Hauptprogramm **Zweck**: Business-Logik und Optimierung **Klassen**: - `Dienst`: Datenmodell für Diensttypen - `Elterndienstplaner`: Hauptklasse mit Optimierungslogik - Fairness-Berechnungen (global/lokal) - Optimierungsmodell-Erstellung - Statistiken **Abhängigkeiten**: - Importiert `csv_io` für Datei-Operationen - Verwendet `pulp` für lineare Optimierung ## Verbesserungen durch Refactoring ### Vorher (Monolith) ``` elterndienstplaner.py (700+ Zeilen) ├── Dienst Klasse ├── CSV Parsing (150+ Zeilen) ├── Fairness-Berechnung ├── Optimierung └── CSV Schreiben ``` ### Nachher (Modular) ``` csv_io.py (220 Zeilen) ├── EingabeParser └── AusgabeWriter elterndienstplaner.py (500 Zeilen) ├── Dienst Klasse ├── Fairness-Berechnung ├── Optimierung └── Statistiken ``` ## Nächste Schritte (Optional) ### Phase 2: Constraint-Funktionen auslagern ```python def _add_constraint_ein_dienst_pro_woche(prob, x, ...): """C1: Je Eltern und Dienst nur einmal die Woche""" def _add_constraint_ein_dienst_pro_tag(prob, x, ...): """C2: Je Eltern nur einen Dienst am Tag""" ``` ### Phase 3: Fairness-Modul (optional) ``` fairness.py ├── FairnessBerechner │ ├── berechne_global() │ └── berechne_lokal() ``` ## Verwendung ```python from csv_io import EingabeParser, AusgabeWriter # Daten laden eltern, tage, dienste, ... = EingabeParser.parse_eingabe_csv("eingabe.csv", lookup_fn) # Ergebnis schreiben AusgabeWriter.schreibe_ausgabe_csv("ausgabe.csv", lösung, tage, dienste) ``` ## Vorteile der aktuellen Struktur 1. **Separation of Concerns**: I/O getrennt von Business-Logik 2. **Testbarkeit**: Module können unabhängig getestet werden 3. **Wartbarkeit**: Änderungen an CSV-Format betreffen nur `csv_io.py` 4. **Erweiterbarkeit**: Neue Dateiformate können leicht hinzugefügt werden 5. **Lesbarkeit**: Kürzere, fokussiertere Dateien