Sobes.tech
Middle

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

sobes.tech AI

Отговор от 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 също зависи от абстракцията и я реализира. Зависимостта "се обръща" — вместо високото ниво да зависи от ниското, и двата зависят от абстракцията.