Review der Codebase
This commit is contained in:
@@ -415,7 +415,10 @@ Hinweis in Kapitel 1 — betrifft auch Kurse, nicht nur Klassen.
|
||||
### 7.2 Gruppen
|
||||
- [x] **7.2.1** Gruppe bearbeiten und löschen — bereits vorhanden (`EditGroupCommand`/`DeleteGroupCommand`/
|
||||
`ToggleArchiveCommand` in `GroupListViewModel`), nicht Teil der aktuellen Klausuren-Arbeit,
|
||||
beim Review aber bestätigt.
|
||||
beim Review aber bestätigt. Die Löschung läuft transaktional und entfernt alle fachlich
|
||||
abhängigen Datensätze (inkl. Zeugnisnoten, gruppenspezifischem Notenschema und
|
||||
Mitarbeitsabschnitten). Dokumentation, Aufgaben und Zeiteinträge bleiben als historische
|
||||
Nachweise erhalten; ihr `GroupId` wird auf `null` gesetzt.
|
||||
- [ ] **7.2.2** Gruppe ins neue Schuljahr übernehmen: Kopie mit gleicher Schülerschaft,
|
||||
neues `SchoolYear`, neue `GroupMembership`-Einträge.
|
||||
- [ ] **7.2.3** Schüler aus einer Gruppe entfernen (`GroupMembership.LeftAt` setzen statt löschen).
|
||||
@@ -487,6 +490,8 @@ ist aber nur aktiv, wenn eine Server-URL konfiguriert ist.
|
||||
- [ ] **10.1.3** Konfliktanzeige in der UI — was `ConflictResolver` entscheidet, muss sichtbar sein.
|
||||
- [ ] **10.1.4** Manuelles Auslösen einer vollständigen Synchronisation.
|
||||
- [ ] **10.1.5** Statusanzeige erweitern: letzter Sync, Anzahl wartender Events, Fehlerzustand.
|
||||
- [ ] **10.1.6** Lokale Schreibvorgänge atomar an die Outbox (`EventQueue`) anbinden — aktuell ist
|
||||
das Sync-Grundgerüst registriert, die Repositories erzeugen aber noch keine Sync-Ereignisse.
|
||||
|
||||
### 10.2 Server
|
||||
- [ ] **10.2.1** Benutzerverwaltung/Registrierung prüfen und absichern
|
||||
@@ -579,10 +584,11 @@ Fächer- und Kompetenzverwaltung existiert bereits in
|
||||
### 13.2 Fehlerbehandlung & Logging
|
||||
- [x] **13.2.1** Zentrale Exception-Behandlung mit verständlicher Fehlermeldung statt Absturz —
|
||||
[GlobalExceptionHandler.cs](LehrerApp.Desktop/Services/GlobalExceptionHandler.cs).
|
||||
`Dispatcher.UIThread.UnhandledException` fängt Fehler aus Befehlen/Ereignis-Handlern auf
|
||||
dem UI-Thread ab, protokolliert sie und setzt `Handled = true` — die App stürzt dabei
|
||||
nachweislich nicht ab (per Headless-Test verifiziert: Fehler in einem Dispatcher-Callback
|
||||
wird geloggt + als Toast angezeigt, App läuft weiter). `AppDomain.UnhandledException` und
|
||||
`Dispatcher.UIThread.UnhandledException` protokolliert Fehler aus Befehlen/Ereignis-Handlern.
|
||||
Nur als wiederherstellbar eingestufte I/O-, Netzwerk-, Timeout- und Abbruchfehler werden mit
|
||||
`Handled = true` behandelt und als Toast angezeigt. Unbekannte Programmier-/Zustandsfehler
|
||||
dürfen die Anwendung kontrolliert beenden, statt mit möglicherweise beschädigtem Zustand
|
||||
weiterzulaufen. `AppDomain.UnhandledException` und
|
||||
`TaskScheduler.UnobservedTaskException` sind Sicherheitsnetze für Fehler außerhalb des
|
||||
UI-Threads — dort kann ein bereits "IsTerminating"-Fehler nicht mehr verhindert werden,
|
||||
wird aber vollständig protokolliert.
|
||||
@@ -664,6 +670,10 @@ Fächer- und Kompetenzverwaltung existiert bereits in
|
||||
zeigt `ProcessPath` auf den `dotnet`-Host statt auf die App, ein Neustart über die
|
||||
Einstellungen ist dort also nur in einer veröffentlichten Build (`dotnet publish`)
|
||||
sinnvoll zu testen.
|
||||
- [x] **13.3.6** Sauberer Desktop-Lifecycle — beim Beenden wird ein LiteDB-Checkpoint ausgeführt
|
||||
und anschließend der DI-Container samt Singleton-Datenbankverbindung entsorgt. Das initiale
|
||||
Hauptfenster wird vom Avalonia-Desktop-Lifetime angezeigt; ein explizites `Show()` erfolgt
|
||||
nur beim späteren Wechsel vom Passwortfenster zur Hauptansicht.
|
||||
|
||||
### 13.4 Codepflege
|
||||
- [x] **13.4.1** `CLAUDE.md` mit Projektkonventionen anlegen (`/init`) — [CLAUDE.md](CLAUDE.md).
|
||||
@@ -706,6 +716,16 @@ Fächer- und Kompetenzverwaltung existiert bereits in
|
||||
- [ ] **14.5** Leere Zustände mit Handlungsaufforderung statt leerer Tabellen.
|
||||
- [ ] **14.6** Fenstergröße und Spaltenbreiten über Sitzungen hinweg merken.
|
||||
- [ ] **14.7** Bedienung auf Touch-Geräten prüfen (Tablet im Unterricht).
|
||||
- [ ] **14.8** Responsive Layout und Windows-DPI prüfen (kleine Notebook-Auflösungen sowie
|
||||
125/150/200 % Skalierung; starre Master-Detail-Spalten bei Bedarf stapeln). Der kompakte
|
||||
Drawer berücksichtigt bereits die schmalere verfügbare Breite mit reduziertem Außen-/
|
||||
Innenabstand und einer eigenen Iconfläche, damit Windows-Emoji nicht abgeschnitten werden.
|
||||
- [ ] **14.9** Barrierefreiheit prüfen: Automation-Namen für Icon-Buttons, sichtbare Fokusrahmen,
|
||||
Kontraste und Status nicht ausschließlich über Farbe/Emoji vermitteln.
|
||||
- [ ] **14.10** Plattformübergreifend konsistentes SVG-/`PathIcon`-Set statt systemabhängiger
|
||||
Emoji-Darstellung einführen.
|
||||
- [x] **14.11** Aktiven Navigationspunkt in der Seitenleiste sichtbar hervorheben; Zustand wird
|
||||
über `MainWindowViewModel.ActiveNavItem` gesteuert.
|
||||
|
||||
---
|
||||
|
||||
@@ -719,6 +739,26 @@ Fächer- und Kompetenzverwaltung existiert bereits in
|
||||
|
||||
---
|
||||
|
||||
## 16. Datenmodell- und Architekturqualität
|
||||
|
||||
- [ ] **16.1** Referenzielle Integrität für alle Modellbeziehungen dokumentieren und je Beziehung
|
||||
explizit `Cascade`, `Restrict`, `SetNull` oder Archivierung festlegen; Löschpfade mit
|
||||
Transaktions- und Vollständigkeitstests absichern.
|
||||
- [ ] **16.2** Domain-Validierung aus den Dialog-ViewModels in gemeinsam nutzbare Regeln/Services
|
||||
überführen, damit Import, Sync und API dieselben Regeln durchsetzen.
|
||||
- [ ] **16.3** Prüfen, ob Punkte, Gewichtungen und Prozentgrenzen von `double` auf `decimal` oder
|
||||
skalierte Ganzzahlen migriert werden sollen; Rundungs- und Migrationsstrategie festlegen.
|
||||
- [ ] **16.4** Redundant gespeicherte Bewertungswerte (`ExamResult.TotalPoints`, berechnete Note)
|
||||
entweder ableiten oder zusammen mit einer unveränderlichen Version des verwendeten
|
||||
Notenschlüssels als historischen Snapshot speichern.
|
||||
- [ ] **16.5** Kompetenzzuordnungen auf stabile `CompetencyItem.Id` umstellen; Code/Beschreibung bei
|
||||
Bedarf zusätzlich als historischen Snapshot speichern, damit Umbenennungen keine alten
|
||||
Klausur- oder Sitzungsreferenzen brechen.
|
||||
- [ ] **16.6** Navigation und manuelle Callback-Verdrahtung in `App.axaml.cs` langfristig durch
|
||||
einen testbaren Navigationsdienst oder Messenger ersetzen; statischen Servicezugriff abbauen.
|
||||
|
||||
---
|
||||
|
||||
## Empfohlene Reihenfolge
|
||||
|
||||
Die Abschnitte sind thematisch, nicht chronologisch nummeriert. Sinnvolle Bearbeitungsreihenfolge:
|
||||
|
||||
Reference in New Issue
Block a user