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.
}
}