class ReservationService {

  public function calculateTotal()
  {
      return $this->pricingService
          ->applySeasonModifier()
          ->applyDiscountRules()
          ->applyChannelCommission()
          ->applyTaxes()
          ->buildInvoice();
  }

}

// Domain rules evolve
// architecture decisions matter
// complexity grows over time

Volver a la Comparación

A03 — Strategy + Polymorphism

Encapsula comportamientos a través de objetos strategy polimórficos

Patrón: Strategy Pattern + Polimorfismo

Filosofía: Encapsula comportamientos variables. Cada tipo de strategy implementa sus propias reglas de precio.

Descripción

A03 utiliza el patrón Strategy para encapsular diferentes comportamientos de precio. Cada tipo de reserva (Hotel, Evento, etc.) tiene su propia clase Strategy implementando lógica de precio. Esto hace el modelo de dominio más expresivo y alinea la estructura del código con conceptos de negocio.

Fortalezas:

  • Claro mapeo entre tipos de negocio y código
  • Fácil de testear estrategias individuales de forma aislada
  • Nuevos tipos de reserva requieren nuevas clases strategy, no modificaciones
  • Buen equilibrio entre estructura y complejidad
  • Controladores y servicios permanecen delgados (30-32 líneas)

Debilidades:

  • Más archivos (14) que enfoques más simples
  • Phase04PricingStrategy duplica lógica de BasicPricingStrategy
  • Crear una nueva fase crea una nueva strategy duplicando lógica previa
  • Necesita mejor refactorización para manejar comportamiento compartido entre strategies
  • Aún requiere entender la jerarquía de strategies

Evolución a través de Fases

Fase Archivos Líneas de Código Controlador (líneas)
Fase 01 14 371 31
Fase 02 14 523 32
Fase 03 14 727 32
Fase 04 14 775 32

Duplicación de Strategies: Phase04PricingStrategy duplica lógica de BasicPricingStrategy para añadir 3 nuevos métodos. Muestra que el patrón funciona pero necesita refactorización para evolución basada en fases.

Métricas Clave

Total de Archivos

14

Estable entre fases

Total de Líneas de Código

775

+109% crecimiento P01→P04

Tamaño del Controlador (Fase 04)

32 líneas

+1 línea desde Fase 01

Puntuación de Testeabilidad

Buena

Las strategies son unidades testeables

Conclusión

Buen equilibrio con espacio para refinamiento.

A03 alcanza un sólido punto medio. Los controladores se mantienen delgados, las strategies son cohesivas y testeables, y el modelo de dominio expresa claramente la intención de negocio. Sin embargo, muestra el riesgo de duplicación de strategies: añadir una nueva fase requiere copiar la lógica de la strategy previa y extenderla.

Con mejor refactorización (composición sobre herencia, métodos trait compartidos), este patrón escala mucho mejor. Es una excelente elección cuando tienes tipos de producto distintos con comportamientos variables.

✓ Cuándo usar A03

  • Tipos de producto o contextos tienen diferentes reglas de cálculo
  • Los dominios de negocio se mapean naturalmente a diferentes strategies
  • Quieres buena testeabilidad con clara encapsulación de comportamiento
  • Los equipos se benefician de ver el mapeo strategy-a-negocio