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.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Mises en situation
  5. 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, bonjour
    • bonjour, enregistré, prêt
    • enregistré, bonjour, prêt
    • prêt, enregistré, bonjour
    Voir la réponse

    enregistré, prêt, bonjour

    enregistrer(saluer) range la fonction sans l'exécuter. Elle ne s'exécute qu'au declencher() : 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.