8 ответов:
инвариант является более "концептуальным", чем переменная. В общем, это свойство состояния программы, которое всегда истинно. Функция или метод, который гарантирует, что инвариант удерживается, как говорят, поддерживает инвариант.
Как вы могу сказать, что это не то, что вы можете хранить в переменной: это больше оператор о программы. Выясняя, какие инварианты должна поддерживать ваша программа, а затем просматривая ваш код, чтобы убедиться, что он действительно поддерживает эти инварианты, вы можете избежать логических ошибок в своем коде.
Это условие, которое вы знаете, чтобы всегда быть истинным в определенном месте в вашей логике и может проверить при отладке, чтобы выяснить, что пошло не так.
Я обычно рассматриваю их больше с точки зрения алгоритмов или структур.
например, у вас может быть инвариант цикла, который можно утверждать-всегда истинно в начале или конце каждой итерации. То есть, если ваш цикл должен был обрабатывать коллекцию объектов из одного стека в другой, вы можете сказать, что |stack1|+|stack2|=c, в верхней или нижней части цикла.
Если инвариантная проверка не удалась, это будет означать, что что-то пошло не так. В этом примере это это может означать, что вы забыли вставить обработанный элемент в окончательный стек и т. д.
магия Википедии: инвариант (информатика)
в информатике предикат, который, если верно, то останется верным на протяжении всего определенную последовательность операций, называется (an) инвариантным к этому последовательность.
исходя из того, что это такое, инварианты весьма полезны при написании чистого кода, поскольку концептуально знают, какие инварианты должны присутствовать in ваш код позволяет легко решить, как организовать свой код для достижения этих целей. Как уже упоминалось ealier, они также полезны при отладке, поскольку проверка того, поддерживается ли инвариант, часто является хорошим способом увидеть, действительно ли любая манипуляция, которую вы пытаетесь выполнить, делает то, что вы хотите.
инвариант ADT определяет отношения среди полей данных (переменные экземпляра) это всегда должно быть правдой до и после выполнение любого метода экземпляра.
как говорится в этой строке:
чтобы лучше понять эту надежду, этот пример в C++ помогает.
рассмотрим сценарий, в котором вы должны получить некоторые значения и получить общее количество их в переменной, называемой как
countи добавьте их в переменную с именемsumThe инвариант (опять же, это больше похоже на концепцию):
// invariant: // we have read count grades so far, and // sum is the sum of the first count gradesкод выше будет что-то вроде этого,
int count=0; double sum=0,x=0; while (cin >> x) { ++count; sum+=x; }что делает приведенный выше код?
1) считывает входные данные из
cinи кладет их вx2) После одного успешного чтения, инкремент
countиsum = sum + x3) повторяйте 1-2, пока чтение не остановится (т. е. ctrl+D)
петли инвариант:
инвариант должен быть истинным всегда. Поэтому изначально вы начинаете свой код только с этого
while(cin>>x){ }этот цикл считывает данные из стандартного ввода и сохраняет в x. хорошо и хорошо. Но это инвариант не станет ложным, потому что первая часть нашего инвариант не последовало (или покой).
// we have read count grades so far, andкак сохранить инвариант правда?
просто! прирост рассчитывать.
так
++count;будет хорошо!. Теперь наш код становится чем-то вроде этого,while(cin>>x){ ++count; }но
даже сейчас наши инвариант (понятие, которое должно быть истинным) ложно, потому что теперь мы не удовлетворили вторую часть наши инвариант.
// sum is the sum of the first count gradesтак что же теперь делать?
добавить
xдоsumи хранить его вsum(sum+=x) и в следующий разcin>>xчитать новое значение в x.теперь наш код становится чем-то вроде этого,
while(cin>>x){ ++count; sum+=x; }давайте проверим
соответствует ли код нашему инварианту
// invariant: // we have read count grades so far, and // sum is the sum of the first count gradesкод:
while(cin>>x){ ++count; sum+=x; }Ах!. Теперь инвариант цикла истинен всегда и код работает нормально.
приведенный выше пример был взято и изменено из книги Ускоренный C++ Эндрю-кенинг и Барбара-е
Comments