Bene, le cose che vedo in questo thread sono tutte fantastiche, ma ho una definizione di "invariante" che è stata tremendamente utile per me al lavoro.
Un invariante è qualsiasi regola logica che deve essere rispettata durante l'esecuzione del programma che può essere comunicata a un essere umano, ma non al compilatore.
Questa definizione è utile perché suddivide le condizioni in due gruppi: quelli del compilatore di cui ci si può fidare con l'applicazione, e quelli che devono essere documentati, discussi, commentati o altrimenti comunicati ai contributori affinché possano interagire con la base di codice senza introdurre bug .
Inoltre, questa definizione è utile perché ti consente di utilizzare la generalizzazione, "Gli invarianti sono cattivi".
Ad esempio, il cambio in un'auto a cambio manuale è progettato per evitare un invariante. Se avessi voluto, avrei potuto costruire una trasmissione con una leva per ogni marcia. Questa leva può essere in avanti ("innestata") o indietro ("disinnestata"). In un tale sistema, ho creato un "invariante", che potrebbe essere documentato come tale:
"È fondamentale che l'ingranaggio attualmente innestato sia disinnestato prima di innestare un altro ingranaggio. Innestare due marce contemporaneamente provoca stress meccanici che spezzeranno la trasmissione. Disinnestare sempre l'ingranaggio attualmente innestato prima di innestarne un altro."
E così, si potrebbe incolpare trasmissioni interrotte sulla guida sciatta. Le auto moderne, tuttavia, usano un solo bastone che ruota attorno agli ingranaggi. È progettato in modo tale che, su una moderna auto con cambio a levetta, non è possibile innestare due marce contemporaneamente.
In questo modo, potremmo dire che la trasmissione è stata progettata per "rimuovere l'invariante", perché non consente di configurarsi meccanicamente in modo tale da violare la regola logica.
Ogni invariante di questo tipo che rimuovi dal tuo codice è un miglioramento, perché riduce il carico cognitivo di lavorare con esso.