Soru, görüş ve önerileriniz için;

contact@fatih-karakus.com

Open/Closed Prensibi

Open/Closed Prensibi

Yazılım geliştirme sürecinde, kodun esnek, sürdürülebilir ve genişletilebilir olması önemlidir. Bu noktada, SOLID prensipleri yazılım mimarisinde büyük bir rol oynamaktadır.  

Open/Closed Prensibi, yazılım bileşenlerinin değişikliklere kapalı (closed) olması, ancak yeni davranışlar eklemek için açık (open) olması gerektiğini vurgular. Bu prensip, daha esnek ve sürdürülebilir bir kod tabanı oluşturmanın anahtarlarını sunar.

OCP, bir sınıfın veya bileşenin değişikliklere kapalı olması, ancak yeni davranışlar eklemek için açık olması gerektiğini savunur. Yani mevcut kodu değiştirmeden, yeni gereksinimleri veya davranışları ekleyebilmeliyiz. Bu prensip, yazılım bileşenlerinin genişletilebilirliğini sağlar ve gelecekteki değişikliklere daha az bağımlı hale getirir.

Daha anlaşılır olması için bazı örnekler yapalım. PHP, Open/Closed Prensibi'ni uygulamak için bir dizi teknik sunar. Bunlardan ilki Soyutlama ve Arayüzler ile kullanımıdır.

Dair ve karenin çevresinin hesaplandığı sınıflar düşünün. Bu iki sınıfın ortak davranışı alan hesaplama metodudur ve iki sınıf içinde bu metodun işleyişi farklıdır. 

interface Shape {
    public function calculateArea();
}

class Circle implements Shape {
    private $radius;

    public function __construct($radius) {
        $this->radius = $radius;
    }

    public function calculateArea() {
        return 3.14 * $this->radius * $this->radius;
    }
}

class Square implements Shape {
    private $side;

    public function __construct($side) {
        $this->side = $side;
    }

    public function calculateArea() {
        return $this->side * $this->side;
    }
}

function printArea(Shape $shape) {
    echo "Area: " . $shape->calculateArea();
}

$circle = new Circle(5);
printArea($circle); // Çıktı: Area: 78.5

$square = new Square(4);
printArea($square); // Çıktı: Area: 16

Shape arayüzü, tüm şekillerin ortak davranışını belirler. Circle ve Square sınıfları, Shape arayüzünü uygular ve calculateArea() metodunu kendi gereksinimlerine göre gerçekleştirir. Bu sayede, yeni bir şekil eklemek istediğimizde sadece Shape arayüzünü uygulayan bir sınıf oluşturarak printArea() fonksiyonunda kullanabiliriz. Böylece mevcut kodu değiştirmeden yeni davranışları eklemiş oluruz.

 

class Trigon implements Shape {
    private $base;
    private $height;

    public function __construct($base, $height) {
        $this->base = $base;
        $this->height = $height;
    }

    public function calculateArea() {
        return $this-> base * $this-> height / 2;
    }
}

function printArea(Shape $shape) {
    echo "Area: " . $shape->calculateArea();
}

$trigon = new Trigon(5,3);
printArea($trigon); // Çıktı: Area: 7.5

Php'de Kalıtım ve Polimorfizm ile Open/Closed Prensibini şu şekilde uygulayabiliriz;

 

abstract class Vehicle {
    protected $speed;

    public function __construct($speed) {
        $this->speed = $speed;
    }

    abstract public function move();
}

class Car extends Vehicle {
    public function move() {
        echo "Car is moving at a speed of " . $this->speed . " km/h.";
    }
}

class Bike extends Vehicle {
    public function move() {
        echo "Bike is moving at a speed of " . $this->speed . " km/h.";
    }
}

function moveVehicle(Vehicle $vehicle) {
    $vehicle->move();
}

$car = new Car(120);
moveVehicle($car); // Çıktı: Car is moving at a speed of 120 km/h.

$bike = new Bike(30);
moveVehicle($bike); // Çıktı: Bike is moving at a speed of 30 km/h.

Bu örnekte, Vehicle soyut sınıfı, tüm taşıtların ortak davranışını belirtir. Car ve Bike sınıfları, Vehicle sınıfını genişletir ve move() metodunu kendi gereksinimlerine göre gerçekleştirir. moveVehicle() fonksiyonu, Vehicle sınıfını parametre olarak kabul eder ve bu sınıfa ait move() metodunu çağırır. Bu sayede, mevcut kodu değiştirmeden yeni taşıtlar eklemek için sadece Vehicle sınıfını genişleten yeni bir sınıf oluşturup ve moveVehicle() fonksiyonunda kullanmamız yeterlidir.

Sonuç olarak Open/Closed Prensibi, yazılım bileşenlerinin değişikliklere kapalı olması, ancak yeni davranışları eklemek için açık olması gerektiğini vurgular. Bu prensip, kodun esnek, sürdürülebilir ve genişletilebilir olmasını sağlar. PHP'nin sunduğu araçlar ve yaklaşımlar sayesinde OCP'yi uygulamak mümkündür. Soyutlama, arayüzler, kalıtım ve polimorfizm gibi kavramlar, OCP'nin PHP ile nasıl başarıyla uygulanabileceğini göstermektedir. OCP'yi benimseyerek yazılım projelerinizde daha esnek ve genişletilebilir bir kod tabanı oluşturabilirsiniz.