Files
vibe3_physics/REFACTOR_PLAN.md
Sergio Valor b8d3c60e58 Refactor fase 1: Extraer InputHandler de Engine
Aplicación del Principio de Responsabilidad Única (SRP) - Fase 1/6

## Cambios realizados

### Nuevos archivos
- source/input/input_handler.h - Declaración clase InputHandler
- source/input/input_handler.cpp - Procesamiento eventos SDL (~180 líneas)
- REFACTOR_PLAN.md - Documento de seguimiento del refactor

### Modificaciones en Engine
- **engine.h**: Agregados 24 métodos públicos para InputHandler
- **engine.cpp**:
  - Eliminado handleEvents() (420 líneas)
  - Implementados métodos públicos wrapper (~180 líneas)
  - Renombrados métodos internos con sufijo `Internal`:
    * toggleShapeMode → toggleShapeModeInternal
    * activateShape → activateShapeInternal
    * switchTexture → switchTextureInternal
  - Bucle run() simplificado (5 → 12 líneas)

### Actualización build
- CMakeLists.txt: Agregado source/input/*.cpp a archivos fuente

## Impacto
- **Líneas extraídas**: ~430 del switch gigante de handleEvents()
- **Compilación**:  Exitosa sin errores
- **Funcionalidad**:  100% preservada

## Beneficios
-  Engine desacoplado de eventos SDL
-  InputHandler stateless (fácilmente testeable)
-  Clara separación detección input vs ejecución lógica
-  Preparado para testing unitario de inputs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-10 11:39:59 +02:00

219 lines
5.6 KiB
Markdown

# Plan de Refactorización - ViBe3 Physics Engine
## Objetivo
Aplicar el **Principio de Responsabilidad Única (SRP)** al motor Engine para:
- Mejorar mantenibilidad del código
- Facilitar extensión de funcionalidades
- Reducir acoplamiento entre sistemas
- Hacer el código más testeable
## Métricas Iniciales (Pre-refactorización)
- **engine.cpp**: 2341 líneas
- **engine.h**: 196 líneas con 40+ miembros privados
- **Responsabilidades mezcladas**: 7 subsistemas en una sola clase
## Progreso de Refactorización
### ✅ FASE 1: InputHandler (COMPLETADA)
**Fecha**: 10/01/2025
**Commit**: (pendiente)
**Impacto**: ~430 líneas extraídas del `handleEvents()`
**Archivos creados**:
- `source/input/input_handler.h`
- `source/input/input_handler.cpp`
**Métodos públicos agregados a Engine (24 total)**:
```cpp
// Gravedad y física
void pushBallsAwayFromGravity();
void handleGravityToggle();
void handleGravityDirectionChange(GravityDirection, const char*);
// Display y depuración
void toggleVSync();
void toggleDebug();
// Figuras 3D
void toggleShapeMode();
void activateShape(ShapeType, const char*);
void handleShapeScaleChange(bool);
void resetShapeScale();
void toggleDepthZoom();
// Temas de colores
void cycleTheme(bool);
void switchThemeByNumpad(int);
void toggleThemePage();
void pauseDynamicTheme();
// Sprites/Texturas
void switchTexture();
// Escenarios
void changeScenario(int, const char*);
// Zoom y fullscreen
void handleZoomIn();
void handleZoomOut();
void toggleFullscreen();
void toggleRealFullscreen();
void toggleIntegerScaling();
// Modos de aplicación
void toggleDemoMode();
void toggleDemoLiteMode();
void toggleLogoMode();
```
**Cambios internos**:
- Métodos internos renombrados con sufijo `Internal`:
- `toggleShapeMode()``toggleShapeModeInternal()`
- `activateShape()``activateShapeInternal()`
- `switchTexture()``switchTextureInternal()`
- Eliminado método `handleEvents()` (420 líneas)
- Bucle `run()` simplificado a 12 líneas
**Beneficios**:
- ✅ Engine desacoplado de eventos SDL
- ✅ InputHandler stateless (fácilmente testeable)
- ✅ Clara separación entre detección de input y ejecución de lógica
- ✅ Compilación exitosa sin errores
---
### 🔄 FASE 2: SceneManager (PENDIENTE)
**Impacto estimado**: ~500 líneas + `std::vector<Ball>` movido
**Responsabilidad**: Crear, actualizar y gestionar todas las `Ball`
**Miembros a mover**:
- `std::vector<std::unique_ptr<Ball>> balls_`
- `GravityDirection current_gravity_`
- `int scenario_`
**Métodos a mover**:
- `initBalls()`
- `pushBallsAwayFromGravity()`
- `switchBallsGravity()`
- `enableBallsGravityIfDisabled()`
- `forceBallsGravityOn() / Off()`
- `changeGravityDirection()`
- `updateBallSizes()`
---
### 🔄 FASE 3: UIManager (PENDIENTE)
**Impacto estimado**: ~300 líneas + rendering de texto movido
**Responsabilidad**: Renderizar y actualizar interfaz de usuario
**Miembros a mover**:
- `Notifier notifier_`
- `TextRenderer text_renderer_debug_`
- `bool show_debug_`
- Variables FPS (`fps_frame_count_`, `fps_current_`, `fps_text_`, `vsync_text_`)
**Métodos a mover**:
- `showNotificationForAction()`
- Renderizado de FPS, debug info, gravedad, tema, modo
---
### 🔄 FASE 4: StateManager (PENDIENTE)
**Impacto estimado**: ~600 líneas de lógica compleja
**Responsabilidad**: Gestionar máquina de estados (DEMO/LOGO/SANDBOX)
**Miembros a mover**:
- `AppMode current_app_mode_, previous_app_mode_`
- Variables DEMO (`demo_timer_`, `demo_next_action_time_`)
- Variables LOGO (todas las relacionadas con logo mode)
**Métodos a mover**:
- `setState()`
- `updateDemoMode()`
- `performDemoAction()`
- `randomizeOnDemoStart()`
- `enterLogoMode() / exitLogoMode()`
---
### 🔄 FASE 5: ShapeManager (PENDIENTE)
**Impacto estimado**: ~400 líneas + lógica de shapes
**Responsabilidad**: Crear, actualizar y renderizar figuras 3D polimórficas
**Miembros a mover**:
- `SimulationMode current_mode_`
- `ShapeType current_shape_type_, last_shape_type_`
- `std::unique_ptr<Shape> active_shape_`
- `float shape_scale_factor_`
- `bool depth_zoom_enabled_`
**Métodos a mover**:
- `toggleShapeModeInternal()`
- `activateShapeInternal()`
- `updateShape()`
- `generateShape()`
- `clampShapeScale()`
---
### 🔄 FASE 6: Limpieza y Consolidación Final (PENDIENTE)
**Impacto esperado**: Engine reducido a ~400 líneas (coordinador)
**Tareas**:
1. Limpiar `engine.h` / `engine.cpp` de código legacy
2. Verificar que todos los sistemas están correctamente integrados
3. Documentar interfaz pública de Engine
4. Actualizar `CLAUDE.md` con nueva arquitectura
5. Verificar compilación y funcionamiento completo
---
## Arquitectura Final Esperada
```cpp
class Engine {
private:
// SDL Core
SDL_Window* window_;
SDL_Renderer* renderer_;
// Componentes (composición)
std::unique_ptr<InputHandler> input_handler_;
std::unique_ptr<SceneManager> scene_manager_;
std::unique_ptr<UIManager> ui_manager_;
std::unique_ptr<StateManager> state_manager_;
std::unique_ptr<ShapeManager> shape_manager_;
std::unique_ptr<ThemeManager> theme_manager_;
// Estado mínimo
bool should_exit_;
float delta_time_;
public:
void run() {
while (!should_exit_) {
calculateDeltaTime();
input_handler_->process(*this);
update();
render();
}
}
};
```
## Notas
- Cada fase incluye su propio **commit atómico**
- Las fases son **secuenciales** (cada una depende de la anterior)
- Se preserva **100% de funcionalidad** en cada fase
- Compilación verificada después de cada commit
---
*Documento de seguimiento para refactorización ViBe3 Physics*
*Última actualización: 2025-01-10 - Fase 1 completada*