Açık/Kapalı Prensibi, SOLID prensiplerinden biridir.
Tanım: “Bir yazılım bileşeni (sınıf, modül, fonksiyon), geliştirmeye açık, değişikliğe kapalı olmalıdır.”
Ne Demek Bu?
Yani mevcut bir sınıfın içini değiştirmeden, yeni özellikler ekleyebilmeliyiz.
(Kötü Örnek)
Yeni bir ödeme yöntemi eklemek istiyorsak sınıfın içine yine elseif
eklememiz gerekir
→ bu değişiklik demektir.
<?php
//Payment.php
class Payment {
public function pay($type) {
if ($type == 'credit') {
echo "Kredi kartı ile ödeme yapıldı";
} elseif ($type == 'paypal') {
echo "PayPal ile ödeme yapıldı";
}
}
}
Doğru OCP Kullanımı (PHP ile)
Adım 1: Önce bir Interface tanımlayalım:
<?php
interface PaymentMethod {
public function pay();
}
Adım 2: Her ödeme tipi kendi sınıfı içinde olsun:
<?php
class CreditCardPayment implements PaymentMethod {
public function pay() {
echo "Kredi kartı ile ödeme yapıldı";
}
}
class PaypalPayment implements PaymentMethod {
public function pay() {
echo "PayPal ile ödeme yapıldı";
}
}
Adım 3: Ana sınıf artık dışarıdan hangi strateji verilirse onu çalıştırır:
<?php
class PaymentProcessor {
private $paymentMethod;
public function __construct(PaymentMethod $method) {
$this->paymentMethod = $method;
}
public function process() {
$this->paymentMethod->pay();
}
}
Kullanım:
<?php
$payment = new PaymentProcessor(new PaypalPayment());
$payment->process(); // PayPal ile ödeme yapıldı
$payment = new PaymentProcessor(new CreditCardPayment());
$payment->process(); // Kredi kartı ile ödeme yapıldı
Nerelerde Kullanılır?
-
Laravel’de ödeme sistemleri, bildirim sistemleri (Mail/SMS/Slack)
-
E-ticaret sistemlerinde kampanya/indirim algoritmaları
-
Oyun geliştirmede puanlama/ödül sistemleri
-
Çok katmanlı yazılımlarda strateji/desen uygulamalarında
Avantajları:
-
Sınıflarınız daha sade olur.
-
Kod tekrarını azaltır.
-
Test yazmak kolaylaşır.
-
Yeni ihtiyaçlar için eski kodu bozmadan genişletebilirsiniz.
Özet:
-
Kodunuzu yazarken şunu sorun:
"Bu sınıfa dokunmadan, yeni bir davranış nasıl eklerim?" -
İşte bu düşünce sizi OCP’ye yaklaştırır