Назад к вопросам
Senior
6
Расскажите о принципах SOLID с конкретными примерами.
Компании, где спрашивали
Napoleon IT
Ответ от нейросети
sobes.tech AI
Принципы SOLID — это пять основных принципов объектно-ориентированного проектирования, которые помогают создавать гибкие и поддерживаемые системы.
- Single Responsibility Principle (SRP) — принцип единственной ответственности. Каждый класс должен иметь одну и только одну причину для изменения.
class ReportGenerator {
void generateReport() { /* генерация отчёта */ }
}
class ReportPrinter {
void printReport() { /* печать отчёта */ }
}
- Open/Closed Principle (OCP) — открытость/закрытость. Классы должны быть открыты для расширения, но закрыты для модификации.
interface Shape {
double area();
}
class Circle implements Shape {
double radius;
public double area() { return Math.PI * radius * radius; }
}
class Rectangle implements Shape {
double width, height;
public double area() { return width * height; }
}
// Можно добавлять новые фигуры, не меняя существующий код
- Liskov Substitution Principle (LSP) — принцип подстановки Барбары Лисков. Объекты подклассов должны заменять объекты базового класса без нарушения логики.
class Bird {
void fly() {}
}
class Sparrow extends Bird {}
class Ostrich extends Bird {
@Override
void fly() {
throw new UnsupportedOperationException();
}
}
// Нарушение LSP: страус не может летать, но наследует метод fly
- Interface Segregation Principle (ISP) — принцип разделения интерфейса. Клиенты не должны зависеть от методов, которые они не используют.
interface Printer {
void print();
}
interface Scanner {
void scan();
}
class MultiFunctionPrinter implements Printer, Scanner {
public void print() { /* печать */ }
public void scan() { /* сканирование */ }
}
class SimplePrinter implements Printer {
public void print() { /* печать */ }
}
- Dependency Inversion Principle (DIP) — принцип инверсии зависимостей. Модули верхнего уровня не должны зависеть от модулей нижнего уровня, оба должны зависеть от абстракций.
interface Database {
void save(Data data);
}
class MySQLDatabase implements Database {
public void save(Data data) { /* сохранение в MySQL */ }
}
class UserService {
private Database database;
public UserService(Database database) {
this.database = database;
}
void saveUser(User user) {
database.save(user);
}
}
Таким образом, SOLID помогает создавать код, который легче тестировать, расширять и поддерживать.