Какая польза от внедрения зависимостей? | 6 мая, вс, 18 мая

Внедрение зависимостей в Swift можно избежать одноэлементного шаблона и сделать код более тестируемым со слабой связью.

Изначально я также не знал о внедрении зависимостей, когда я следовал некоторому стандартному шаблону кодирования, тогда я понимаю, нужно ли мне переходить на внедрение зависимостей. На начальном этапе никто не совершенен, работая над реальными проектами и сталкиваясь с проблемами, затем мы узнаем что-то новое.

Затем я начал добавлять Dependency Injection в свои проекты, после чего понял, что его довольно легко использовать. В большинстве случаев я избегал шаблонов Singleton.

Какая польза от внедрения зависимостей?

Используя внедрение зависимостей, мы можем сделать более тестируемый, более простой код, который мы можем написать. Только нам нужно передать зависимость через объект инициализацию. Каждый класс несет ответственность за внедрение зависимости через объект.

Давайте посмотрим на код внедрения без зависимостей -

Это обычный одноэлементный класс, который мы здесь используем.

class DataManager{
    
    static let shared = DataManager()
    var delegate: ResponseHandler?
    
    private init(){}
    
    func requestForData(){
        //Code Process
        ...
    }
}

Как использовать этот класс

class ViewController: UIViewController, ResponseHandler {
  
  override func viewDidLoad() {
    super.viewDidLoad()
    DataManager.shared.delegate = self
    DataManager.shared.requestForData()
  }
}

С использованием внедрения зависимостей

class DataManager{
    
    private var delegate: ResponseHandler
    //injecting here dependency
    init(delegate: ResponseHandler) {
         self.delegate = delegate
    }
    
    func requestForData(){
        //Code Process
        ...
    }
}

Как использовать этот класс

class HomeViewController: UIViewController, ResponseHandler {
  
  //Use the class with self-executing closure
  lazy var dataManager: DataManager = {
       let manager = DataManager(delegate: self)
       return manager
  }()
  override func viewDidLoad() {
    super.viewDidLoad()
  }
}

Передача зависимости через другой ViewController

Теперь мы внесли небольшие изменения в текущий класс.

class HomeViewController: UIViewController, ResponseHandler {
   
   var dataManager: DataManager?
   override func viewDidLoad() {
     super.viewDidLoad()
   }
}

приходя этот класс из другого ViewController -

class ViewController: UIViewController{
  //MARK: - Navigation
  func moveToHomeController(){
     guard let homeView =
     self.storyboard?.instantiateViewController(withIdentifier:
                      "HomeViewController") as? HomeViewController
          else { print("View controller not found")
               return
          }
   //Passing here dependency 
   homeView.dataManager = DataManager(delegate: homeView.self)
   navigationController?.pushViewController(homeView, animated:   
   true)
  }
}

или через Segue

class ViewController: UIViewController{
    //MARK: - Navigation   
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
     if segue.identifier == homeViewControllerIdentifier,
     let homeView = segue.destination as? HomeViewController {
         homeView.dataManager = DataManager(delegate: homeView.self)
      }
    }
}

Зависимость от внедрения метода

class APIManager{
   func requestUserDetails(_ request: Request, database: DataManager, track: TrackDetails) -> ResponseManager? {
       ...
   }
}

Заключение

Здесь мы получили представление о внедрении зависимостей для управления более тестируемыми и распределенными внутри вашего кода. В этой части мы рассмотрели, как передать одну зависимость множественным инъекциям зависимостей.
Еще одна важная вещь, которую я рассмотрел в этой части, - передача зависимости через один контроллер представления другому контроллеру представления. Его довольно легко использовать внутри вашего кода.

У нас также есть еще одна вещь, как получить подтверждение протокола делегата внутри вашего кода.

Спасибо за чтение 🙌🏼

Если у вас есть вопросы по этому руководству? Твиттер меня: @ Ананд