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>
219 lines
5.6 KiB
Markdown
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*
|