-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
enhancementNew feature or requestNew feature or request
Description
Problem
While the codebase uses interfaces effectively in some areas (IScreen, IChunkProvider, RHI interfaces), many modules still depend on concrete types rather than abstractions. This reduces testability and flexibility.
Examples of Concrete Dependencies
1. World depends on concrete ChunkStorage
World struct uses storage: ChunkStorage (concrete type)
2. Screen implementations depend on concrete systems
Screens import and use World, RHI directly rather than interfaces.
3. App depends on concrete settings modules
App imports settings.zig directly.
Proposed Solution
Gradually introduce more interface abstractions:
Phase 1: Define Interfaces
IChunkStorage- for chunk storage operationsIWorld- for world queries (read-only)IMutableWorld- for world modificationsISettings- for settings access
Phase 2: Update Callers
Refactor modules to depend on interfaces instead of concrete types.
Benefits
- Improved testability (can use mock implementations)
- Reduced coupling between modules
- Easier to swap implementations
- Better adherence to Dependency Inversion Principle
Acceptance Criteria
- Define
IChunkStorageinterface - Define
IWorldinterface - Update at least 3 screen implementations to use interfaces
- Create mock implementations for testing
- All tests pass
Non-Goals
- Don't convert everything at once (gradual migration)
- Don't add interfaces where they don't provide value
Related Files
src/engine/core/interfaces.zigsrc/world/world.zigsrc/world/chunk_storage.zigsrc/game/screens/*.zig
SOLID Principle
Dependency Inversion Principle (DIP)
Estimated Effort
Low (incremental work over time)
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request