اصول SOLID به صورت کوتاه همراه نمونه کد

منبع: chatgpt

اصول SOLID یک مجموعه از پنج اصل طراحی شیءگرا است که به بهبود ساختار و انعطاف‌پذیری کد کمک می‌کند. این اصول به توسعه کدی منجر می‌شوند که قابل نگهداری، توسعه‌پذیر و تغییرپذیر باشد.

1. Single Responsibility Principle (SRP)

هر کلاس باید یک وظیفه‌ی واحد داشته باشد و تنها یک دلیل برای تغییر آن وجود داشته باشد.

قبل از پیاده‌سازی SRP:

class User {
    public function save($userData) {
        // ذخیره کاربر در پایگاه‌داده
    }
    
    public function sendEmail($emailContent) {
        // ارسال ایمیل به کاربر
    }
}

بعد از پیاده‌سازی SRP:

class User {
    public function save($userData) {
        // ذخیره کاربر در پایگاه‌داده
    }
}

class EmailService {
    public function sendEmail($emailContent) {
        // ارسال ایمیل به کاربر
    }
}

در اینجا وظایف جدا شده‌اند. کلاس User فقط مسئول ذخیره‌سازی است و کلاس EmailService مسئول ارسال ایمیل.


2. Open/Closed Principle (OCP)

کلاس‌ها باید برای گسترش باز و برای تغییر بسته باشند. یعنی بتوانیم کلاس را توسعه دهیم بدون آن‌که نیاز به تغییر کلاس موجود باشد.

قبل از پیاده‌سازی OCP:

class Report {
    public function generatePDF() {
        // تولید گزارش PDF
    }

    public function generateExcel() {
        // تولید گزارش Excel
    }
}

بعد از پیاده‌سازی OCP:

interface ReportGenerator {
    public function generate();
}

class PDFReport implements ReportGenerator {
    public function generate() {
        // تولید گزارش PDF
    }
}

class ExcelReport implements ReportGenerator {
    public function generate() {
        // تولید گزارش Excel
    }
}

در اینجا اگر نوع جدیدی از گزارش نیاز باشد، می‌توانیم یک کلاس جدید ایجاد کنیم بدون تغییر کلاس‌های قبلی.


3. Liskov Substitution Principle (LSP)

کلاس‌های مشتق‌شده باید بتوانند جایگزین کلاس‌های پایه شوند بدون اینکه رفتار برنامه تغییر کند.

قبل از پیاده‌سازی LSP:

class Bird {
    public function fly() {
        // پرواز
    }
}

class Penguin extends Bird {
    public function fly() {
        throw new Exception("پنگوئن نمی‌تواند پرواز کند!");
    }
}

بعد از پیاده‌سازی LSP:

class Bird {
    // کلاس پایه بدون متد پرواز
}

class FlyingBird extends Bird {
    public function fly() {
        // پرواز
    }
}

class Penguin extends Bird {
    // بدون متد fly زیرا پنگوئن پرواز نمی‌کند
}

در اینجا پنگوئن جایگزین کلاس پایه نمی‌شود زیرا ویژگی مشترک پرواز را ندارد.


4. Interface Segregation Principle (ISP)

کلاس‌ها نباید مجبور شوند متدهایی را که نیاز ندارند پیاده‌سازی کنند. اینترفیس‌ها باید کوچک و مختص به نیاز باشند.

قبل از پیاده‌سازی ISP:

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

class HumanWorker implements Worker {
    public function work() {
        // کار کردن
    }

    public function eat() {
        // غذا خوردن
    }
}

class RobotWorker implements Worker {
    public function work() {
        // کار کردن
    }

    public function eat() {
        // ربات غذا نمی‌خورد!
    }
}

بعد از پیاده‌سازی ISP:

interface Workable {
    public function work();
}

interface Eatable {
    public function eat();
}

class HumanWorker implements Workable, Eatable {
    public function work() {
        // کار کردن
    }

    public function eat() {
        // غذا خوردن
    }
}

class RobotWorker implements Workable {
    public function work() {
        // کار کردن
    }
}

در اینجا متدهای اضافی از اینترفیس اصلی جدا شده‌اند.


5. Dependency Inversion Principle (DIP)

ماژول‌های سطح بالا نباید به ماژول‌های سطح پایین وابسته باشند. هر دو باید به اینترفیس‌ها وابسته باشند.

قبل از پیاده‌سازی DIP:

class MySQLConnection {
    public function connect() {
        // اتصال به MySQL
    }
}

class User {
    private $db;

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

    public function getUserData() {
        $this->db->connect();
        // دریافت اطلاعات کاربر
    }
}

بعد از پیاده‌سازی DIP:

interface DBConnection {
    public function connect();
}

class MySQLConnection implements DBConnection {
    public function connect() {
        // اتصال به MySQL
    }
}

class User {
    private $db;

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

    public function getUserData() {
        $this->db->connect();
        // دریافت اطلاعات کاربر
    }
}

در اینجا کلاس User به اینترفیس DBConnection وابسته است، نه به یک کلاس خاص مانند MySQLConnection.

دیدگاه‌ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *