Interview iOS : Injection de dépendance [Types et implémentation]

Dec 21 2022
Avez-vous déjà été confronté à ces questions ci-dessous lorsque vous avez commencé à donner un entretien pour un poste de développeur iOS ? 1. Qu'est-ce que l'injection de dépendance ? 2.

Avez-vous déjà été confronté à ces questions ci-dessous lorsque vous avez commencé à donner un entretien pour un poste de développeur iOS ?

ID

1. Qu'est-ce que l'injection de dépendance ?

2. Quels sont les avantages de l'injection de dépendance ?

3. Quels sont les types d'injection de dépendance ?

Et étonnamment, vous avez utilisé l'injection de dépendances quelque part dans votre code, mais vous ne parvenez pas à l'expliquer avec le concept.

Commençons donc à comprendre l'injection de dépendance.

L' injection de dépendance est un modèle de conception de logiciel dans lequel un objet reçoit d'autres instances dont il dépend.

La question qui se pose est donc de savoir si tout fonctionnait bien en créant un objet de la classe, puis en utilisant la propriété et la fonction, pourquoi avons-nous besoin d'une injection de dépendance ? Et la raison derrière cela est que l'injection de dépendances donne le pouvoir d'écrire un code plus testable et réutilisable qui nous aide à écrire un logiciel maintenable où nous pouvons effectuer le test avec des données simulées et cela simplifiera les tests. il s'agit d'un modèle de conception qui consiste à fournir à un composant ses dépendances plutôt que de laisser le composant lui-même les créer ou les localiser. Cela peut être utile pour un certain nombre de raisons, notamment :

  • Cela facilite le test des composants isolés, car vous pouvez injecter des dépendances fictives plutôt que d'avoir à configurer les vraies.
  • Il vous permet de dissocier les composants les uns des autres, ce qui facilite leur réutilisation et leur maintenance.
  • Cela peut faciliter la gestion de systèmes complexes, car vous pouvez définir les dépendances à un emplacement central plutôt que de les disperser dans la base de code.

class NetworkClient {
  func performRequest(url: URL) {
    // Perform network request
  }
}

class UserService {
  let networkClient: NetworkClient

  init(networkClient: NetworkClient) {
    self.networkClient = networkClient
  }

  func fetchUsers() {
    let url = URL(string: "url")!
    networkClient.performRequest(url: url)
  }
}

let networkClient = NetworkClient()
let userService = UserService(networkClient: networkClient)
userService.fetchUsers()

2. Injection de propriété : cela implique de définir les dépendances sur le composant en tant que propriétés après son initialisation.

class UserService {
  var networkClient: NetworkClient?

  func fetchUsers() {
    let url = URL(string: "url")!
    networkClient?.performRequest(url: url)
  }
}

let networkClient = NetworkClient()
let userService = UserService()
userService.networkClient = networkClient
userService.fetchUsers()

class UserService {
  func fetchUsers(using networkClient: NetworkClient) {
    let url = URL(string: "url")!
    networkClient.performRequest(url: url)
  }
}

let networkClient = NetworkClient()
let userService = UserService()
userService.fetchUsers(using: networkClient)

protocol NetworkClient {
  func performRequest(url: URL)
}

class HTTPNetworkClient: NetworkClient {
  func performRequest(url: URL) {
    // Perform network request using HTTP
  }
}

class UserService {
  var networkClient: NetworkClient

  init(networkClient: NetworkClient) {
    self.networkClient = networkClient
  }

  func fetchUsers() {
    let url = URL(string: "url")!
    networkClient.performRequest(url: url)
  }
}

let networkClient = HTTPNetworkClient()
let userService = UserService(networkClient: networkClient)
userService.fetchUsers()