Этот вопрос проверяет знание пяти ключевых принципов объектно-ориентированного проектирования (ООП)
SOLID — это пять принципов ООП:
Single Responsibility (Единственная ответственность) — Класс должен решать только одну задачу.
Open-Closed (Открытость/закрытость) — Код должен быть открыт для расширения, но закрыт для изменений.
Liskov Substitution (Подстановка Лисков) — Подклассы должны заменять родительские классы без ошибок.
Interface Segregation (Разделение интерфейсов) — Лучше много маленьких интерфейсов, чем один большой.
Dependency Inversion (Инверсия зависимостей) — Зависимости должны строиться на абстракциях, а не на конкретных классах.
Single Responsibility Principle (SRP)
Каждый класс должен отвечать только за одну задачу. Если класс делает слишком много, его сложно поддерживать.
Пример нарушения:
class User {
constructor(name) { this.name = name; }
saveToDatabase() { /* ... */ }
sendEmail() { /* ... */ }
generateReport() { /* ... */ }
}Исправление:
class User { /* Только данные */ }
class UserRepository { saveToDatabase() { /* ... */ } }
class EmailService { sendEmail() { /* ... */ } }Open-Closed Principle (OCP)
Классы должны быть расширяемыми без изменения их исходного кода.
Пример:
class Logger {
log(message) { console.log(message); }
}
// Расширяем, не меняя Logger
class FileLogger extends Logger {
log(message) { /* запись в файл */ }
}Liskov Substitution Principle (LSP)
Подклассы должны заменять родительские классы без нарушения логики программы.
Нарушение:
class Bird {
fly() { /* ... */ }
}
class Penguin extends Bird {} // Пингвины не летают!Исправление:
class Bird {}
class FlyingBird extends Bird { fly() {} }
class Penguin extends Bird {} // Теперь корректноInterface Segregation Principle (ISP)
Клиенты не должны зависеть от методов, которые они не используют.
Проблема:
interface Worker {
work(): void;
eat(): void;
}
class Robot implements Worker {
eat() {} // Роботу не нужно есть!
}Решение:
interface Workable { work(): void; }
interface Eatable { eat(): void; }
class Robot implements Workable { work() {} }Dependency Inversion Principle (DIP)
Зависимости должны строиться на абстракциях (интерфейсах), а не на конкретных классах.
Пример:
interface Database {
save(data: string): void;
}
class MySQLDatabase implements Database { /* ... */ }
class UserService {
constructor(private db: Database) {} // Зависим от абстракции
}Вывод:
SOLID помогает писать гибкий, понятный и легко тестируемый код.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию