Repaso
English

¿Qué cambio sigue mejor el Open/Closed Principle?

def price(order):
    if order.type == "regular": return order.total
    if order.type == "vip":     return order.total * 0.9
    # every new customer type edits this function

Opciones

  1. Añadir otra rama if cada vez que aparece un tipo nuevo
  2. Crear una interface PricingStrategy y añadir una clase por cada tipo nuevo (Opción correcta)
  3. Mover la función a un módulo de utilidades aparte
  4. Mantener un diccionario global de descuentos y editarlo en ejecución

Respuesta

Crear una interface PricingStrategy y añadir clases nuevas para los tipos nuevos

Por qué

Open/Closed significa: abierto a extensión, cerrado a modificación. Debes añadir comportamiento AÑADIENDO código, no editando código que ya funciona y está probado.

Con un if/elif que crece, cada tipo de cliente nuevo implica editar (y poner en riesgo) esta función.

Con una interface strategy, cada tipo es su propia clase pequeña; un tipo nuevo es una clase nueva y el código antiguo no se toca.

Recuerda

Añade comportamiento con código nuevo, no editando código que funciona.

Términos clave

Practica esta pregunta en Repaso