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.

Solda funksiyanı redaktə, sağda yeni sinif əlavə etmək
Solda funksiyanı redaktə, sağda yeni sinif əlavə etmək

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.

python
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)
text
regular 100
student 90.0
vip 80.0
unknown kind: black-friday

Yol 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.

python
class Discount:
    def apply(self, price):
        return price