Хорошо, материал, который я вижу в этой теме, великолепен, но у меня есть определение «инварианта», которое мне очень помогло на работе.
Инвариант - это любое логическое правило, которому необходимо следовать при выполнении вашей программы, которое может быть передано человеку, но не вашему компилятору.
Это определение полезно, потому что оно разбивает условия на две группы: те, которым компилятору можно доверять с применением, и те, которые должны быть задокументированы, обсуждены, прокомментированы или иным образом доведены до участников, чтобы они могли взаимодействовать с базой кода без появления ошибок. ,
Также это определение полезно, потому что оно позволяет использовать обобщение «Инварианты плохие».
Например, механизм переключения передач в автомобиле с механической коробкой передач спроектирован так, чтобы избежать инварианта. Если бы я хотел, я мог бы построить трансмиссию с одним рычагом для каждой передачи. Этот рычаг может быть вперед («включен») или назад («отключен»). В такой системе я создал «инвариант», который можно задокументировать так:
«Крайне важно, чтобы включенная в данный момент шестерня была отключена перед включением другой шестерни. Включение любых двух шестерен одновременно вызовет механическое напряжение, которое разорвёт коробку передач. Всегда отключайте включенную в данный момент шестерню перед включением другой».
И так, можно было бы обвинить сломанные передачи на небрежном вождении. Современные автомобили, однако, используют одну палку, которая вращается среди передач. Он сконструирован таким образом, что на современном автомобиле с переключением передач невозможно задействовать две передачи одновременно.
Таким образом, мы могли бы сказать, что передача была разработана для «удаления инварианта», потому что она не позволяет механически конфигурировать себя таким образом, который нарушает логическое правило.
Каждый такой инвариант, который вы удаляете из своего кода, является улучшением, потому что он снижает когнитивную нагрузку при работе с ним.