2182. Identidad de la lección
2183. Objetivo de aprendizaje
Después de esta lección, podrás explicar por qué una refactorización propuesta por la IA debe reducirse, posponerse o rechazarse, evaluando su complejidad, los límites de responsabilidad y el coste de la abstracción.
2184. Por qué importa
Las refactorizaciones generadas por IA suelen parecer profesionales porque reducen código repetido e introducen interfaces reutilizables. Esa apariencia no demuestra que la abstracción encaje con el juego. Una abstracción puede ocultar diferencias importantes, repartir la responsabilidad entre sistemas sin relación y dificultar el razonamiento sobre el comportamiento futuro. Rechazar una refactorización es una decisión técnica cuando el diseño propuesto crea más riesgo que valor.
2185. Conocimientos previos
Debes poder:
- identificar un contrato de comportamiento antes de modificar el código;
- comparar el comportamiento observable antes y después de una refactorización;
- distinguir una limpieza local de un cambio de responsabilidad;
- aplicar el principio de la lección anterior: refactorizar sin cambiar el contrato.
2186. Concepto central
Una abstracción se justifica por un comportamiento compartido y estable, no por una similitud superficial.
Dos fragmentos pueden parecer iguales y, sin embargo, representar reglas distintas, tener responsables diferentes o cambiar por motivos diferentes. Generalizarlos demasiado pronto crea un impuesto de abstracción: conceptos adicionales, indirección, configuración y coordinación que habrá que mantener en cada cambio futuro. Una refactorización segura conserva el contrato y mantiene clara la responsabilidad. Si la abstracción propuesta no cumple esas condiciones, hay que reducirla, posponerla o rechazarla.
Usa estas cuatro preguntas:
| Pregunta | Evidencia que debes buscar |
|---|---|
| ¿Qué comportamiento se comparte realmente? | Las mismas entradas, salidas, invariantes y reglas de fallo |
| ¿Quién es responsable del comportamiento? | Un sistema o módulo claro que pueda modificarlo |
| ¿Qué cambio futuro se está anticipando? | Una variación concreta y probable, no una hipótesis |
| ¿Qué complejidad añade la abstracción? | Nuevas interfaces, parámetros, indirección, configuración y pruebas |
2187. Modelo mental
Prueba del coste de abstracción
Trata una abstracción propuesta como una decisión, no como una mejora automática:
Duplicación observada → ¿Contrato compartido? → ¿Responsable compartido? → ¿Menor complejidad total? → Aceptar, reducir, posponer o rechazar
Aplica esta tabla:
| Hallazgo | Decisión |
|---|---|
| El comportamiento y la responsabilidad son estables, y la abstracción elimina más complejidad de la que añade | Aceptar una abstracción pequeña |
| Parte del comportamiento coincide, pero hay diferencias importantes | Reducir la abstracción o extraer solo el núcleo estable |
| La similitud probablemente sea temporal o la variación futura es especulativa | Posponer la generalización |
| La abstracción mezcla responsabilidades o vuelve opaco el contrato | Rechazarla |
La pregunta no es «¿Se puede hacer genérico?». La pregunta es «¿Facilitará y permitirá verificar el próximo cambio correcto?».
2188. Ejemplo concreto
Una IA revisa dos sistemas locales de un prototipo:
- Una interacción con un objeto recogible comprueba la cercanía del jugador, concede un objeto y elimina el objeto del escenario.
- Una interacción con una puerta comprueba la cercanía, verifica una condición de acceso y cambia el estado de la puerta.
La IA propone un sistema genérico Interactable con una interfaz común, una cola de interacciones, un objeto de contexto, un tipo universal de resultado, un bus de eventos y una cadena de validación configurable. La propuesta resulta atractiva: ambos sistemas muestran un aviso de interacción y responden a la proximidad.
No debe aceptarse tal como está. La similitud visible es limitada, mientras que las reglas y las responsabilidades son distintas. La lógica del objeto recogible pertenece a la adquisición de objetos; el acceso y el estado de la puerta pertenecen a la puerta o al sistema de acceso. Un aviso compartido o una comprobación de distancia podrían ser una extracción reducida si tienen un contrato estable. La cola, el bus de eventos y el modelo de resultado generalizado no se justifican solo con este ejemplo.
Una respuesta adecuada para la IA sería:
«No introduzcas el sistema genérico de interacción. Mantén separadas las reglas del objeto recogible y de la puerta. Extrae primero únicamente la comprobación de proximidad si sus entradas y fallos son idénticos. Registra el resto de la duplicación como una posible tarea posterior y verifica que el contrato de interacción no cambie».
No se está rechazando toda mejora del código. Se está rechazando la incorporación de responsabilidades e indirección especulativas.
2189. Flujo de trabajo nativo de IA
Usa la IA para generar propuestas y críticas, no como autoridad para decidir si una generalización es segura.
- Pide a la IA que describa los contratos actuales, los responsables y las diferencias entre los sistemas candidatos.
- Pídele que separe la duplicación verificada de los requisitos futuros especulativos.
- Solicita la refactorización mínima y una lista de la complejidad que añadiría la abstracción mayor.
- Compara la propuesta con el código real y con la línea base de comportamiento de la lección anterior.
- Elige una decisión: aceptar una extracción reducida, posponer la generalización o rechazar la abstracción.
- Si implementas un cambio, mantenlo acotado y repite las comprobaciones de comportamiento. No aceptes un marco general solo porque el código generado compile.
Puedes usar este prompt:
«Analiza esta abstracción propuesta como una revisión de riesgos. Enumera el contrato compartido, las reglas distintas, el responsable de cada regla, la nueva indirección, la configuración añadida y las pruebas necesarias. Recomienda aceptar, reducir, posponer o rechazar. No escribas código hasta justificar la recomendación».
2190. Error común
El error más común es confundir sintaxis repetida con responsabilidad repetida. Es fácil aceptar una clase base, un gestor o un sistema de eventos genérico porque acorta el cambio actual. Sin embargo, eso puede trasladar la toma de decisiones lejos del sistema que posee la regla. El resultado es un código más abstracto pero menos claro, controlado por banderas y callbacks en lugar de contratos directos.
Otro error es usar «quizá lo necesitemos después» como prueba de que la abstracción se necesita ahora. Una posible característica futura no es un requisito actual. Conserva un diseño local y claro hasta que un segundo caso real demuestre un contrato común y estable.
2191. Evaluación práctica
Memo de decisión sobre el caso
El cuestionario es una comprobación formativa de conocimientos. Este memo de decisión es la evaluación práctica puntuable de la lección.
Revisa esta propuesta:
«El juego tiene tres sistemas con una comprobación
canActivate(): una estación de curación, una puerta cerrada y un activador de misión. Crea una clase baseActivatableconcondition,cost,onActivateyonFailurecomo callbacks universales. Dirige todas las activaciones mediante unActivationManagerpara poder añadir dispositivos futuros sin escribir código nuevo».
Redacta un breve memo de decisión con estas cinco partes:
- Comportamiento compartido: identifica qué es realmente común y qué solo parece común.
- Responsabilidad: indica qué sistema debe poseer cada regla: curación, acceso o progresión de misión.
- Coste de abstracción: enumera al menos tres costes introducidos por la clase base y el gestor.
- Decisión: elige aceptar de forma limitada, posponer o rechazar, y justifica tu elección con evidencias del caso.
- Siguiente paso seguro: especifica el cambio mínimo, si existe, que pueda implementarse y verificarse sin cambiar el comportamiento.
Tu decisión debe incluir una razón concreta, no solo una preferencia de estilo.
2192. Validación / evidencias
Puntúa el memo según seis criterios, con 0–2 puntos por criterio:
| Criterio | 0 puntos | 1 punto | 2 puntos |
|---|---|---|---|
| Evidencia del contrato compartido | Da por hecho que la similitud es suficiente | Identifica algún comportamiento compartido | Compara entradas, salidas, invariantes o reglas de fallo y distingue la forma compartida de las reglas compartidas |
| Responsabilidad | Omite los responsables o centraliza todas las reglas | Identifica responsables sin explicar el límite | Asigna las reglas de curación, acceso y misión a responsables claros y explica por qué |
| Coste de abstracción | No indica ningún coste concreto | Indica uno o dos costes | Indica al menos tres costes pertinentes, como indirección, configuración, coordinación o pruebas adicionales |
| Justificación de la decisión | Expresa solo una preferencia | Ofrece una razón general | Elige aceptar de forma limitada, posponer o rechazar y lo respalda con evidencias del caso |
| Siguiente paso acotado | Propone una reescritura amplia o ningún paso | Sugiere un cambio sin un límite claro | Define el cambio seguro más pequeño o explica de forma explícita por qué no debe hacerse ningún cambio |
| Evidencia de validación | No propone ninguna comprobación de comportamiento | Propone una comprobación imprecisa | Identifica el contrato existente y las comprobaciones u observaciones concretas que confirmarían que el comportamiento no ha cambiado |
La evaluación práctica se completa con 9 de 12 puntos y al menos 1 punto tanto en justificación de la decisión como en evidencia de validación. Registra el memo, la puntuación de cada criterio, la puntuación total, los comentarios de evaluación y el estado completado o revisar.
Una respuesta sólida puede aceptar una primitiva pequeña, como una comprobación de proximidad verificada, y rechazar el marco universal de activación. La calidad depende del razonamiento y de los límites establecidos, no de rechazar por sistema.
2193. Conclusiones clave
- Una sintaxis parecida no demuestra que exista un contrato ni un responsable común.
- El coste de una abstracción incluye indirección, configuración, coordinación y esfuerzo de verificación.
- Generaliza el comportamiento estable, no las características futuras especulativas.
- Extraer una parte pequeña, posponer o rechazar puede ser la decisión correcta de refactorización.
- La IA puede mostrar opciones y riesgos; el desarrollador debe juzgar si la abstracción encaja con el juego.
2194. Próxima lección
Siguiente: continúa con 5.8 — Revisión de código con IA, donde aplicarás criterios disciplinados de revisión a cambios asistidos por IA.
2195. Comprobación
Responde estas preguntas por tu cuenta antes de leer las respuestas.
¿Cuál es la razón más sólida para rechazar un marco genérico de activación propuesto?
Mostrar respuesta y explicación
Respuesta: El marco mezclaría reglas con responsables distintos y añadiría indirección sin un contrato común estable.
Por qué: Una abstracción se vuelve insegura cuando oculta responsabilidades distintas y añade complejidad sin un contrato común estable. El mecanismo del lenguaje, el número de archivos y la rapidez de generación no determinan si el diseño encaja.
¿Cuándo es más defendible posponer la generalización?
Mostrar respuesta y explicación
Respuesta: Cuando la variación futura propuesta es hipotética y el contrato compartido aún no se ha estabilizado.
Por qué: Posponer es apropiado cuando el diseño se está construyendo alrededor de un futuro imaginado y todavía no se ha demostrado el comportamiento común. Esperar un segundo caso real puede revelar el límite correcto.
¿Qué debe pedir el desarrollador a la IA antes de aceptar una refactorización amplia?
Mostrar respuesta y explicación
Respuesta: Revisar el contrato compartido, las reglas distintas, la responsabilidad, la indirección añadida y la carga de verificación.
Por qué: El desarrollador necesita una revisión de riesgos antes de implementar. Examinar contratos, responsabilidades, indirección y verificación hace visible el coste de la abstracción y permite tomar una decisión acotada.