Injection de dépendance
DI est une technique largement utilisée dans la programmation de logiciels. Même Google recommande DI aux développeurs Android, Android a des bibliothèques comme Dagger, Hilt à cet effet. DI offre les avantages suivants :
- Réutilisabilité du code
- Facilité de refactorisation
- Facilité de test
L'injection de dépendance est une technique qui permet de séparer les objets des objets dont ils dépendent. Prenons un exemple de la façon d'implémenter DI dans iOS.
class HTTPClient {
func downloadFrom(url: URL) {
//download data from remote
}
}
class DataDownload {
let client = HTTPClient()
func getData(url: URL) {
client.downloadFrom(url: url)
}
}
class client {
let dataDownload: DataDownload
init() {
self.dataDownload = DataDownload()
self.dataDownload.getData(url: URL(string: "https://any_http_url.com")!)
}
}
class FTPClient {
func downloadFrom(url: URL) {
//download data from remote
}
}
class DataDownload {
let client = FTPClient()
func getData(url: URL) {
client.downloadFrom(url: url)
}
}
class client {
let dataDownload: DataDownload
init() {
self.dataDownload = DataDownload()
self.dataDownload.getData(url: URL(string: "https://any_ftp_url.com")!)
}
}
protocol RemoteClient {
func downloadFrom(url: URL)
}
class FTPClient: RemoteClient {
func downloadFrom(url: URL) {
//download data from remote
}
}
class DataDownload {
let client: RemoteClient
init(client: RemoteClient) {
self.client = client
}
func getData(url: URL) {
client.downloadFrom(url: url)
}
}
class Client1 {
let dataDownload: DataDownload
init() {
self.dataDownload = DataDownload(client: FTPClient())
self.dataDownload.getData(url: URL(string: "https://any_ftp_url.com")!)
}
}
class Client2 {
let dataDownload: DataDownload
init() {
self.dataDownload = DataDownload(client: HTTPClient())
self.dataDownload.getData(url: URL(string: "https://any_htttp_url.com")!)
}
}
RemoteClientest injecté à DataDownloadpartir du compositeur/assembleur Client1et Client2. Il découple également le code. Maintenant, nous pouvons les tester en séparation sans remplir de dépendance indésirable. Quelques avantages de la refactorisation de code ci-dessus
- Facilité dans les tests.
- Développement plus rapide de nouvelles fonctionnalités.
- Amélioration du temps de compilation de Xcode (j'écrirai un blog séparé à ce sujet).
- Gain de temps et d'argent.
- Injection de constructeur (expliquée ci-dessus)
- Injection de fonction
- Injection de propriété
class ChildViewController: UIViewController {
func viewDidLoad() { }
func viewWillAppear() { }
func viewDidAppear() { }
func getDataFrom(_ client: RemoteClient, url: URL) {
client.downloadFrom(url: url)
}
}
class ParentViewController: UIViewController {
func viewDidLoad() { }
func viewWillAppear() { }
func viewDidAppear() { }
func present() {
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let vc = storyboard.instantiateViewController(withIdentifier: "ChildViewController") as! ChildViewController
vc.getDataFrom(client: HTTPClient(), url: URL(string:"https://any-url.com")!)
}
}
Injection de propriété : HTTPClient est transmis en tant qu'injection de propriété à var client.
class ChildViewController: UIViewController {
var client: RemoteClient?
func viewDidLoad() { }
func viewWillAppear() { }
func viewDidAppear() { }
func getDataFrom(url: URL) {
client.downloadFrom(url: url)
}
}
class ParentViewController: UIViewController {
func viewDidLoad() { }
func viewWillAppear() { }
func viewDidAppear() { }
func present() {
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let vc = storyboard.instantiateViewController(withIdentifier: "ChildViewController") as! ChildViewController
vc.client = HTTPClient()
}
}
J'espère que cela aide! Si vous avez aimé l'article et que vous souhaitez lire d'autres articles étonnants, suivez-moi ici et montrez votre soutien car cela me motive à écrire davantage.
Veuillez partager vos commentaires pour améliorer le contenu et sur le prochain sujet que vous souhaitez explorer.
Merci à tous d'avoir lu, bon codage !!
Références
- https://essentialdeveloper.com
- https://developer.android.com/training/dependency-injection
![Qu'est-ce qu'une liste liée, de toute façon? [Partie 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































