Proceso de reestructurar código existente para mejorarlo sin cambiar su comportamiento externo.
Refactoring (refactorización) es el proceso de reestructurar código existente sin cambiar su comportamiento externo. Los objetivos son: - Mejorar legibilidad - Reducir complejidad - Eliminar duplicación (DRY) - Facilitar mantenimiento - Preparar para nuevas funcionalidades Técnicas comunes: Extract Method, Rename, Move, Inline, Replace Conditional with Polymorphism. Regla de oro: Refactorizar con tests que validen que el comportamiento no cambió.
// ANTES: Código difícil de mantener function processOrder(order) { let total = 0; for (let i = 0; i < order.items.length; i++) { if (order.items[i].type === 'physical') { total += order.items[i].price * order.items[i].quantity; if (order.items[i].quantity > 10) { total = total * 0.9; // 10% descuento } } else if (order.items[i].type === 'digital') { total += order.items[i].price * order.items[i].quantity * 0.8; } } // Más lógica mezclada... return total; } // DESPUÉS: Código refactorizado interface OrderItem { type: 'physical' | 'digital'; price: number; quantity: number; } const BULK_DISCOUNT_THRESHOLD = 10; const BULK_DISCOUNT = 0.9; const DIGITAL_DISCOUNT = 0.8; function calculateItemTotal(item: OrderItem): number { const baseTotal = item.price * item.quantity; if (item.type === 'digital') { return baseTotal * DIGITAL_DISCOUNT; } if (item.quantity > BULK_DISCOUNT_THRESHOLD) { return baseTotal * BULK_DISCOUNT; } return baseTotal; } function calculateOrderTotal(items: OrderItem[]): number { return items.reduce((total, item) => { return total + calculateItemTotal(item); }, 0); } // Ahora es testeable, legible y extensible describe('calculateItemTotal', () => { it('aplica descuento a items digitales', () => { const item = { type: 'digital', price: 100, quantity: 1 }; expect(calculateItemTotal(item)).toBe(80); }); });