Refactorización de código legacy en C#: Guía práctica para desarrolladores .NET

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Refactorización de código heredado en C#: Cómo convertir un proyecto obsoleto en un producto .NET moderno



Cada desarrollador .NET, tarde o temprano, se encuentra con código heredado: clases monolíticas de 3000 líneas, lógica espagueti en archivos .aspx.cs y cadenas mágicas dispersas por todo el proyecto. La refactorización de dicho código no es solo "peinar" la sintaxis, sino una tarea estratégica: mejorar la arquitectura sin romper la lógica de negocio. En este artículo, analizaremos enfoques prácticos para la refactorización de código C# que le ayudarán a modernizar proyectos heredados de forma segura y eficiente.



1. Preparación: Por qué la refactorización de código heredado requiere un enfoque especial



El principal error de los principiantes es lanzarse inmediatamente a reescribir el código. En C# .NET, los proyectos heredados a menudo contienen dependencias ocultas: clases estáticas, estados globales, vínculos rígidos con la base de datos a través de ADO.NET. Cualquier cambio puede provocar una cascada de errores.



Principales señales de código heredado en C#:

  • Falta de pruebas unitarias — el código no está cubierto por unit tests, lo que hace que la refactorización sea arriesgada.
  • Objetos divinos (God Objects) — clases que hacen de todo: desde trabajar con la BD hasta renderizar la UI.
  • Dependencias rígidas — creación directa de instancias mediante new SqlConnection() dentro de los métodos.
  • Cadenas y números mágicos — configuraciones incrustadas en el código, no en app.config o appsettings.json.
  • Uso de API obsoletas — por ejemplo, WebClient en lugar de HttpClient o ArrayList en lugar de List<T>.


Antes de comenzar la refactorización, asegúrese de: congelar los requisitos con el cliente, configurar un sistema de control de versiones (Git) y crear una "red de seguridad" en forma de pruebas de integración.



2. Refactorización segura: Estrategia "Mover la pared"



La técnica clásica para C# es el Strangler Fig Pattern (Patrón "Higuera estranguladora"). En lugar de reescribir todo de una vez, reemplaza gradualmente los componentes antiguos por nuevos, hasta que el código antiguo deje de usarse.



2.1. Extracción de interfaces e inyección de dependencias



El antipatrón más común en C# heredado son los métodos auxiliares estáticos. Veamos un ejemplo:



// Código obsoletopublic class OrderService{    public void ProcessOrder(int orderId)    {        var conn = new SqlConnection("Server=myServer;Database=myDB;...");        var cmd = new SqlCommand("SELECT * FROM Orders WHERE Id = " + orderId, conn);        // ... toneladas de lógica    }}


Paso 1: Extraemos una interfaz para el acceso a datos.



public interface IOrderRepository{    Order GetById(int orderId);}

public class OrderRepository : IOrderRepository{ private readonly string _connectionString;

public OrderRepository(string connectionString) { _connectionString = connectionString; }

public Order GetById(int orderId) { using var conn = new SqlConnection(_connectionString); // ... consulta segura }}


Paso 2: Inyectamos la dependencia a través del constructor. Ahora puede reemplazar el repositorio en las pruebas, y el propio OrderService ha dejado de depender de una implementación específica de la BD.



public class OrderService{    private readonly IOrderRepository _orderRepository;

public OrderService(IOrderRepository orderRepository) { _orderRepository = orderRepository; }

public void ProcessOrder(int orderId) { var order = _orderRepository.GetById(orderId); // ... lógica de negocio }}


2.2. Sustitución de tipos obsoletos por modernos



En .NET Framework se usaban a menudo ArrayList, Hashtable y

Blogs

Book Recommendations