Bien, tout ce que je vois dans ce fil est génial, mais j'ai une définition du terme «invariant» qui m'a été extrêmement utile au travail.
Un invariant est une règle logique à respecter tout au long de l'exécution de votre programme qui peut être communiquée à un humain, mais pas à votre compilateur.
Cette définition est utile car elle divise les conditions en deux groupes: ceux que le compilateur peut faire confiance et ceux qui doivent être documentés, discutés, commentés ou autrement communiqués aux contributeurs pour qu'ils puissent interagir avec la base de code sans introduire de bogues. .
En outre, cette définition est utile car elle vous permet d’utiliser la généralisation "Les invariants sont mauvais".
Par exemple, le levier de vitesses d'une voiture à transmission manuelle est conçu pour éviter les invariants. Si je le voulais, je pourrais construire une transmission avec un levier pour chaque vitesse. Ce levier peut être en avant ("engagé") ou en arrière ("désengagé"). Dans un tel système, j'ai créé un "invariant", qui pourrait être documenté comme tel:
"Il est essentiel que le rapport actuellement engagé soit désengagé avant qu'un autre rapport soit engagé. Engager deux rapports simultanément en même temps entraînera des contraintes mécaniques qui déchireront la transmission. Désengagez toujours le rapport actuellement engagé avant d'en engager un autre."
Et ainsi, on pourrait blâmer les transmissions cassées sur une conduite bâclée. Cependant, les voitures modernes utilisent un seul bâton qui pivote entre les engrenages. Il est conçu de telle sorte que, sur une voiture moderne à levier de vitesse, il ne soit pas possible d'engager deux vitesses en même temps.
De cette manière, on pourrait dire que la transmission a été conçue pour «supprimer l'invariant», car elle ne se permet pas d'être configurée de manière mécanique d'une manière non conforme à la règle logique.
Chaque invariant de ce type que vous supprimez de votre code constitue une amélioration, car il réduit la charge cognitive liée à son utilisation.