Sobes.tech
Back to questions
Middle
116
questionbank

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

Sobes Copilot

Get answers in real time

Answer from AI

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 также зависит от абстракции, реализуя её. Зависимость "инвертируется" — вместо того, чтобы высокоуровневый модуль зависел от низкоуровневого, они оба зависят от абстракции.