Skip to content

Commit 8d43449

Browse files
djschillingampagent
andcommitted
Add incremental refactor plan
Amp-Thread-ID: https://ampcode.com/threads/T-019c3818-50dc-70ed-967a-f7d9bfd01f0e Co-authored-by: Amp <amp@ampcode.com>
1 parent 292ffd4 commit 8d43449

1 file changed

Lines changed: 78 additions & 0 deletions

File tree

REFACTOR_PLAN.md

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# SOPA iOS Refactor Plan (Incremental)
2+
3+
Ziel: Architektur sauberer machen, ohne Funktionsumfang zu brechen. Jede Stufe ist klein genug, um separat review- und testbar zu sein.
4+
5+
## Leitlinien
6+
- Keine UI-Änderungen nötig, Fokus liegt auf Struktur/Testbarkeit.
7+
- Verhalten muss identisch bleiben (besonders Unlocking-Regel: gelöst + 1).
8+
- Nach jeder Stufe laufen die Tests.
9+
10+
## Phase 0: Baseline & Sicherungen
11+
- Tests ausführen, Status dokumentieren.
12+
- Optional: Screenshots/Video der wichtigsten Flows (Startmenu → Level → Score → Back, Startmenu → JustPlay → Lost/Score).
13+
14+
## Phase 1: Persistence sauber kapseln
15+
**Ziel:** CoreData nicht mehr direkt im `LevelService`/`AppDelegate` nutzen.
16+
17+
Schritte:
18+
- Neuer Typ `PersistenceController` mit `NSPersistentContainer`.
19+
- `LevelInfoDataSource` erhält `NSManagedObjectContext` über Init (keine AppDelegate-Abhängigkeit mehr).
20+
- `LevelServiceImpl` bekommt `LevelInfoDataSource` per Init.
21+
22+
Resultat:
23+
- Persistenz ist isoliert, Testbarkeit erhöht, `AppDelegate` wird entlastet.
24+
25+
## Phase 2: Dependency Injection statt Singleton (soft)
26+
**Ziel:** `ResourcesManager` zurückdrängen, ohne großen Bruch.
27+
28+
Schritte:
29+
- `ResourcesManager` bleibt, aber wird intern nur als DI-Root genutzt.
30+
- Szenen erhalten Services via Init-Parameter, nicht via `ResourcesManager.getInstance()`.
31+
- `StoryServiceImpl` erstellt Szenen und injiziert `LevelService`/`StoryService`.
32+
33+
Resultat:
34+
- Weniger versteckte Abhängigkeiten, klare Objektbeziehungen.
35+
36+
## Phase 3: SceneFactory einführen
37+
**Ziel:** `StoryServiceImpl` entlasten und Szenen-Setup konsistent halten.
38+
39+
Schritte:
40+
- Neues Protokoll `SceneFactory`.
41+
- Implementierung erstellt alle Szenen inkl. Abhängigkeiten.
42+
- `StoryServiceImpl` nutzt nur noch Factory + SKView.
43+
44+
Resultat:
45+
- Navigation bleibt zentral, Erzeugung wird modular.
46+
47+
## Phase 4: Game-Core trennen
48+
**Ziel:** Spiel-Logik unabhängig vom Rendering.
49+
50+
Schritte:
51+
- `GameServiceImpl` erhält reine Datenstrukturen und keine SpriteKit-Abhängigkeiten.
52+
- `GameFieldNode` und `GameScene` nutzen nur noch die Service-API.
53+
- Jede SpriteKit-UI arbeitet über DTOs/State.
54+
55+
Resultat:
56+
- Logik bleibt testbar und UI wird schlanker.
57+
58+
## Phase 5: JustPlay und LevelMode parallelisieren
59+
**Ziel:** Gemeinsame Mechanik zusammenfassen, Modi klar trennen.
60+
61+
Schritte:
62+
- Gemeinsame Score/Timer-Regeln in eigene Services ziehen.
63+
- LevelMode/JustPlay bekommen jeweils eigene ModeController.
64+
65+
Resultat:
66+
- Weniger Code-Duplikate, klarere Verantwortung.
67+
68+
## Phase 6: Cleanups & Tests
69+
- Tests ergänzen (z.B. SceneFactory-Integration, LevelService ohne CoreData Host).
70+
- Entfernte Singletons und direkte AppDelegate-Zugriffe löschen.
71+
- Dokumentation kurz aktualisieren.
72+
73+
## Teststrategie (pro Phase)
74+
- `xcodebuild -project SOPA.xcodeproj -scheme SOPA -destination 'platform=iOS Simulator,name=iPhone 16,OS=18.0' test`
75+
- Kritische Flows manuell prüfen:
76+
- Startmenu → LevelChoice → Game → Score → Back
77+
- Startmenu → JustPlay → Lost/Score
78+

0 commit comments

Comments
 (0)