← Назад к вопросам
Что значит буква D в SOLID?
1.0 Junior🔥 161 комментариев
#Архитектура и паттерны#ООП
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Что значит буква D в SOLID?
D = **Dependency Inversion Principle (DIP)** — Принцип инверсии зависимостей.
Суть:
"Высокоуровневые модули не должны зависеть от низкоуровневых. Оба должны зависеть от абстракций."
Проще говоря:
Не создавай зависимости внутри класса. Передавай их через конструктор (injection).
ПЛОХО (нарушение DIP):
class UserService {
private database = new PostgresDatabase();
async getUser(id: number) {
return this.database.query('SELECT * FROM users WHERE id = ?', [id]);
}
}
Проблема: UserService жестко зависит от PostgresDatabase. Если захочу использовать MongoDB, нужно менять UserService.
ХОРОШО (следуем DIP):
interface Database {
query(sql: string, params: any[]): Promise<any>;
}
class UserService {
constructor(private database: Database) {}
async getUser(id: number) {
return this.database.query('SELECT * FROM users WHERE id = ?', [id]);
}
}
// Теперь можем использовать разные БД:
const postgresDb = new PostgresDatabase();
const userService1 = new UserService(postgresDb);
const mongoDb = new MongoDatabase();
const userService2 = new UserService(mongoDb);
В тестах это мощно:
class MockDatabase implements Database {
async query(sql: string) {
return { id: 1, name: 'Test User' };
}
}
const mockDb = new MockDatabase();
const service = new UserService(mockDb);
// Тестируем без реальной БД!
Три уровня DIP:
- Constructor Injection — передаём в конструктор
- Setter Injection — через метод setter
- Interface Injection — через интерфейс
Главное преимущество:
- Тестируемость — мокируем зависимости
- Гибкость — меняем реализацию без изменения кода
- Модульность — классы независимы от конкретной реализации
DIP в реальных проектах:
// API Gateway зависит от интерфейса, не от конкретного сервиса
class ApiGateway {
constructor(
private userService: UserServiceInterface,
private postService: PostServiceInterface
) {}
}
// Можно подменять реализации
Вывод:
DIP это про гибкость и тестируемость через зависимости инъекцию. Используй interfaces/abstractions вместо конкретных классов.