URL del FrontEnd: https://stitch.withgoogle.com/projects/12718200880293608041
📅 Versión: Diciembre 2025
El objetivo de esta práctica es que el estudiante identifique errores de diseño y arquitectura en un código realista simulado, y proponga mejoras aplicando patrones de diseño del catálogo GoF, principios SOLID y técnicas de refactorización.
Estás auditando el sistema de manufactura para la empresa ficticia TraxNY, Inc., que produce:
- Lingotes de oro con múltiples purezas.
- Diamantes sintéticos de laboratorio en distintas fases de crecimiento.
- Cadenas de distintos estilos (cubanas, figaro, rope) con diversas densidades.
El sistema actual fue escrito sin ningún patrón de diseño, presenta un alto nivel de spaghetti code, y necesita urgentemente mejoras para ser escalable, mantenible y adaptable a nuevos productos.
El código está escrito en C#, compilable en .NET SDK 8.0, pero estructuralmente deficiente.
public class GoldIngot {
public string Size;
public double Purity;
public string FurnaceStatus;
public void StartMelting() {
Console.WriteLine("Gold melting started...");
}
public void StopMelting() {
Console.WriteLine("Melting stopped.");
}
public void ReportStatus() {
Console.WriteLine("Furnace: " + FurnaceStatus + ", Purity: " + Purity);
}
}
public class DiamondLab {
public string Stage;
public void Grow() {
Console.WriteLine("Diamond growth started...");
}
public void Analyze() {
Console.WriteLine("Analyzing diamond at stage: " + Stage);
}
}
public class Chain {
public string Style;
public double Density;
public void Forge() {
Console.WriteLine("Forging " + Style + " chain...");
}
public void TestResistance() {
Console.WriteLine("Testing resistance of chain with density: " + Density);
}
}
public class ProductionManager {
public void Produce(string itemType) {
if (itemType == "gold") {
var g = new GoldIngot();
g.StartMelting();
g.StopMelting();
} else if (itemType == "diamond") {
var d = new DiamondLab();
d.Grow();
d.Analyze();
} else if (itemType == "chain") {
var c = new Chain();
c.Forge();
c.TestResistance();
} else {
Console.WriteLine("Unknown product type.");
}
}
}Se espera que el estudiante identifique y documente mínimo 10 defectos, entre los cuales se encuentran malas prácticas relacionadas con patrones GoF.
| # | Problema detectado | Categoría / Falta de patrón |
|---|---|---|
| 1 | Uso de if para seleccionar productos |
❌ Violación de OCP, se puede aplicar Factory Method o Strategy |
| 2 | Clases con múltiples responsabilidades | ❌ Violación de SRP, se puede aplicar Command |
| 3 | Acoplamiento fuerte entre ProductionManager y productos concretos |
❌ Falta de Abstracción, aplicar Abstract Factory o Interface Segregation |
| 4 | Lógica procedural duplicada en cada tipo de producto | ❌ Puede abstraerse usando Template Method |
| 5 | Uso de strings mágicos para lógica ("gold", "diamond") |
❌ Frágil, aplicar Enum Strategy o constantes |
| 6 | No existe interfaz común entre productos | ❌ Falta de Polimorfismo, usar una interfaz IProductOperation |
| 7 | Métodos StartMelting, Forge, Grow, etc. no están encapsulados |
❌ Mal diseño, podría encapsularse con Command |
| 8 | Falta de un mecanismo para registrar el estado y eventos | ❌ Sin patrón Observer ni Mediator |
| 9 | Imposibilidad de testear producción sin acceder a consola | ❌ Acoplamiento a consola, falta de Adapter o Strategy de logging |
| 10 | Si se agrega un nuevo producto (e.g. Pulsera), se rompe Produce() |
❌ Violación OCP – debe usarse Factory Method |
Estas son guías y pistas, no implementaciones completas:
| Problema | Posible patrón GoF | Pista de refactorización |
|---|---|---|
| Producción de productos condicionada | Factory Method |
Crea una interfaz IProductFactory con método CreateProduct() |
| Ejecución de pasos de fabricación | Template Method |
Define método base Fabricate() en una clase abstracta |
| Lógica encapsulada por tipo de producto | Strategy |
Cada producto implementa su lógica de forma independiente |
| Seguimiento de eventos de manufactura | Observer o Mediator |
Notifica cuando un lote inicia, termina, etc. |
| Evitar dependencias directas | Abstract Factory + DI |
Usa contenedores como Microsoft.Extensions.DependencyInjection |
| Interfaz única para productos | ProductBase o IManufacturable |
Usa herencia o interfaces para tratar todos igual |
| Consola como dependencia | Adapter |
Crea una clase IOutput para manejar impresiones |
-
README.md
- Listado de problemas identificados (mínimo 10).
- Justificación de cada problema y patrón GoF sugerido.
- Diagrama antes/después (opcional UML).
-
Refactorings.cs
- Fragmentos de código modificados (NO código completo).
- Comentarios que expliquen cada cambio aplicado.
-
patterns_aplicados.pdf
- Breve reseña de cada patrón aplicado (con fuente bibliográfica: GoF o refactoring.guru).
- Ejemplos mínimos y justificación.
-
Capturas de pantalla
- Código original.
- Código con cambios parciales o sugerencias.
- Refactoring Guru – Patrones GoF: https://refactoring.guru/es/design-patterns
- Libro: Design Patterns – Gamma, Helm, Johnson, Vlissides
- Clean Code – Robert C. Martin
- Catálogo de patrones estructurales y de comportamiento
| Criterio | Puntaje |
|---|---|
| Identificación de problemas de diseño | 30% |
| Aplicación argumentada de patrones GoF | 30% |
| Presentación y documentación de resultados | 20% |
| Calidad del código sugerido y refactorización | 20% |
- ¿Qué ocurre si mañana la empresa añade un producto “Pulsera de titanio”?
- ¿Cuántas clases debes modificar si cambia el proceso de forjado de cadenas?
- ¿Qué patrón ayuda a encapsular acciones repetitivas de producción?
- ¿Cómo reducirías el acoplamiento entre
ProductionManagery productos concretos? - ¿Cómo permitirías que se registren los eventos en un archivo o consola indistintamente?
Entrega Repo o Gist.