108 lines
3.6 KiB
Markdown
108 lines
3.6 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 (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_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 (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
|
|
|
|
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
|