#ios #swift #dependency-injection
#iOS #swift #внедрение зависимостей
Вопрос:
Я смотрю на ‘Cleanse‘ и ‘Swinject‘ за последние два дня. Кто-нибудь может рассказать мне или объяснить реальное использование внедрения зависимостей и как это помогает нам в разработке приложений для iOS?.
Я был действительно смущен тем, какая часть моего приложения (классы) Мне нужно применить внедрение зависимости, а какое нет. Я думаю, что это делает мой код очень сложным.
Комментарии:
1. Внедрение зависимостей позволяет вам «заглушать» или «имитировать» многие параметры, которые вы передаете функциям / классам и т.д. Это делает ваш код намного более «тестируемым», поскольку вы можете макетировать API в локальный файл и т.д. Это может быть бесценно при модульном тестировании, которое, в свою очередь, дает вам больше уверенности в коде, который вы пишете и выпускаете
2. Для получения отличного введения в внедрение зависимостей прочтите этот отрывок из Dependency Injection PP amp; P .
3. Извините, но я не понимаю, почему его ответ отклонен, это коллега-разработчик, который пытается понять, как работает внедрение зависимостей, и хочет помощи, а не разочарования.
Ответ №1:
Внедрение зависимостей — это не что иное, как внедрение зависимостей в объект вместо того, чтобы возлагать на объект ответственность за создание его зависимостей.
Пример:
class UserViewModel {
var User = User?
}
let UserViewModel = UserViewModel()
let User = User()
UserViewModel.User = User
Типы внедрения зависимостей:
- внедрение зависимостей через инициализатор (initializer injection)
- внедрение зависимостей с использованием свойств (property injection)
- внедрение зависимостей в методы (method injection)
Преимущества, которые мы получим:
- прозрачность
При внедрении зависимостей объекта обязанности и требования класса или структуры становятся более четкими и прозрачными. Вводя пользователя в UserViewModel, мы понимаем, что UserViewModel зависит от пользователя.
- Улучшение тестируемости
Модульное тестирование намного проще с внедрением зависимостей. Внедрение зависимостей позволяет разработчикам заменять зависимости объекта фиктивными объектами, что упрощает изоляцию поведения и настройку модульных тестов.
- Разделение проблем
Внедрение зависимостей позволяет нам гораздо яснее понимать наш код и разделяет наши опасения. Когда мы используем внедрение зависимостей, мы можем видеть, что наши объекты отвечают за управление данной зависимостью. Следуя одному из приведенных выше примеров, наша UserViewModel отвечает за управление нашим библиотечным объектом.
- Слабая связь
Пример класса UserViewModel иллюстрирует, как использование протоколов и внедрение зависимостей может уменьшить связь в проекте. Протоколы в Swift невероятно полезны и универсальны. Рассмотренный нами пример — это сценарий, в котором протоколы действительно великолепны.
Комментарии:
1. Я где-то это читал. Но это не фактическое внедрение зависимостей. Я просмотрел несколько руководств, связанных с внедрением зависимостей. Я поделюсь ими с вами и, пожалуйста, изучите это. github.com/square/Cleanse/blob/master/README.rst
2. Cleanse и Swinject — это два инструмента управления внедрением зависимостей, которые у нас есть для Swift
Ответ №2:
Документ из Википедии,
В программной инженерии внедрение зависимостей — это метод, посредством которого один объект (или статический метод) предоставляет зависимости другого объекта. Зависимость — это объект, который можно использовать (сервис).
И в простых терминах,
Когда класс A использует некоторую функциональность класса B, тогда говорится, что класс A имеет зависимость от класса B.
Или
Передача задачи создания объекта кому-либо другому и непосредственное использование зависимости называется внедрением зависимостей.
Схематично :
- Я был действительно смущен тем, какая часть моего приложения (классы) Мне нужно применить внедрение зависимости, а какое нет.
Вы почти широко используете это, но в Android это слово хорошо известно. Давайте рассмотрим пример,
Давайте предположим, что у нас есть два контроллера, MasterVC и DetailVC. DetailVC подробно показывает, какие данные выбраны в MasterVC. Теперь вам нужно передать выбранные данные (идентификатор, ключ) из MasterVC в DetailVC. Для этого вам необходимо получить доступ к методу DetailVC или переменной в MasterVC, как показано ниже,
let objDetailVC = DetailVC() // Init of class
objDetailVC.ID = selectedID
// push controller
Теперь DetailVC зависит от ID, это называется внедрением зависимостей (DI).
- Я думаю, что это делает мой код очень сложным.
Нет, это делает ваш проект более динамичным. В настоящее время я управлял 5 контроллерами в одном контроллере с помощью структуры MVC и внедрения зависимостей. Проект очень плавный, хорошо управляемый, с высокой возможностью повторного использования кода.
Так что все зависит от вас, как вы управляете кодом.
Редактировать
Вы можете использовать DI, как в приведенном выше примере, или вы можете создать метод в DetailVC и рассматривать его как абстракцию.
Для получения более подробной информации обратитесь к: Cocoacast: Основные моменты внедрения зависимостей в Swift
Комментарии:
1. Какой фреймворк вы используете для DI? Я не видел никакой библиотеки в вашем ответе. и, насколько мне известно, приведенный вами пример о DetailVC () и objDetailVC.ID = selectID — очень распространенный подход, и он никоим образом не связан с внедрением зависимостей.
2. Cleanse и Swinject — это два инструмента управления внедрением зависимостей, которые у нас есть для Swift. Пожалуйста, ознакомьтесь с ними
3. @dahiya_boy Ваша диаграмма, объясняющая зависимость, сделала это очень понятным для меня. Было бы замечательно, если бы вы могли показать диаграмму с теми же двумя классами, но теперь с отображением внедрения зависимостей. Потому что я все еще не вижу, как решить проблему, когда у меня есть класс A, который использует / нуждается / зависит от методов класса B.