Ziel: Architektur sauberer machen, ohne Funktionsumfang zu brechen. Jede Stufe ist klein genug, um separat review- und testbar zu sein.
- Keine UI-Änderungen nötig, Fokus liegt auf Struktur/Testbarkeit.
- Verhalten muss identisch bleiben (besonders Unlocking-Regel: gelöst + 1).
- Nach jeder Stufe laufen die Tests.
- Tests ausführen, Status dokumentieren.
- Optional: Screenshots/Video der wichtigsten Flows (Startmenu → Level → Score → Back, Startmenu → JustPlay → Lost/Score).
Ziel: CoreData nicht mehr direkt im LevelService/AppDelegate nutzen.
Schritte:
- Neuer Typ
PersistenceControllermitNSPersistentContainer. LevelInfoDataSourceerhältNSManagedObjectContextüber Init (keine AppDelegate-Abhängigkeit mehr).LevelServiceImplbekommtLevelInfoDataSourceper Init.
Resultat:
- Persistenz ist isoliert, Testbarkeit erhöht,
AppDelegatewird entlastet.
Ziel: ResourcesManager zurückdrängen, ohne großen Bruch.
Schritte:
ResourcesManagerbleibt, aber wird intern nur als DI-Root genutzt.- Szenen erhalten Services via Init-Parameter, nicht via
ResourcesManager.getInstance(). StoryServiceImplerstellt Szenen und injiziertLevelService/StoryService.
Resultat:
- Weniger versteckte Abhängigkeiten, klare Objektbeziehungen.
Ziel: StoryServiceImpl entlasten und Szenen-Setup konsistent halten.
Schritte:
- Neues Protokoll
SceneFactory. - Implementierung erstellt alle Szenen inkl. Abhängigkeiten.
StoryServiceImplnutzt nur noch Factory + SKView.
Resultat:
- Navigation bleibt zentral, Erzeugung wird modular.
Ziel: Spiel-Logik unabhängig vom Rendering.
Schritte:
GameServiceImplerhält reine Datenstrukturen und keine SpriteKit-Abhängigkeiten.GameFieldNodeundGameScenenutzen nur noch die Service-API.- Jede SpriteKit-UI arbeitet über DTOs/State.
Resultat:
- Logik bleibt testbar und UI wird schlanker.
Ziel: Gemeinsame Mechanik zusammenfassen, Modi klar trennen.
Schritte:
- Gemeinsame Score/Timer-Regeln in eigene Services ziehen.
- LevelMode/JustPlay bekommen jeweils eigene ModeController.
Resultat:
- Weniger Code-Duplikate, klarere Verantwortung.
- Tests ergänzen (z.B. SceneFactory-Integration, LevelService ohne CoreData Host).
- Entfernte Singletons und direkte AppDelegate-Zugriffe löschen.
- Dokumentation kurz aktualisieren.
xcodebuild -project SOPA.xcodeproj -scheme SOPA -destination 'platform=iOS Simulator,name=iPhone 16,OS=18.0' test- Kritische Flows manuell prüfen:
- Startmenu → LevelChoice → Game → Score → Back
- Startmenu → JustPlay → Lost/Score