-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathContents.swift
85 lines (77 loc) · 2.85 KB
/
Contents.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import Foundation
/*:
# **Injection de dépendances**
* L'injection de dépendances consiste à fournir des instances (objets déjà initialiasés) pour l'initialisation d'un autre objet
*/
final class RequestManager {
var name = "RequestManager"
}
let requestManager = RequestManager()
/*:
### Exemple
* **Sans injection de dépendance**, puisque la class *ViewModel* créer l'instance de *RequestManager* à l'intérieur de sa définition
*/
final class ViewModel {
var requestManager = RequestManager()
}
let viewModel = ViewModel()
//: * **Avec injection de dépendance**, puisqu'on fournit une instance de *RequestManager* pour l'initialisation de la class *ViewModelBis*
final class ViewModelBis {
var requestManager: RequestManager
init(requestManager: RequestManager) {
self.requestManager = requestManager
}
}
let viewModelBis = ViewModelBis(requestManager: requestManager)
/*:
### Avantage de l'injection de dépendances :
* Les properties et la class (en elle-même) sont totalement découplés, la class ne créer aucun objet à part elle même ––> SOLID
* Les responsabilités et les requierements de la class sont clairement identifiables et identifiés
* Unit Test plus facile à mettre en place car tous les objets sont isolés / découplés les un des autres
*/
/*:
### Injection de dépendances via la POP
* Avec Swift, les injections de dépendances sont encore plus puissantes via la POP
* Le viewModel n'est plus contraint à un unique objet du type, ainsi, il peut donc être initialisé par n'importe quel objet du type du protocol
* Le viewModel est donc ainsi découplé de tout objet du type du protocol et de l'implémentation des fonctionnalités
*/
protocol Serializer {
func serialize(data: Any) -> Data?
}
class RequestSerializer: Serializer {
func serialize(data: Any) -> Data? { return nil }
}
class ViewModelSerializer {
var serializer: Serializer
init(serializer: Serializer) {
self.serializer = serializer
}
}
let serializer = RequestSerializer()
let viewModelSerializer = ViewModelSerializer(serializer: serializer)
/*:
### Les 3 types d'injection de dépendances :
* **Initializer Injection** (le plus courant)
*/
class InitializerInjection {
var requestManager: RequestManager
init(requestManager: RequestManager) {
self.requestManager = requestManager
}
}
InitializerInjection(requestManager: requestManager)
//: * **Property Injection**
class PropertyInjection {
var requestManager: RequestManager?
}
let propertyInjection = PropertyInjection()
propertyInjection.requestManager = requestManager
//: * **Method Injection**
class MethodInjection {
var requestManager: RequestManager?
func initializeRequestManager(requestManager: RequestManager) {
self.requestManager = requestManager
}
}
let methodInjection = MethodInjection()
methodInjection.initializeRequestManager(requestManager: requestManager)