Bene, le cose che vedo in questo thread sono tutte fantastiche, ma ho una definizione di "invariante" che è stata estremamente utile per me al lavoro.
An invariant is any logical rule that must be obeyed throughout the execution of your program that can be communicated to a human, but not to your compiler.
Questa definizione è utile perché elimina le condizioni in due gruppi: quelle del compilatore possono essere attendibili con l'imposizione e quelle che devono essere documentate, discusse, commentate o altrimenti comunicate ai contributori affinché possano interagire con il codebase senza introdurre bug.
Inoltre, questa definizione è utile perché ti permette di usare la generalizzazione, "Gli invarianti sono cattivi".
Ad esempio, il cambio in una macchina di trasmissione manuale è progettato per evitare un'invarianza. Se volessi, potrei costruire una trasmissione con una leva per ogni marcia. Questa leva potrebbe essere in avanti ("impegnata") o indietro ("disinnestata"). In tale sistema, ho creato un "invariante", che potrebbe essere documentato come tale:
"It is critical that the currently engaged gear be disengaged before a different gear is engaged. To engage any two gears at the same time will cause mechanical stress that will tear the transmission apart. Always disengage the currently engaged gear before engaging another."
E così, si potrebbero incolpare le trasmissioni rotte durante la guida in stato di abbandono. Le auto moderne, tuttavia, usano un solo bastone che ruota intorno agli ingranaggi. È progettato in modo tale che, su una moderna auto stick-shift, non è possibile impegnare due marce contemporaneamente.
In questo modo, potremmo dire che la trasmissione è stata progettata per "rimuovere l'invariante", perché non consente a se stessa di essere configurata meccanicamente in un modo che viola la regola logica.
Ogni invariante di questo tipo che rimuovi dal tuo codice è un miglioramento, perché riduce il carico cognitivo del lavoro con esso.