Два варианта подсчёта стоимости заказа с разными типами скидок. Какой соответствует OCP?
middle
correct_vs_wrong
#27
Вариант 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)
Чтобы решить вопрос и сохранить попытку — войди.