Skip to content

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}")
Bu örnekte, PaymentProcessor sınıfı, yalnızca kredi kartı ödemelerini desteklediği ve yeni bir ödeme yöntemi (PayPal) eklemek için mevcut sınıfın değiştirilmesini gerektirdiği için OCP'yi ihlal etmektedir.

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)
PaymentProcessor sınıfını her bir ödeme yöntemi için belirli alt sınıflarla genişleterek, mevcut kodu(kredi kartı sınıfını) değiştirmeden yeni ödeme yöntemleri (PayPal gibi) ekleyebiliriz. Bu şekilde, mevcut işlevselliğe dokunulmaz ve temel sınıf genişletilerek yeni işlevler eklenebilir.

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.