← Назад к вопросам

Что значит буква 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:

  1. Constructor Injection — передаём в конструктор
  2. Setter Injection — через метод setter
  3. Interface Injection — через интерфейс

Главное преимущество:

  • Тестируемость — мокируем зависимости
  • Гибкость — меняем реализацию без изменения кода
  • Модульность — классы независимы от конкретной реализации

DIP в реальных проектах:

// API Gateway зависит от интерфейса, не от конкретного сервиса
class ApiGateway {
  constructor(
    private userService: UserServiceInterface,
    private postService: PostServiceInterface
  ) {}
}

// Можно подменять реализации

Вывод:

DIP это про гибкость и тестируемость через зависимости инъекцию. Используй interfaces/abstractions вместо конкретных классов.

Что значит буква D в SOLID? | PrepBro