Bem, as coisas que estou vendo neste tópico são ótimas, mas tenho uma definição de 'invariável' que foi tremendamente útil para mim no trabalho.
Invariável é qualquer regra lógica que deve ser obedecida durante a execução do seu programa que pode ser comunicada a um ser humano, mas não ao seu compilador.
Essa definição é útil porque separa as condições em dois grupos: aquelas em que o compilador pode confiar, e aquelas que devem ser documentadas, discutidas, comentadas ou comunicadas aos colaboradores para que eles interajam com a base de código sem introduzir bugs. .
Além disso, essa definição é útil porque permite que você use a generalização "Invariantes são ruins".
Como exemplo, o câmbio em um carro de transmissão manual é projetado para evitar uma invariância. Se eu quisesse, eu poderia construir uma transmissão com uma alavanca para cada marcha. Essa alavanca pode estar para a frente ("engatada") ou para trás ("desengatada"). Nesse sistema, criei um "invariável", que pode ser documentado da seguinte maneira:
"É fundamental que a engrenagem atualmente engatada seja desengatada antes de uma engrenagem diferente ser engatada. O engate de duas engrenagens ao mesmo tempo causará estresse mecânico que rasgará a transmissão. Sempre desengate a engrenagem atualmente engatada antes de engatar outra."
E assim, pode-se culpar transmissões quebradas em direção desleixada. Os carros modernos, no entanto, usam um único manípulo que gira entre as engrenagens. Ele foi projetado de tal maneira que, em um carro moderno, não é possível engatar duas marchas ao mesmo tempo.
Dessa maneira, poderíamos dizer que a transmissão foi projetada para 'remover o invariante', porque não se permite ser mecanicamente configurada de maneira a violar a regra lógica.
Cada invariante desse tipo que você remove do seu código é uma melhoria, pois diminui a carga cognitiva de trabalhar com ele.