Saltar al pie de página
Iron Academy Logo
Aplicación C#
Aplicación C#

Otras categorías

Refactorización en WinForms C# — Una Mirada Más Profunda con Tim Corey

Tim Corey
1h 10m 16s

La refactorización es uno de esos temas que separa el código que simplemente funciona del código que es mantenible, flexible y preparado para el futuro. En la Lección 24 de la serie "C# App From Start to Finish", Tim Corey recorre una sesión de refactorización real y práctica dentro de una aplicación WinForms. En lugar de teoría, Tim refactoriza un proyecto existente, explicando por qué se necesitan cambios y cómo abordarlos de manera segura.

En este artículo, profundizaremos en refactorización de WinForms en C#, siguiendo estrictamente las explicaciones de Tim desde el video.

Qué Significa Refactorizar en Esta Lección

A las 0:02, Tim introduce la Lección 24 y explica que refactorizar significa reestructurar el código para que haga el mismo trabajo, pero de una manera mejor. Señala que la aplicación ya funciona, pero contiene "basura" y áreas que no están a la altura de los estándares. Según Tim, este es el momento adecuado para limpiar las cosas antes de que el proyecto crezca más.

Él enfatiza que la refactorización no se trata de agregar características, sino de mejorar la estructura, la legibilidad y la mantenibilidad a largo plazo, manteniendo el mismo comportamiento.

Limpieza de Valores de Retorno Innecesarios en Interfaces

Comenzando a las 0:31, Tim se sumerge en la primera refactorización: arreglar las firmas de los métodos de la interfaz. Él explica que al principio del proyecto, los métodos estaban devolviendo modelos innecesariamente. Dado que los objetos ya se pasan por referencia, devolver el mismo modelo nuevamente no tiene un propósito real.

Tim demuestra cambiar estos métodos a void, lo que inmediatamente rompe las implementaciones. Explica por qué esto sucede: cuando una interfaz cambia, todas las clases implementadoras deben coincidir exactamente con la nueva firma. Revisa la corrección del conector SQL y el conector de texto para alinearse con la interfaz actualizada.

A las 2:33, Tim se detiene para mostrar qué ocurre si dejas que Visual Studio implemente automáticamente la interfaz. Explica por qué ocurren nombres de métodos duplicados y aclara que solo los tipos de retorno no son suficientes para diferenciar las firmas de los métodos.

Corrección de Errores de Compilación Causados por la Refactorización

A las 4:00, Tim compila la solución y deliberadamente muestra los errores que aparecen. Explica que estos errores son esperados y útiles. Por ejemplo, el código que anteriormente esperaba un modelo devuelto ahora falla porque el método devuelve void.

Tim soluciona esto eliminando asignaciones innecesarias y recompilando la solución. Él destaca que la refactorización a menudo causa fallas a corto plazo, pero cada error apunta directamente al código que necesita mejora.

Mover Constantes de Nombres de Archivos a GlobalConfig

A partir de las 5:25, Tim refactoriza cómo se manejan los nombres de archivos en el conector de texto. Anteriormente, las rutas de archivo se almacenaban como constantes de cadena privadas dentro de la clase. Tim explica que estas ya no son necesarias porque los nombres de archivos ya existen en GlobalConfig.

Reemplaza las constantes locales por GlobalConfig.PeopleFile, GlobalConfig.PrizesFile, y propiedades similares. Tim explica que este cambio centraliza la configuración y asegura que toda la aplicación use rutas de archivo consistentes.

También hace un punto importante: evitar refactorizar demasiadas cosas a la vez. Cuando nota mejoras adicionales que podrían hacerse, explícitamente dice que volverá a ellas más tarde.

Refactorizando el Procesador del Conector de Texto

A las 7:44, Tim continúa la refactorización eliminando los parámetros de nombres de archivos de múltiples métodos en el procesador de conector de texto. Dado que los nombres de archivos ahora están en GlobalConfig, pasarlos es redundante.

Tim actualiza cuidadosamente las firmas de los métodos, reemplaza los parámetros con referencias a GlobalConfig y se apoya en la lista de errores de Visual Studio para guiarlo. Explica que ver muchos errores a la vez es normal durante la refactorización y que no es algo por lo que entrar en pánico.

A las 13:16, señala cuán útil es el seguimiento de errores en tiempo real cuando está limpiando sistemáticamente las llamadas a métodos en todo el proyecto.

Identificando Lógica de Interfaz que Hace Demasiado

A las 15:24, Tim destaca un importante problema de diseño: demasiada lógica dentro de un manejador de eventos de interfaz. Desplaza a través de un evento de clic de botón y explica que contiene mucho más código del que debería un evento. En Windows Forms, las acciones de usuario como los clics de botón son manejados por manejadores de eventos, que definen la acción específica a ejecutar cuando el evento ocurre.

