primera tarea Hi, my name is Rodrigo Rencoret, i am 20 years old and im studying engineering.
- Meaningful Names (Cap. 2): -1.0 puntos
- Functions (Cap. 3): -2.0 puntos
- Objects and Data Structures (Cap. 6): -2.0 puntos
- Classes (Cap. 10): -1.5 puntos
- Patrón MVC: -0.5 puntos
- TOTAL: -7.0 puntos
| Línea | Nombre Actual | Problema | Nombre Sugerido |
|---|---|---|---|
| Múltiples | datosEquipo |
Español/Inglés mezclado | teamData o teamUnits |
| 18 | _teamsFolder |
Inconsistente con nomenclatura | _teamsDirectory |
| 119-123 | condicion1, condicion2, condicion3 |
Nombres genéricos no descriptivos | isValidInput, isNegativeNumber, exceedsMaxFiles |
| 159 | var (jugador1Data, jugador2Data) |
Español/Inglés mezclado | var (player1Data, player2Data) |
| 279 | data en UnitVerifierData |
Nombre genérico | verificationData |
| 523 | samuraiJson, monstrersJson |
Typo en "monsters" | monstersJson |
| Línea | Nombre Actual | Problema | Nombre Sugerido |
|---|---|---|---|
| 17-20 | UnidadActiva_1, UnidadActiva_2, etc. |
Español/números, no descriptivo | PrimarySamurai, FirstMonster, SecondMonster, ThirdMonster |
| 25-30 | NumeroFullTurns, NumeroBlinkingTurns |
Español/Inglés mezclado | FullTurnsCount, BlinkingTurnsCount |
| 313-317 | Variables count, i |
Nombres genéricos en contexto complejo | activeUnitsCount, unitIndex |
| Línea | Nombre Actual | Problema | Nombre Sugerido |
|---|---|---|---|
| 78 | cond |
Abreviación no descriptiva | shouldContinueTurn |
| 57 | numero_ronda |
Guión bajo inconsistente | roundNumber |
| Archivo | Problema | Solución |
|---|---|---|
| Múltiples | Variables de una letra (h, s, u, m) |
Usar nombres descriptivos como skill, samurai, unit, monster |
| Función | Líneas | Problema | Solución |
|---|---|---|---|
PrepararJugadores() |
~80 | Múltiples responsabilidades | Dividir en: LoadTeamFiles(), CreatePlayersFromData(), ValidateTeamData() |
VerifyUnit() |
~40 | Validación compleja | Extraer: ValidateUnitFormat(), CheckDuplicates(), ValidateSamuraiSkills() |
CrearSamurai() |
~25 | Constructor manual muy largo | Usar patrón Builder o Factory |
CrearMonstruo() |
~30 | Constructor manual muy largo | Usar patrón Builder o Factory |
RevisarEquiposSeanValidos() |
~50 | Lógica de validación compleja | Dividir en validaciones específicas |
| Función | Líneas | Problema | Solución |
|---|---|---|---|
ConsumirTurno() |
~80 | Switch case muy largo | Usar patrón Strategy para cada tipo de afinidad |
ConsumirTurnoPorAfinidad() |
~30 | Switch case complejo | Extraer cada caso a método específico |
| Función | Líneas | Problema | Solución |
|---|---|---|---|
SeleccionarMonstruoInvocar() |
~50 | Comentario "ACORTAR" presente | Dividir en: GetAvailableMonsters(), ShowMonsterMenu(), ProcessSelection() |
InvocarMonstruo() |
~60 | Múltiples responsabilidades | Separar lógica de: posicionamiento, validación, efectos |
// Samurai.cs - 17 parámetros
public Samurai(string name, int hp, int mp, int str, int skl, int mag, int spd, int lck,
string phys, string gun, string fire, string ice, string elec, string force,
string light, string dark, List<Habilidad> habilidades, View view)
// Monster.cs - 17 parámetros
public Monster(string name, int hp, int mp, int str, int skl, int mag, int spd, int lck,
string phys, string gun, string fire, string ice, string elec, string force,
string light, string dark, List<Habilidad> habilidades, View view)Solución: Usar objetos de configuración o patrón Builder.
// ❌ PROBLEMA: Todas las propiedades son públicas
public int HP { get; set; }
public int MP { get; set; }
public int Str { get; set; }
// ... etc
// ✅ SOLUCIÓN: Encapsular con métodos
public int HP { get; private set; }
public void TakeDamage(int amount) { /* lógica */ }
public void Heal(int amount) { /* lógica */ }Problema: Redeclaran TODAS las propiedades ya definidas en Unidad
// ❌ En Samurai.cs - líneas 8-32
public string Name { get; set; } // Ya existe en Unidad
public int HP { get; set; } // Ya existe en Unidad
// ... todas las propiedades duplicadas
// ❌ En Monster.cs - líneas 9-33
// Misma duplicaciónSolución: Eliminar propiedades duplicadas, usar solo las de la clase base.
// ❌ PROBLEMA: Sin validación ni encapsulación
public string name { get; set; }
public int cost { get; set; }
// ✅ SOLUCIÓN: Validar en setters
public string Name
{
get => _name;
set => _name = !string.IsNullOrEmpty(value) ? value : throw new ArgumentException();
}Problema: Las clases mezclan ser estructuras de datos (getters/setters públicos) con objetos (métodos de comportamiento).
Responsabilidades múltiples:
- Manejo de archivos:
LeerArchivoDeEquipo(),CargarSamuraisDesdeJson() - Creación de unidades:
CrearSamurai(),CrearMonstruo() - Validación:
RevisarEquiposSeanValidos(),VerifyUnit() - Control de flujo:
Play(),JugarRondas() - UI: Múltiples llamadas a
_view.WriteLine()
Solución: Dividir en:
GameControllerTeamFileManagerUnitFactoryTeamValidator
Responsabilidades múltiples:
- Estado del juego: Manejo de turnos
- UI: Mostrar menús y estado
- Validación: Verificar ganadores
- Coordinación: Entre jugadores y unidades
Responsabilidades múltiples:
- Estado del jugador: Unidades, stats
- Lógica de turnos: Sistema complejo de turnos
- Validación:
PuedeContinuarJugando()
// ❌ Líneas 183-220: Clase anidada que debería estar separada
public class SeparadorDatosJugadores
{
// 40 líneas de código que deberían estar en archivo separado
}
// ❌ Líneas 275-285: Clase de datos interna
private class UnitVerifierData
{
// Debería ser una clase independiente
}| Clase | Método | Líneas | Problema |
|---|---|---|---|
| Game | PrepararJugadores() |
~80 | Hace demasiadas cosas |
| Ronda | EjecutarCicloDeTurnos() |
~50 | Lógica compleja en un solo método |
| Jugador | ConsumirTurno() |
~80 | Switch case gigante |
// ❌ En Game.cs - Lógica de negocio con UI
public void Play()
{
// Lógica de negocio
List<Jugador> jugadores = PrepararJugadores();
// UI mezclada
_view.WriteLine("Error: Al menos uno de los jugadores es nulo.");
// Más lógica de negocio
Ronda Partida = new Ronda(PrimerJugador, SegundoJugador, _view);
}Problema: No hay separación clara entre:
- Modelo: Clases de dominio (
Jugador,Unidad,Habilidad) - Vista: Interface de usuario (
View) - Controlador: Lógica de coordinación
Actual: Todo mezclado en Game.cs que actúa como "god object"
📁 Controllers/
├── GameController.cs // Control principal del juego
├── BattleController.cs // Control de batallas/rondas
├── UnitController.cs // Control de unidades
└── MenuController.cs // Control de menús
📁 Models/
├── Game.cs // Solo estado del juego
├── Player.cs // Solo estado del jugador
├── Unit.cs // Solo estado de unidades
└── Battle.cs // Solo estado de batalla
📁 Views/
├── IGameView.cs // Interface para vistas
├── ConsoleView.cs // Implementación consola
└── GuiView.cs // Implementación GUI
Problema: Comunicación directa entre capas Solución: Implementar eventos para notificaciones entre Model-View-Controller
- Dividir
Game.csen múltiples clases especializadas - Refactorizar funciones largas (>20 líneas) en funciones más pequeñas
- Encapsular propiedades en
Unidad,Samurai,Monster - Eliminar duplicación en constructores de clases derivadas
- Implementar patrón MVC separando responsabilidades
- Renombrar variables con nombres descriptivos en inglés
- Extraer clases anidadas a archivos separados
- Reducir parámetros en constructores usando builders
- Aplicar patrón Strategy para manejo de afinidades
- Implementar patrón Observer para comunicación entre capas
- Agregar validación en setters de propiedades
- Consistencia en nomenclatura español vs inglés
- Rider/Visual Studio: Refactoring automático
- SonarQube: Análisis de calidad de código
- ReSharper: Sugerencias de mejoras
- CodeMaid: Limpieza automática de código
Total de violaciones identificadas: 47
Tiempo estimado de corrección: 8-12 horas