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