L'inversion de contrôle
Qui appelle qui : le principe d'Hollywood et ses formes (fonction de rappel, méthode gabarit, écouteur d'événement, injection de dépendances) et ce qui sépare un framework d'une bibliothèque.
- 25 cartes
- 5 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Mises en situation
- Comprendre
Quelques cartes du deck
Inversion de contrôle : de quoi s'agit-il ?
Voir la réponse
Principe selon lequel le code du développeur ne décide plus du moment où il s'exécute : un cadre extérieur l'appelle aux points prévus pour cela.
On l'appelle le principe d'Hollywood : « ne nous appelez pas, nous vous appellerons ». Une bibliothèque, elle, est appelée quand le développeur le décide ; un framework appelle le code du développeur.
Qu'affiche ce programme ?
```python
rappels = []
def enregistrer(f):
rappels.append(f)
print("enregistré")
def declencher():
for f in rappels:
f()
def saluer():
print("bonjour")
enregistrer(saluer)
print("prêt")
declencher()`enregistré,prêt,bonjourbonjour,enregistré,prêtenregistré,bonjour,prêtprêt,enregistré,bonjour
Voir la réponse
enregistré,prêt,bonjourenregistrer(saluer)range la fonction sans l'exécuter. Elle ne s'exécute qu'audeclencher(): la main passe de votre code, qui avait enregistré, à celui qui rappelle.Avec une …, c'est le code du développeur qui appelle ; avec un …, c'est le framework qui appelle le code du développeur.
Voir la réponse
Avec une bibliothèque, c'est le code du développeur qui appelle ; avec un framework, c'est le framework qui appelle le code du développeur.
json.loads(texte)est un appel à une bibliothèque. Une route déclarée avec@app.get('/')est appelée par le framework quand une requête arrive.Fonction de rappel : de quoi s'agit-il ?
Voir la réponse
Fonction qu'on passe en paramètre à un autre code, qui l'appellera plus tard, quand l'événement attendu se produira.
On passe la fonction elle-même, sans parenthèses :
enregistrer(saluer)la transmet,enregistrer(saluer())l'exécute tout de suite et transmet son résultat.Un service de facturation crée
Depot()dans son constructeur, et chaque test écrit dans la vraie base. Quelle modification permet de tester sans base ?- Recevoir le dépôt en paramètre et passer un faux dans les tests
- Créer
Depot()dans un attribut de classe plutôt que dans le constructeur - Appeler
Depot()à chaque méthode du service plutôt qu'une fois dans le constructeur - Lire l'adresse de la base dans une variable d'environnement
Voir la réponse
Recevoir le dépôt en paramètre et passer un faux dans les tests
Tant que le service construit sa dépendance, il est lié à la vraie classe. En la recevant, il ignore ce qu'il reçoit : les tests passent un faux, la production passe le vrai.