Ir al contenido

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.

Imagina un servicio que calcula el precio de un producto con descuento por fidelidad. De repente te piden un descuento Black Friday.

function calcularPrecio(producto, tipoDescuento) {
if (tipoDescuento === "fidelidad") { /* ... */ }
if (tipoDescuento === "black-friday") { /* ... */ } // ← Modificas código existente
}
interface EstrategiaDescuento {
aplicar(precio: number): number;
}
class DescuentoFidelidad implements EstrategiaDescuento { /* ... */ }
class DescuentoBlackFriday implements EstrategiaDescuento { /* ... */ }
// La calculadora NO cambia cuando añades un descuento nuevo
class CalculadoraPrecio {
constructor(private estrategia: EstrategiaDescuento) {}
calcular(precio: number) {
return this.estrategia.aplicar(precio);
}
}