Sobes.tech
Назад к вопросам
Senior
6

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

Компании, где спрашивали
Napoleon IT

Ответ от нейросети

sobes.tech AI

Принципы SOLID — это пять основных принципов объектно-ориентированного проектирования, которые помогают создавать гибкие и поддерживаемые системы.

  1. Single Responsibility Principle (SRP) — принцип единственной ответственности. Каждый класс должен иметь одну и только одну причину для изменения.
class ReportGenerator {
    void generateReport() { /* генерация отчёта */ }
}

class ReportPrinter {
    void printReport() { /* печать отчёта */ }
}
  1. 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; }
}

// Можно добавлять новые фигуры, не меняя существующий код
  1. Liskov Substitution Principle (LSP) — принцип подстановки Барбары Лисков. Объекты подклассов должны заменять объекты базового класса без нарушения логики.
class Bird {
    void fly() {}
}

class Sparrow extends Bird {}

class Ostrich extends Bird {
    @Override
    void fly() {
        throw new UnsupportedOperationException();
    }
}

// Нарушение LSP: страус не может летать, но наследует метод fly
  1. 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() { /* печать */ }
}
  1. 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 помогает создавать код, который легче тестировать, расширять и поддерживать.