Принципы SOLID

Большая картинка

Что такое SOLID?

 

SOLID — это аббревиатура, которая включает 5 принципов проектирования объектно-ориентированных систем (OOP).
Эти принципы помогают создавать более гибкий, расширяемый и поддерживаемый код.

 

S — Single Responsibility Principle (Принцип единственной ответственности)

 

  • У класса должна быть только одна причина для изменения.

 

! Класс должен отвечать за что-то одно, а не за всё подряд.

 

🟢 Пример

 

❌ Плохо:

class User {
    public function getUserData() {
      /* ... */
    } 
    public function saveToDatabase() {
      /* ... */
    }
    public function sendEmail() {
      /* ... */
    }
}
 
✅ Хорошо (разделили):
class User {
    public function getUserData() {
      /* ... */
    }
}
 
class UserRepository {
    public function save(User $user) {
      /* ... */
    }
}
class MailService {
    public function sendWelcomeEmail(User $user) {
      /* ... */
    }
}

 

O — Open/Closed Principle (Принцип открытости/закрытости)

 

  • Классы должны быть открыты для расширения, но закрыты для модификации.

 

! Чтобы изменить поведение, мы расширяем, а не меняем существующий код.

 

🟢 Пример

 

❌ Плохо (жёстко захардкожено):

class Payment {
    public function pay($type) {
      if ($type == 'paypal') {
        // PayPal logic
      } elseif ($type == 'stripe'){  
        // Stripe logic
      }
    }
}

 

✅ Хорошо (расширяем без изменений):

interface PaymentMethod {
    public function pay();
}
class PayPal implements PaymentMethod {
    public function pay() {
      /* ... */ }
}
class Stripe implements PaymentMethod {
    public function pay() {
      /* ... */
    }
}
class PaymentProcessor
    public function pay(PaymentMethod $method) { 
      $method->pay();
    }
}

 

L — Liskov Substitution Principle (Принцип подстановки Барбары Лисков)

 

  • Дочерний класс должен полностью заменять родительский, не ломая логику.

 

! Если где-то ожидается объект родительского класса, мы должны без проблем использовать дочерний.

 

🟢 Пример

 

❌ Плохо:

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

 

✅ Хорошо (разделили):

abstract class Bird {
    public function fly() {
      /* ... */
    }
}
class FlyingBird extends Bird {
    public function fly() {
      /* ... */
    }
}
class Penguin extends Bird { }

 

I — Interface Segregation Principle (Принцип разделения интерфейса)

 

  • Лучше иметь несколько специализированных интерфейсов, чем один общий и большой.

 

! Классы не должны реализовывать методы, которые им не нужны.

 

🟢 Пример

 

❌ Плохо:

interface Worker {
    public function work();
    public function eat();
}
class Robot implements Worker {
    public function work() {
      /* ... */
}
public function eat() {
      /* robots don’t eat */
    }
}

 

✅ Хорошо:

interface Workable {
    public function work();
}
interface Eatable
    public function eat();
}
class Human implements Workable, Eatable {
    public function work() {
      /* ... */
    }
    public function eat() {
      /* ... */
    }
}
class Robot implements Workable {
    public function work() {
      /* ... */
    }
}

 

D — Dependency Inversion Principle (Принцип инверсии зависимостей)

 

  • Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций.

 

! Зависеть нужно от интерфейсов (абстракций), а не от конкретных реализаций.

 

🟢 Пример

 

❌ Плохо:

class MySQLConnection {
    public function connect() {
      /* ... */
    }
}
class UserRepository {
    private $db;
    public function __construct() {
      $this->db = new MySQLConnection();
    }
}

 

✅ Хорошо:

interface DBConnectionInterface {
     public function connect();
}  
class MySQLConnection implements DBConnectionInterface {
    public function connect() {
      /* ... */
    }
}
class UserRepository {
    private DBConnectionInterface $db;
    public function __construct(DBConnectionInterface $db) {
      $this->db = $db;
    }
}
 
 

Заключение

SOLID помогает:

    - Делать код более читаемым.

    - Легче тестировать и поддерживать.

    - Добавлять новые фичи без страха сломать старый функционал.

Заказать сайт!

Введите Ваш номер и мы свяжемся.

Не волнуйтесь, мы не рассылаем спам

Последние новости

Принципы SOLID

SOLID — это аббревиатура, которая включает 5 принципов проектирования объектно-ориентированных систем (OOP).

Цена вопроса: как формируется стоимость веб-разработки и почему так дорого

Прозрачное объяснение факторов, влияющих на стоимость разработки, и советы по оптимизации бюджета.

Как составить свое первое техническое задание (ТЗ)

Хорошо составленное ТЗ экономит время, снижает количество правок и гарантирует, что заказчик получит сайт, соответствующий его ожиданиям.