Назад к вопросам
Middle
91
questionbank

Расскажи о принципе зависимостей в SOLID, который соответствует букве D.

Sobes Copilot

Получайте ответы в реальном времени

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

sobes.tech AI

Принцип инверсии зависимостей (Dependency Inversion Principle, DIP).

Высокоуровневые модули не должны зависеть от низкоуровневых. Оба должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

Цель принципа: снизить связанность между компонентами, делая систему более гибкой, тестируемой и масштабируемой.

Пример на Swift:

Плохо:

class UserRepository {
    func getAllUsers() -> [User] {
        // Логика получения пользователей из конкретной базы данных или сети
        // ...реализация...
        return []
    }
}

class UserService {
    private let repository = UserRepository() // Прямая зависимость от конкретной реализации

    func fetchUsers() -> [User] {
        return repository.getAllUsers()
    }
}

Хорошо (с применением DIP):

// Абстракция
protocol UserRepositoryProtocol {
    func getAllUsers() -> [User]
}

// Низкоуровневый модуль (реализация абстракции)
class ConcreteUserRepository: UserRepositoryProtocol {
    func getAllUsers() -> [User] {
        // Логика получения пользователей (детали реализации)
        // ...реализация...
        return []
    }
}

// Высокоуровневый модуль, зависящий от абстракции
class UserService {
    private let repository: UserRepositoryProtocol // Зависимость от протокола

    init(repository: UserRepositoryProtocol) {
        self.repository = repository // Внедрение зависимости
    }

    func fetchUsers() -> [User] {
        return repository.getAllUsers()
    }
}

// Сборка зависимостей (лучше делать в контейнере DI)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)

Здесь UserService (высокоуровневый модуль) не зависит напрямую от ConcreteUserRepository (низкоуровневый модуль), а зависит от абстракции UserRepositoryProtocol. ConcreteUserRepository также зависит от абстракции, реализуя её. Зависимость "инвертируется" — вместо того, чтобы высокоуровневый модуль зависел от низкоуровневого, они оба зависят от абстракции.