Skip to content

Instantly share code, notes, and snippets.

@IoTeacher
Created December 2, 2025 01:00
Show Gist options
  • Select an option

  • Save IoTeacher/ca7dce4ae88746e266bfe2ae14d1b31d to your computer and use it in GitHub Desktop.

Select an option

Save IoTeacher/ca7dce4ae88746e266bfe2ae14d1b31d to your computer and use it in GitHub Desktop.
Examen UA parte 1 de 2

📚 Práctica de Refactorización y Diseño con Patrones GoF

✨ Tema: TraxNY, Inc. – Sistema de Manufactura de Joyas

📅 Versión: Diciembre 2025


🎯 Objetivo

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.


🧠 Escenario

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.


🧩 Código base con errores de diseño (ejemplo)

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.");
        }
    }
}

🚨 Problemas de diseño a detectar

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

🛠 Recomendaciones de Refactorización

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

📝 Entregables del estudiante

  1. 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).
  2. Refactorings.cs

    • Fragmentos de código modificados (NO código completo).
    • Comentarios que expliquen cada cambio aplicado.
  3. 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.
  4. Capturas de pantalla

    • Código original.
    • Código con cambios parciales o sugerencias.

📚 Recursos recomendados

  • 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

✅ Criterios de evaluación

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%

🧪 Preguntas guía para el estudiante

  1. ¿Qué ocurre si mañana la empresa añade un producto “Pulsera de titanio”?
  2. ¿Cuántas clases debes modificar si cambia el proceso de forjado de cadenas?
  3. ¿Qué patrón ayuda a encapsular acciones repetitivas de producción?
  4. ¿Cómo reducirías el acoplamiento entre ProductionManager y productos concretos?
  5. ¿Cómo permitirías que se registren los eventos en un archivo o consola indistintamente?

Entrega Repo o Gist.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment