Asılılığın inversiyası prinsipi (SOLID-də D hərfi) iki hissədən ibarətdir: yuxarı səviyyəli modullar (biznes qaydaları) aşağı səviyyəli modullardan (SMTP, verilənlər bazası, fayllar, saat) asılı olmamalıdır; hər ikisi abstraksiyalardan asılı olmalıdır. Abstraksiyalar isə detallardan asılı olmamalıdır: detallar abstraksiyalardan asılıdır.

Solda servis `EmailSender`-dən asılıdır, sağda servis və bildiricilər `Notifier` protokolundan asılıdır
Solda servis EmailSender-dən asılıdır, sağda servis və bildiricilər Notifier protokolundan asılıdır

Pozuntu: sərt yazılmış detal

OrderService konstruktorda EmailSender() yaradır. Biznes qaydası indi çatdırılma kanalını bilir. SMS göndərmək üçün servisi dəyişmək lazımdır, testi isə yalnız real məktub göndərməklə işlətmək olar.

python
class EmailSender:
    def send(self, to, text):
        print(f"EMAIL to {to}: {text}")

class OrderService:
    def __init__(self):
        self.sender = EmailSender()      # hard-wired detail

    def place(self, user, item):
        self.sender.send(user, f"order {item} accepted")

OrderService().place("ann@x.io", "book")
text
EMAIL to ann@x.io: order book accepted

Düzəliş: abstraksiya müştəriyə məxsusdur