O — Open/Closed Principle: modul genişlənməyə açıq, dəyişikliyə qapalı olmalıdır. Yəni yeni davranış əlavə etmək üçün artıq işləyən və test edilmiş kodu redaktə etmək lazım deyil. Hər redaktə köhnə halları sındıra bilər, yeni sinif isə köhnələrə toxunmur.
Pozuntu: if/elif zənciri
Hər yeni endirim növü üçün discount() funksiyasına budaq yazmalıyıq. Funksiya böyüdükcə köhnə testlər risk altına düşür.
def discount(kind, price):
if kind == "regular":
return price
elif kind == "student":
return price * 0.9
elif kind == "vip":
return price * 0.8
raise ValueError(f"unknown kind: {kind}")
for kind in ("regular", "student", "vip"):
print(kind, discount(kind, 100))
try:
discount("black-friday", 100) # a new case: we must edit discount()
except ValueError as err:
print(err)regular 100
student 90.0
vip 80.0
unknown kind: black-fridayYol 1: polimorfizm
Ortaq baza sinif (kontrakt), hər hal üçün alt sinif. checkout() yalnız kontraktı bilir. Yeni BlackFriday əlavə olunur, heç nə redaktə edilmir. Bu, varislik və ABC üzərində qurulur.
class Discount:
def apply(self, price):
return price