elterndienstplaner/STRUKTUR.md
2025-12-23 22:28:03 +01:00

99 lines
2.7 KiB
Markdown

# 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