Lazy evaluation

Le principe de "lazy evaluation" (évaluation paresseuse) consiste à faire un calcul le plus tard possible, comme quelqu'un qui "procrastine" (= remet tout à plus tard).

Prenons un exemple avec un jeu dans lequel le joueur déclenche des capacités via des boutons. Les boutons ont tous une méthode de mise à jour de leur UI, que j'appellerai OnCapacityChanged() ici. Celle-ci change les éléments graphiques en fonction de paramètres (case vide ou pleine, bouton grisé ou non, sélectionnable ou non, etc.).
Maintenant, imaginons qu'à chaque changement de paramètre, j'appelle cette méthode :

void SetGameCapacity(GameCapacity gc) {
    gameCapacity = gc;
    OnCapacityChanged();
}
void SetHidden() { hide = true; OnCapacityChanged(); }
// etc.


Gros avantage : tout changement de paramètre mettra à jour l'UI. Inconvénient : si l'on change plusieurs paramètres, il y aura plusieurs mises à jour, alors qu'une seule est nécessaire. Exemple :

box.SetGameCapacity(myCapacity);
box.SetHidden(false);

L'astuce consiste alors à remplacer le contenu de OnCapacityChanged() pour effectuer une évaluation paresseuse. Cela ressemblerait à :

void OnCapacityChanged() { dirty = true; }
void Update() {
    if (dirty) {        // Si OnCapacityChanged() a été appelée au moins une pendant la frame...
        OnCapacityChanged_DoUpdateUI();        // alors faire "vraiment" la mise à jour de l'UI...
        dirty = false;        // et remettre le flag dans son état normal.
    }
}

 

Traductions :
Mise à jour :