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>
This commit is contained in:
218
REFACTOR_PLAN.md
Normal file
218
REFACTOR_PLAN.md
Normal file
@@ -0,0 +1,218 @@
|
||||
# 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*
|
||||
Reference in New Issue
Block a user