Skip to content

Dependency Inversion Principle (Bağımlılığı Tersine Çevirme Prensibi)

5. Dependency Inversion Principle

  • DIP, Yüksek seviyeli modüllerin düşük seviyeli modüllere bağlı olmaması gerektiğini belirtir. Bunun yerine, her ikisi de soyutlamalara bağlı olmalıdır. Başka bir deyişle, bu prensip bizi somut uygulamalardan çok soyutlamalara bağlı kalmaya teşvik eder.

  • Bir ödeme sistemi örneğini ele alalım. Ödemeleri işleme mantığını işleyen PaymentProcessor adlı üst düzey bir modülünüz olduğunu hayal edin. DIP uygulanmayan geleneksel bir yaklaşımda, PaymentProcessor doğrudan CreditCardPayment, PayPalPayment ve BankTransferPayment gibi düşük seviyeli modüllere bağlı olacaktır.

5.1 DIP ihlal

class PaymentProcessor:
    def process_payment(self, payment_type, amount):
        if payment_type == 'CreditCard':
            credit_card_payment = CreditCardPayment()
            credit_card_payment.process(amount)
        elif payment_type == 'PayPal':
            paypal_payment = PayPalPayment()
            paypal_payment.process(amount)
        elif payment_type == 'BankTransfer':
            bank_transfer_payment = BankTransferPayment()
            bank_transfer_payment.process(amount)

Yukarıdaki kodda, PaymentProcessor doğrudan CreditCardPayment, PayPalPayment ve BankTransferPayment gibi ödeme türlerinin somut uygulamalarına bağlıdır. Üst düzey modül (PaymentProcessor) doğrudan alt düzey modüllere bağlı olduğundan, bu, Bağımlılığı Tersine Çevirme İlkesini ihlal eder.

Bağımlılığı Tersine Çevirme İlkesini (Dependency Inversion Principle) uygulamak için, soyutlamalar sunmamız ve hem yüksek seviyeli hem de düşük seviyeli modüllerin soyutlamalara bağlı olmasını sağlamamız gerekir. Bu durumda, herhangi bir ödeme yöntemini temsil eden PaymentMethod adında soyut bir sınıf veya arayüz tanıtabiliriz.

5.2. DIP uygulama

class PaymentProcessor:
    def __init__(self, payment_method):
        self.payment_method = payment_method

    def process_payment(self, amount):
        self.payment_method.process(amount)

class PaymentMethod:
    def process(self, amount):
        pass

class CreditCardPayment(PaymentMethod):
    def process(self, amount):
        # Logic for processing credit card payment

class PayPalPayment(PaymentMethod):
    def process(self, amount):
        # Logic for processing PayPal payment

class BankTransferPayment(PaymentMethod):
    def process(self, amount):
        # Logic for processing bank transfer payment
Yukarıdaki kodda PaymentProcessor, belirli ödeme türleri yerine PaymentMethod soyutlamasına bağlıdır. PaymentMethod arayüzü uygulanarak farklı ödeme yöntemleri kolayca eklenebildiğinden, bu esneklik sağlar. PaymentProcessor'ın her bir ödeme yönteminin ayrıntılarını bilmesi gerekmez.

Aldığı PaymentMethod nesnesinde process() metodunu çağırır.

Bağımlılık Tersine Çevirme İlkesini uygulayarak, daha esnek ve sürdürülebilir bağlı bir tasarım elde ediyoruz. Üst düzey modül (PaymentProcessor), daha kolay bakım, genişletilebilirlik ve test edilebilirlik sağlayan somut uygulamalardan ziyade bir soyutlamaya (PaymentMethod) bağlıdır.