Tim explica que el código de la interfaz debería centrarse solo en la interacción con el usuario. Windows Forms usa un modelo de programación basado en eventos, donde las acciones del usuario desencadenan eventos que son manejados por el código de la aplicación. La lógica de negocio, como la puntuación de torneos y el avance de ganadores, pertenece a una biblioteca de clases. Esta separación permite que la misma lógica sea reutilizada más tarde en una aplicación web o en una aplicación WPF.

Extrayendo Lógica de Torneos en la Biblioteca de Clases

Comenzando a las 17:55, Tim mueve la lógica de puntuación de torneos a un nuevo método público dentro de la clase de lógica de torneos. Lo llama UpdateTournamentResults y explica por qué acepta el modelo completo del torneo, no solo un solo enfrentamiento.

Copia la lógica desde el formulario, la pega en la biblioteca de clases y la ajusta para trabajar independientemente de los elementos de interfaz. Esta refactorización asegura que las reglas del torneo vivan en un solo lugar y puedan ser reutilizadas en cualquier parte.

Puntuando Enfrentamientos y Manejo Correcto de Fechas Libres

A las 21:37, Tim refactoriza cómo se puntúan los enfrentamientos. En lugar de trabajar con un solo enfrentamiento, recorre todas las rondas y todos los enfrentamientos, construyendo una lista de enfrentamientos que necesitan puntuación.

Él explica la lógica para detectar juegos completados y semanas libres. Tim señala que las semanas libres se manejaban anteriormente de una manera "chapucera" asignando puntajes falsos. La refactorización le permite manejar las fechas libres de manera explícita y limpia.

Extrayendo Puntuación en Métodos Privados

A las 28:17, Tim extrae la lógica de puntuación en un método privado. Él explica que métodos más pequeños y enfocados hacen que el código sea más fácil de entender y mantener.

También renombra métodos para reflejar mejor lo que hacen, como cambiar la lógica de puntuación a algo que claramente "marca ganadores en enfrentamientos".

Determinación Configurable de Ganador

Comenzando a las 29:58, Tim refactoriza la lógica de determinación de ganador para que pueda manejar escenarios de ganar por alta puntuación o por baja puntuación. Introduce una nueva configuración de la aplicación y explica por qué la configuración es mejor que codificar reglas.

Tim discute diseños alternativos, incluyendo almacenar este valor en el modelo de torneo, pero explica por qué ese cambio está fuera del alcance de esta lección.

Avanzando Ganadores y Guardando Resultados

A las 45:40, Tim continúa avanzando ganadores a la siguiente ronda. Él explica cómo se emparejan los ganadores con los enfrentamientos anteriores y por qué guardar los datos en el momento correcto es fundamental.

Más tarde, alrededor de 52:10, demuestra un enfoque conciso de ForEach para actualizar los enfrentamientos, explicando cómo es funcionalmente equivalente a un bucle tradicional, pero más compacto.

Corrigiendo errores introducidos por la refactorización

En 58:33, Tim descubre datos incorrectos en la base de datos y rastrea el problema a la lógica que se llamó antes de guardar el torneo. Explica que la refactorización a veces expone errores ocultos en lugar de crear nuevos.

Al mover la lógica de actualización al lugar correcto, después de la persistencia, Tim resuelve el problema y vuelve a probar la aplicación.

Reflexiones finales sobre la refactorización

A las 1:09:00, Tim concluye resumiendo lo que se logró con la refactorización en esta lección. Explica que la refactorización no se trata solo de tener un código más limpio, sino también de manejar casos marginales, corregir fallas de diseño y prepararse para cambios futuros.

Hace hincapié en que la refactorización es un proceso continuo e insinúa que la próxima lección se centrará en el manejo de errores.

Nota final

Esta lección muestra la refactorización tal como ocurre en proyectos reales: incremental, a veces desordenada, pero en última instancia gratificante. Siguiendo el enfoque paso a paso de Tim Corey, obtienes un esquema práctico para mejorar las aplicaciones WinForms sin romper la funcionalidad, y sin adivinar qué hacer a continuación.

Hero Worlddot related to Refactorización en WinForms C# — Una Mirada Más Profunda con Tim Corey
Hero Affiliate related to Refactorización en WinForms C# — Una Mirada Más Profunda con Tim Corey

Gana más compartiendo lo que te gusta

¿Creas contenidos para desarrolladores que trabajan con .NET, C#, Java, Python o Node.js? ¡Convierte tu experiencia en un ingreso extra!

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame