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

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

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

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