ENIGMA AI
ENIGMA AI
Architecture Средний

Расскажите про принципы SOLID

Принципы SOLID

S — Single Responsibility Principle

Один класс — одна причина для изменения.

// ПЛОХО
class User {
    void saveToDatabase() { }
    void sendEmail() { }
    void generateReport() { }
}

// ХОРОШО
class User { }
class UserRepository { void save(User user) { } }
class EmailService { void send(User user) { } }
class UserReportGenerator { void generate(User user) { } }

O — Open/Closed Principle

Открыт для расширения, закрыт для модификации.

// ПЛОХО
class DiscountCalculator {
    double calculate(String type) {
        if (type.equals("VIP")) return 0.2;
        if (type.equals("Regular")) return 0.1;
        // Добавление нового типа требует изменения
    }
}

// ХОРОШО
interface DiscountStrategy {
    double calculate();
}

class VIPDiscount implements DiscountStrategy {
    double calculate() { return 0.2; }
}
// Новые стратегии добавляются без изменения существующего кода

L — Liskov Substitution Principle

Подклассы должны быть заменимы базовыми классами.

// ПЛОХО
class Rectangle {
    void setWidth(int w) { width = w; }
    void setHeight(int h) { height = h; }
}

class Square extends Rectangle {
    void setWidth(int w) { width = w; height = w; }  // Нарушает контракт!
}

// ХОРОШО
interface Shape { int getArea(); }
class Rectangle implements Shape { }
class Square implements Shape { }

I — Interface Segregation Principle

Много специализированных интерфейсов лучше одного общего.

// ПЛОХО
interface Worker {
    void work();
    void eat();
    void sleep();
}

class Robot implements Worker {
    void work() { }
    void eat() { }   // Робот не ест!
    void sleep() { } // Робот не спит!
}

// ХОРОШО
interface Workable { void work(); }
interface Eatable { void eat(); }
interface Sleepable { void sleep(); }

class Robot implements Workable { }
class Human implements Workable, Eatable, Sleepable { }

D — Dependency Inversion Principle

Зависимость от абстракций, не от конкретных реализаций.

// ПЛОХО
class OrderService {
    private MySQLDatabase database = new MySQLDatabase();
}

// ХОРОШО
class OrderService {
    private Database database;

    OrderService(Database database) {
        this.database = database;
    }
}

interface Database { }
class MySQLDatabase implements Database { }
class PostgreSQLDatabase implements Database { }

Краткая таблица:

Принцип Суть
SRP Одна ответственность
OCP Расширяй, не меняй
LSP Заменяемость подтипов
ISP Маленькие интерфейсы
DIP Зависи от абстракций

Похожие вопросы

Готовитесь к собеседованию?

ENIGMA AI — невидимый ИИ-помощник для технических интервью

Попробовать бесплатно
Все вопросы