Open-Closed Principle (Açık-Kapalı Prensibi)¶
2. Open-Closed Principle¶
- Yazılım mühendisliğinde temel bir konsept olan OCP sınıf, modül, fonksyionların genişletilebilir(ilave edilebilir) olmasını ancak değiştirilebilir olmamasını tanımlar.
- OCP mevcut olan kodu değiştirmeden yeni fonksiyonelite eklememize olanak sağlar.
- Bu standart takip edildiğinde kod daha iyi anlaşılır, test edilebilir ve sürdürülebilir olmaktadır.
- Kredi kartı ödemeleri ve PayPal ödemeleri gibi farklı ödeme türlerini işleyen bir sistemimiz olduğunu hayal edin. Başlangıçta sistem sadece kredi kartı ödemelerini desteklemektedir. Ancak gelecekte yeni ödeme yöntemlerinin eklenmesini bekliyoruz ve OCP'yi takip etmek istiyoruz.
2.1 OCP ihlal¶
class PaymentProcessor:
def process_payment(self, amount):
# (OCP ihlali). Neden? Çünkü kredi kartı haricindeki bir ödeme sistemi ekleneceği zaman bu sınıf değişecek
print("Processing credit card payment...")
print(f"Amount: ${amount}")
payment_processor = PaymentProcessor()
# mevcut fonksiyonelite kredi kartı ödemesini
payment_processor.process_payment(100)
# (OCP ihlali). Neden? Çünkü mevcut sınıfı genişletmek(extend) yerine direkt sınıfın dışına kod eklendi.
print("\nProcessing PayPal payment...")
print(f"Amount: ${100}")
OCP'yi nasıl ihlal edeceğimizi göstermek için, mevcut sınıfı genişletmek yerine yeni ödeme yöntemini (PayPal) işlemek için doğrudan mevcut sınıfın dışına kod ekliyoruz. Mevcut sınıf değiştirildiği için de bu ilke ihlal ediliyor.
2.2. OCP uygulama¶
class PaymentProcessor:
def process_payment(self, amount):
raise NotImplementedError("This method should be overridden by subclasses.")
class CreditCardProcessor(PaymentProcessor):
def process_payment(self, amount):
# kredi karti odeme islemleri ...
print("Processing credit card payment...")
print(f"Amount: ${amount}")
class PayPalProcessor(PaymentProcessor):
def process_payment(self, amount):
# PayPal odeme islemleri ...
print("Processing PayPal payment...")
print(f"Amount: ${amount}")
payment_processor = CreditCardProcessor()
payment_processor.process_payment(100)
payment_processor = PayPalProcessor()
payment_processor.process_payment(100)
OCP'ye bağlı kalarak, mevcut ödeme işleme mantığını değiştirmeden yeni ödeme yöntemlerinin eklenmesine izin veren daha esnek ve sürdürülebilir bir kod elde ediyoruz.