elterndienstplaner/STRUKTUR.md
2025-12-23 22:44:09 +01:00

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-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