Bueno, todo lo que veo en este hilo es genial, pero tengo una definición de 'invariante' que me ha sido de gran ayuda en el trabajo.
Una invariante es cualquier regla lógica que debe obedecerse durante la ejecución de su programa y que puede comunicarse a un humano, pero no a su compilador.
Esta definición es útil porque divide las condiciones en dos grupos: aquellos en los que se puede confiar que el compilador aplicará, y aquellos que deben documentarse, debatirse, comentarse o comunicarse de otra manera a los contribuyentes para que interactúen con la base de código sin introducir errores. .
Además, esta definición es útil porque le permite utilizar la generalización, "Las invariantes son malas".
Como ejemplo, la palanca de cambios en un automóvil de transmisión manual está diseñada para evitar una invariante. Si quisiera, podría construir una transmisión con una palanca para cada marcha. Esta palanca podría estar hacia adelante ("activada") o hacia atrás ("desactivada"). En dicho sistema, he creado un "invariante", que podría documentarse como tal:
"Es crítico que el engranaje actualmente enganchado se desacople antes de que se enganche un engranaje diferente. Enganchar cualquiera de los dos engranajes al mismo tiempo causará tensión mecánica que desgarrará la transmisión. Siempre desacople el engranaje actualmente enganchado antes de enganchar otro".
Y así, uno podría culpar a las transmisiones rotas de la conducción descuidada. Los autos modernos, sin embargo, usan un solo palo que gira entre los engranajes. Está diseñado de tal manera que, en un automóvil moderno de palanca de cambios, no es posible engranar dos marchas al mismo tiempo.
De esta manera, podríamos decir que la transmisión ha sido diseñada para 'eliminar lo invariante', ya que no permite que se configure mecánicamente de una manera que viole la regla lógica.
Cada invariante de este tipo que elimine de su código es una mejora, ya que reduce la carga cognitiva de trabajar con él.