O — Open/Closed Principle
“El código debe estar abierto a la extensión, pero cerrado a la modificación.”
Cuando necesites añadir un nuevo comportamiento, no deberías reescribir el código existente.
Ejemplo: Estrategia de descuentos
Sección titulada «Ejemplo: Estrategia de descuentos»Imagina un servicio que calcula el precio de un producto con descuento por fidelidad. De repente te piden un descuento Black Friday.
❌ Mal (meter otro if)
Sección titulada «❌ Mal (meter otro if)»function calcularPrecio(producto, tipoDescuento) { if (tipoDescuento === "fidelidad") { /* ... */ } if (tipoDescuento === "black-friday") { /* ... */ } // ← Modificas código existente}✅ Bien (Patrón Estrategia)
Sección titulada «✅ Bien (Patrón Estrategia)»interface EstrategiaDescuento { aplicar(precio: number): number;}
class DescuentoFidelidad implements EstrategiaDescuento { /* ... */ }class DescuentoBlackFriday implements EstrategiaDescuento { /* ... */ }
// La calculadora NO cambia cuando añades un descuento nuevoclass CalculadoraPrecio { constructor(private estrategia: EstrategiaDescuento) {} calcular(precio: number) { return this.estrategia.aplicar(precio); }}