99 lines
2.7 KiB
Markdown
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
|