3.6 KiB
3.6 KiB
Projektstruktur Elterndienstplaner
Dateien
csv_io.py - CSV Input/Output Module
Zweck: Trennung von Datei-I/O und Business-Logik
Klassen:
-
EingabeParser: Parst alle CSV-Eingabedateienparse_eingabe_csv(): Lädt eingabe.csv mit Terminen und Präferenzenparse_eltern_csv(): Lädt eltern.csv mit Dienstfaktorenparse_vorherige_ausgaben_csv(): Lädt vorherige-ausgaben.csv für Fairness
-
AusgabeWriter: Schreibt Ergebnisse in CSVschreibe_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 DiensttypenElterndienstplaner: Hauptklasse mit Optimierungslogik- Fairness-Berechnungen (global/lokal)
- Optimierungsmodell-Erstellung (modular aufgeteilt)
- Statistiken
Constraint-Funktionen (modular aufgeteilt):
_erstelle_entscheidungsvariablen(): Erstellt binäre Variablen_add_constraint_ein_dienst_pro_woche(): C1 - Max 1 Dienst pro Woche_add_constraint_ein_dienst_pro_tag(): C2 - Max 1 Dienst pro Tag_add_constraint_verfuegbarkeit(): C3 - Nur verfügbare Eltern_add_constraint_dienst_bedarf(): C4 - Alle Dienste müssen besetzt werden_add_fairness_constraints(): F1 & F2 - Erstellt Variablen und Constraints für Fairness_berechne_fairness_gewichte(): Zeitabhängige Gewichtung (Sep-Jul)_erstelle_zielfunktion(): Zielfunktion mit Fairness & Präferenzen
Abhängigkeiten:
- Importiert
csv_iofür Datei-Operationen - Verwendet
pulpfür lineare Optimierung
Verbesserungen durch Refactoring
Vorher (Monolith)
elterndienstplaner.py (700+ Zeilen)
├── Dienst Klasse
├── CSV Parsing (150+ Zeilen)
├── Fairness-Berechnung
├── Optimierung (200+ Zeilen inline)
└── CSV Schreiben
Nachher (Modular)
csv_io.py (220 Zeilen)
├── EingabeParser
└── AusgabeWriter
elterndienstplaner.py (500 Zeilen)
├── Dienst Klasse
├── Fairness-Berechnung
│ ├── berechne_faire_zielverteilung_global()
│ └── berechne_faire_zielverteilung_lokal()
├── Optimierung (modular)
│ ├── erstelle_optimierungsmodell() (30 Zeilen - übersichtlich!)
│ ├── _erstelle_entscheidungsvariablen()
│ ├── _add_constraint_ein_dienst_pro_woche()
│ ├── _add_constraint_ein_dienst_pro_tag()
│ ├── _add_constraint_verfuegbarkeit()
│ ├── _add_constraint_dienst_bedarf()
│ ├── _add_fairness_constraints()
│ └── _erstelle_zielfunktion()
└── Statistiken
Nächste Schritte (Optional)
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
- Separation of Concerns: I/O getrennt von Business-Logik
- Testbarkeit: Module können unabhängig getestet werden
- Wartbarkeit: Änderungen an CSV-Format betreffen nur
csv_io.py - Erweiterbarkeit: Neue Dateiformate können leicht hinzugefügt werden
- Lesbarkeit: Kürzere, fokussiertere Dateien