Skip to content

[LOW] Add more interface abstractions - Reduce concrete dependencies throughout codebase #277

@MichaelFisher1997

Description

@MichaelFisher1997

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 operations
  • IWorld - for world queries (read-only)
  • IMutableWorld - for world modifications
  • ISettings - 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 IChunkStorage interface
  • Define IWorld interface
  • 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.zig
  • src/world/world.zig
  • src/world/chunk_storage.zig
  • src/game/screens/*.zig

SOLID Principle

Dependency Inversion Principle (DIP)

Estimated Effort

Low (incremental work over time)

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions