Til: English O’zbek

Dependency Inversion Principle (DIP)

Yuqori darajadagi modullar quyi darajadagi modullarga bog’liq bo’lmasligi kerak. Ikkalasi ham abstraktsiyalarga bog’liq bo’lishi kerak.

Konkret klasslarni to’g’ridan-to’g’ri ishlatish o’rniga, dependency injection orqali abstraktsiyalarni bering. Bu komponentlar orasidagi bog’liqlikni kamaytiradi va tizimni test qilish hamda kengaytirishni osonlashtiradi.

Diagramma

DIP klass diagrammasi

Noto’g’ri yondashuv

violation.py dagi PaymentProcessor konstruktorida CreditCardPayment‘ni to’g’ridan-to’g’ri yaratadi:

class PaymentProcessor:
    def __init__(self) -> None:
        self.payment = CreditCardPayment()  # qattiq bog'liqlik

    def process(self, amount: float) -> None:
        self.payment.pay(amount)

Naqd pul yoki kriptovalyutaga o’tish uchun PaymentProcessor‘ning o’zini o’zgartirish kerak bo’ladi.

To’g’ri yondashuv

correct.py da esa PaymentProcessor ham, to’lov usullari ham Payment abstraktsiyasiga bog’liq:

class Payment(ABC):
    @abstractmethod
    def pay(self, amount: float) -> None: ...

class PaymentProcessor:
    def __init__(self, payment: Payment) -> None:
        self.payment = payment

    def process(self, amount: float) -> None:
        self.payment.pay(amount)

Yangi to’lov usulini qo’shish uchun faqat Payment‘ni implement qilish kifoya — PaymentProcessor hech qachon o’zgarmaydi:

for method in (CashPayment(), CreditCardPayment(), CryptoPayment()):
    processor = PaymentProcessor(method)
    processor.process(150.00)