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>
5.6 KiB
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.hsource/input/input_handler.cpp
Métodos públicos agregados a Engine (24 total):
// 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:
- Limpiar
engine.h/engine.cppde código legacy - Verificar que todos los sistemas están correctamente integrados
- Documentar interfaz pública de Engine
- Actualizar
CLAUDE.mdcon nueva arquitectura - Verificar compilación y funcionamiento completo
Arquitectura Final Esperada
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