İçeriği Atla

Php için solid prensipleri örnekleri

Php için solid prensipleri örnekleri

SOLID prensipleri, nesne yönelimli programlama (OOP) için belirlenmiş beş temel prensiptir. Bu prensipler, yazılım geliştirirken esneklik, okunabilirlik, bakım kolaylığı ve genişletilebilirlik sağlamak amacıyla kullanılır. PHP gibi nesne yönelimli programlama dillerinde bu prensipler oldukça önemlidir. Şimdi bu prensipleri ve PHP'de nasıl uygulanabileceğini inceleyelim:

1. Single Responsibility Principle (SRP) - Tek Sorumluluk Prensibi

Her sınıfın sadece tek bir sorumluluğu olmalıdır ve sınıf, yalnızca tek bir iş için değiştirilebilir olmalıdır. Başka bir deyişle, bir sınıf yalnızca tek bir iş yapmalıdır ve bu işte bir değişiklik yapıldığında, bu sınıf da değiştirilmelidir.

Örnek:

Yanlış kullanım:

class User {
    public function getUserData($id) {
        // Kullanıcı verilerini döner
    }


    public function saveToDatabase() {
        // Veritabanına kaydeder
    }


    public function sendEmail($message) {
        // Kullanıcıya e-posta gönderir
    }
}

Bu sınıf, hem veri yönetimi, hem de e-posta işlemleriyle ilgilenerek birden fazla sorumluluğa sahiptir.

Doğru kullanım:

class User {
    public function getUserData($id) {
        // Kullanıcı verilerini döner
    }
}


class UserRepository {
    public function saveToDatabase(User $user) {
        // Veritabanına kaydeder
    }
}


class EmailService {
    public function sendEmail($message) {
        // E-posta gönderir
    }
}

2. Open/Closed Principle (OCP) - Açık/Kapalı Prensibi

Sınıflar genişletmeye açık, ancak değiştirmeye kapalı olmalıdır. Yani, mevcut bir sınıfı değiştirmek yerine genişletilebilir olmalıdır. Bu, yeni işlevler eklerken mevcut kodu bozmamak için önemlidir.

Örnek:

Yanlış kullanım:

class Report {
    public function generate($type) {
        if ($type == 'pdf') {
            // PDF raporu oluştur
        } elseif ($type == 'html') {
            // HTML raporu oluştur
        }
    }
}

Her yeni rapor türü için generate metodunu düzenlemek gerekecek, bu da prensibe aykırıdır.

Doğru kullanım:

interface ReportType {
    public function generate();
}


class PDFReport implements ReportType {
    public function generate() {
        // PDF raporu oluştur
    }
}


class HTMLReport implements ReportType {
    public function generate() {
        // HTML raporu oluştur
    }
}


class ReportGenerator {
    public function generate(ReportType $reportType) {
        $reportType->generate();
    }
}

3. Liskov Substitution Principle (LSP) - Liskov Yerine Geçme Prensibi

Alt sınıflar, üst sınıfın davranışını bozmayacak şekilde kullanılmalıdır. Başka bir deyişle, bir alt sınıf, üst sınıfın yerine kullanıldığında programın mantığı bozulmamalıdır.

Örnek:

Yanlış kullanım:

class Bird {
    public function fly() {
        // Kuş uçabilir
    }
}


class Penguin extends Bird {
    public function fly() {
        throw new Exception("Penguins can't fly");
    }
}

Bu durumda Penguin, Bird sınıfını genişletmesine rağmen, fly metodunu bozuyor, bu da LSP'ye aykırı.

Doğru kullanım:

class Bird {
    // Kuşun genel özellikleri
}


class FlyingBird extends Bird {
    public function fly() {
        // Uçabilen kuşlar için uçma fonksiyonu
    }
}


class Penguin extends Bird {
    // Penguenler uçmaz, dolayısıyla fly fonksiyonunu içermez.
}


4. Interface Segregation Principle (ISP) - Arayüz Ayrımı Prensibi

Sınıflar, kullanmadıkları yöntemleri içeren arayüzlere bağımlı olmamalıdır. Yani, bir arayüz, sadece onu kullanacak sınıflar için gerekli işlevleri sağlamalıdır.

Örnek:

Yanlış kullanım:

interface Worker {
    public function work();
    public function eat();
}


class HumanWorker implements Worker {
    public function work() {
        // Çalışma işlemi
    }


    public function eat() {
        // Yemek yeme işlemi
    }
}


class RobotWorker implements Worker {
    public function work() {
        // Çalışma işlemi
    }


    public function eat() {
        // Robotlar yemek yemez
        throw new Exception("Robots don't eat");
    }
}

RobotWorker sınıfı, aslında yemek yeme işlevine ihtiyaç duymaz, bu da ISP'ye aykırıdır.

Doğru kullanım:

interface Workable {
    public function work();
}


interface Eatable {
    public function eat();
}


class HumanWorker implements Workable, Eatable {
    public function work() {
        // Çalışma işlemi
    }


    public function eat() {
        // Yemek yeme işlemi
    }
}


class RobotWorker implements Workable {
    public function work() {
        // Çalışma işlemi
    }
}

5. Dependency Inversion Principle (DIP) - Bağımlılıkların Ters Çevrilmesi Prensibi

Yüksek seviye sınıflar (modüller), düşük seviye sınıflara doğrudan bağımlı olmamalıdır. İkisinin de bir soyutlamaya bağımlı olması gerekir. Bu prensip, bağımlılıkların minimize edilmesini sağlar.

Örnek:

Yanlış kullanım:

class PasswordReminder {
    private $dbConnection;


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

Burada PasswordReminder sınıfı doğrudan MySQLConnection sınıfına bağımlıdır, bu da bağımlılıkların ters çevrilmesine aykırıdır.

Doğru kullanım:

interface DBConnectionInterface {
    public function connect();
}


class MySQLConnection implements DBConnectionInterface {
    public function connect() {
        // MySQL bağlantısı
    }
}


class PasswordReminder {
    private $dbConnection;


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