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 — невидимый ИИ-помощник для технических интервью
Попробовать бесплатно