mock_sobes
← Чистый код — SOLID
middle correct_vs_wrong #27
Два варианта подсчёта стоимости заказа с разными типами скидок. Какой соответствует OCP?
Вариант 1
def total(order, discount_kind):
    base = sum(item.price for item in order.items)
    if discount_kind == "percent":
        return base * 0.9
    elif discount_kind == "fixed":
        return base - 100
    elif discount_kind == "loyalty":
        return base * 0.85 if order.user.tier == "gold" else base
    # ... через год — 12 elif
Вариант 2
class Discount(Protocol):
    def apply(self, order: Order) -> Decimal: ...

class PercentDiscount:
    def __init__(self, pct: Decimal): self.pct = pct
    def apply(self, order): return order.base() * (1 - self.pct)

class LoyaltyDiscount:
    def apply(self, order):
        if order.user.tier == "gold": return order.base() * Decimal("0.85")
        return order.base()

def total(order, discount: Discount) -> Decimal:
    return discount.apply(order)
Чтобы решить вопрос и сохранить попытку — войди.