O Nedir — Açık Kapalı Prensibi
Resmi tanıma göre
Yazılım varlıkları uzantı için açık, ancak değişiklik için kapalı olmalıdır.
Varlıklar sınıflar, modüller, işlevler vb. Olabilir. Tanım; mevcut kodu değiştirmek yerine yeni kod ekleyerek işlevselliği genişleten anlamına gelir.
Başlığa göre anlamak oldukça kafa karıştırıcı. Öyleyse Laravel’deki örneklerle görelim.
Diyelim ki ödemeleri içeren bir e-ticaret sistemimiz var. Yani, elimizde PaymentController
ve bu controller, şu anda pay
iki ödeme yöntemi olan 1. yöntemimiz Kredi Kartı ) 2. yöntemimiz Paypal ve kodlar aşağıdaki gibi görünüyor:
PaymentController.php
public function pay(Request $request)
{
$payment = new Payment();
if($type == 'credit'){
// do credit card payments
$payment->paymentWithCreditCard();
}else {
//do paypal payments
$payment->paymentWithPaypal();
}
}
ve Payment
sınıfımız bu şekilde :Payment.php
class Payment
{ public function paymentWithCreditCard()
{
// logic for credit card payments
} public function paymentWithPaypal()
{
// logic for paypal payments
}
}
Yeni bir ödeme yöntemi eklemek istediğimizde ne olur, diyelim ki banka havalesi
pay
yöntemine ekleyebiliriz ve gelen uygun bir yöntemi çağırmak için Payment
sınıfına ekleriz.
Dolayısıyla pay
method'u aşağıdaki gibi görünür:PaymentController.php
public function pay(Request $request)
{
$payment = new Payment();
if($type == 'credit'){
// do credit card payments
$payment->paymentWithCreditCard();
}else if($type == 'paypal') {
//do paypal payments
$payment->paymentWithPaypal();
}
else {
//do wire transfer payments
$payment->paymentWithWiretransfer();
}
}
ve Payment
sınıfı değiştirmek :Payment.php
class Payment
{ public function paymentWithCreditCard()
{
// logic for credit card payments
} public function paymentWithPaypal()
{
// logic for paypal payments
} public function paymentWithWiretransfer()
{
// logic for wire transfer payments
}
}
Peki bundan sonra ne olacak? Mesela Nakit adında başka bir ödeme yöntemimiz varsa if
, Payment
sınıfa bir tane daha ve sonra yeni bir yöntem ekledik . Başka bir ödeme yöntemi olan Kupon Ödemesi geliyor ve yine sınıfları değiştiriyoruz. Bu ilkenin ne dediğini hatırlayın, Uzatma için aç ancak değişikliklere yakın. bu yüzden burada bu prensibi bozuyoruz.
Öyleyse, nasıl düzeltilir, burada Aç Kapatma İlkesini uygulayalım.
PHP’deki arabirimler hakkında daha fazla bilgi edinin interface
adlı bir yöntemle yeni bir şey yapalım .pay
PayableInterface.php
interface PayableInterface
{
public function pay();
}
class
Her ödeme yöntemi için bir ödeme yapın ve PayableInterface
ile genişletin .CreditCardPayment.php
class CreditCardPayment implements PayableInterface
{ public function pay()
{
// Implement Credit Card payment logic
}
}
PaypalPayment.php
class PaypalPayment implements PayableInterface
{ public function pay()
{
// Implement paypall payment logic
}
}
CreditCardPayment.php
class WiretransferPayment implements PayableInterface
{ public function pay()
{
// Implement Wire transfer payment logic
}
}
Şimdi yeni bir sınıf oluşturPaymentFactory.php
class PaymentFactory
{
public function initializePayment($type)
{
if($type == 'credit'){
// do credit card payments
return new CreditCardPayment;
}else if($type == 'paypal') {
//do paypal payments
return new PaypalPayment;
}
else if ($type == 'wire') {
//do wire transfer payments
return new WiretransferPayment;
}
}
}
ve son olarak bizim pay
yöntemimizPaymentController.php
. Bu ödeme yöntemi PaymentFactory
ödemelerin yapılmasını ister ve factory her şeyi kendisi halleder.
public function pay(Request $request)
{
$paymentFactory = new PaymentFactory();
$paymentMethod = $paymentFactory->initializePayment($request->type);
$paymentMethod->pay();
}
Bu kadar. Yeni ödeme yöntemi gelirse şimdi sınıfları değiştirme sorununu çözüyoruz, mevcut olanı değiştirmek yerine yeni sınıf ekleyerek işlevselliği genişletiyoruz.
Bu yazımda solid kavramının ikinci harfi olan O’nun yani açık - kapalı ilkesinin nasıl yapılacağını öğrenmiş olduk. Umarım bu yazım faydalı olmuştur.
Yorum Yap