Skip to content

Commit 8b19a5b

Browse files
Create readme.md
1 parent 8fbbd55 commit 8b19a5b

File tree

1 file changed

+154
-0
lines changed
  • docs/temas/Estudio de casos sobre refactorización de proyectos legacy

1 file changed

+154
-0
lines changed
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
# 📑 Estudio de Casos sobre Refactorización de Proyectos Legacy
2+
3+
**Alumno:** Rodrigo Sotelo Rubio
4+
**Matrícula:** 21212053
5+
6+
---
7+
8+
## 1. Introducción
9+
10+
En este documento presento un análisis sobre la refactorización de proyectos legacy, explorando casos prácticos donde se aplicaron patrones de diseño para mejorar la calidad, mantenibilidad y escalabilidad del software.
11+
12+
Un sistema legacy, aunque funcional, suele tener problemas de deuda técnica ⚠️, acoplamiento excesivo o falta de pruebas automatizadas. La refactorización, apoyada en patrones de diseño, es una estrategia clave para extender la vida útil de estos sistemas y alinearlos con las necesidades actuales.
13+
14+
---
15+
16+
## 2. Estudio de Casos 🛠️
17+
18+
### Caso 1: Sistema bancario con código spaghetti 🍝
19+
20+
- **Problema:** el sistema tenía múltiples métodos duplicados y clases monolíticas difíciles de mantener.
21+
- **Refactorización aplicada:** introducción del patrón Facade para unificar accesos a subsistemas.
22+
- **Resultado:** el código se volvió más claro 📝, con menor acoplamiento y mayor facilidad para agregar nuevas funcionalidades.
23+
24+
---
25+
26+
### Caso 2: Aplicación web sin pruebas unitarias 🐞
27+
28+
- **Problema:** cualquier cambio en el código generaba errores en producción porque no había pruebas.
29+
- **Refactorización aplicada:** se aplicó Inyección de Dependencias y se implementó el patrón Strategy para manejar reglas de negocio sin condicionales extensos.
30+
- **Resultado:** se logró escribir pruebas unitarias ✅ y reducir drásticamente los errores en producción.
31+
32+
**Ejemplo en C# 💻**
33+
34+
**Código legacy con condicionales:**
35+
36+
```csharp
37+
public class CalculadoraPrecio
38+
{
39+
public double Calcular(string tipoCliente, double monto)
40+
{
41+
if (tipoCliente == "VIP")
42+
{
43+
return monto * 0.8; // 20% de descuento
44+
}
45+
else if (tipoCliente == "Regular")
46+
{
47+
return monto * 0.9; // 10% de descuento
48+
}
49+
else
50+
{
51+
return monto; // sin descuento
52+
}
53+
}
54+
}
55+
```
56+
57+
**Código refactorizado:**
58+
59+
60+
```csharp
61+
public interface IDescuentoStrategy
62+
{
63+
double AplicarDescuento(double monto);
64+
}
65+
66+
public class DescuentoVIP : IDescuentoStrategy
67+
{
68+
public double AplicarDescuento(double monto) => monto * 0.8;
69+
}
70+
71+
public class DescuentoRegular : IDescuentoStrategy
72+
{
73+
public double AplicarDescuento(double monto) => monto * 0.9;
74+
}
75+
76+
public class SinDescuento : IDescuentoStrategy
77+
{
78+
public double AplicarDescuento(double monto) => monto;
79+
}
80+
81+
public class CalculadoraPrecio
82+
{
83+
private readonly IDescuentoStrategy _estrategia;
84+
85+
public CalculadoraPrecio(IDescuentoStrategy estrategia)
86+
{
87+
_estrategia = estrategia;
88+
}
89+
90+
public double Calcular(double monto) => _estrategia.AplicarDescuento(monto);
91+
}
92+
93+
// Uso
94+
class Program
95+
{
96+
static void Main()
97+
{
98+
var calculadora = new CalculadoraPrecio(new DescuentoVIP());
99+
Console.WriteLine(calculadora.Calcular(1000)); // Imprime 800
100+
}
101+
}
102+
103+
```
104+
105+
### Caso 3: Migración de un monolito a microservicios ⚡
106+
107+
- **Problema:** el monolito en Java no podía escalar adecuadamente y los tiempos de respuesta eran altos.
108+
- **Refactorización aplicada:** se utilizó el patrón Strangler Fig, migrando módulos de forma gradual a microservicios.
109+
- **Resultado:** se logró una arquitectura moderna 🏗️, más flexible y preparada para la escalabilidad.
110+
111+
112+
## 3. Tabla Comparativa 📊
113+
La siguiente tabla compara los casos estudiados, mostrando los problemas encontrados en los sistemas legacy, las refactorizaciones aplicadas, los patrones de diseño utilizados y los resultados obtenidos. Permite visualizar de manera resumida cómo cada estrategia contribuye a mejorar la calidad, mantenibilidad y escalabilidad del software.
114+
115+
| Caso | Problema | Refactorización aplicada | Patrón usado | Resultado |
116+
| ---- | --------------------- | --------------------------------- | ------------- | ---------------------------------------- |
117+
| 1 | Código spaghetti | Simplificación de accesos | Facade | Menor acoplamiento y mayor claridad |
118+
| 2 | Sin pruebas unitarias | Inyección de dependencias + tests | Strategy | Reducción de errores y más confiabilidad |
119+
| 3 | Monolito rígido | Migración progresiva | Strangler Fig | Arquitectura moderna y escalable |
120+
121+
## 4. Análisis Crítico 🧐
122+
La refactorización es más que un proceso técnico: es una estrategia de sostenibilidad del software.
123+
124+
### Ventajas: ✅
125+
126+
- **Reduce deuda técnica.**
127+
- **Facilita el mantenimiento y escalabilidad.**
128+
- **Permite aplicar pruebas automatizadas.**
129+
130+
### Limitaciones: ⚠️
131+
132+
- **Requiere inversión de tiempo y personal capacitado.**
133+
- **Puede ser difícil en sistemas críticos con poca documentación.**
134+
- **En los casos revisados, el uso de patrones como Facade, Strategy y Strangler Fig permitió transformar sistemas rígidos en arquitecturas más limpias y modernas.**
135+
136+
## 5. Conclusiones 🏁
137+
138+
Los sistemas legacy representan un reto, pero con una refactorización adecuada se pueden mantener competitivos.
139+
Los patrones de diseño son aliados esenciales para guiar la modernización de estos proyectos.
140+
Refactorizar no solo mejora la legibilidad, sino que establece una estrategia de evolución sostenible.
141+
142+
143+
144+
145+
146+
147+
148+
149+
150+
151+
152+
153+
154+

0 commit comments

Comments
 (0)