Что такое Инвариант?
От: Ignoramus  
Дата: 11.05.05 12:16
Оценка:
Честно несколько раз прочитал определение у Страуструпа, но смысл сего понятия от меня ускользает.

Пожалуйста объясните, чем являтся инвариант класса с точки зрения практического кода.

Что это — функция? Как она используется? И т.п.
Re: Что такое Инвариант?
От: korzhik Россия  
Дата: 11.05.05 12:27
Оценка: 6 (1)
Здравствуйте, Ignoramus, Вы писали:

I>Честно несколько раз прочитал определение у Страуструпа, но смысл сего понятия от меня ускользает.


I>Пожалуйста объясните, чем являтся инвариант класса с точки зрения практического кода.


I>Что это — функция? Как она используется? И т.п.


здесь помоему понятно написано
Re: Что такое Инвариант?
От: Mr.Chipset Россия http://merlinko.com
Дата: 11.05.05 12:54
Оценка: 1 (1)
Здравствуйте, Ignoramus, Вы писали:

I>Честно несколько раз прочитал определение у Страуструпа, но смысл сего понятия от меня ускользает.


I>Пожалуйста объясните, чем являтся инвариант класса с точки зрения практического кода.


Отсюда:

Инвариант — это некоторое логическое условие, значение которого (истина или ложь) должно сохраняться.

Приложительно к ЯП — это набор условий для класса которым должен следовать любой класс в момент вызова. Проще говоря — много инвариантов для методов класса.
Ты юзаешь инварианты классов в повседневном программировании. К примеру, есть класс vector — дин. массив. Логически понятно что номер текущего элемента не должен быть больше общего количества элементов и не должен быть меньше нуля. Ты это описываешь в описании класса:

Инвариант Vector
1. cur_elem<count
2. cur_elem>0

Ок, теперь девелопер знает что это должно быть истинным для любого обьекта класса, что он и задает в инварианте класса:
class vectorInv {
public:
bool check(vector bI) {
if(bI.cur_elem > bI.count || bI.cur_elem < 0) return false;
}
};

И где-нибудь ты намереваешься проверить — нормален ли класс:
ASSERT(check(someObj));

Если условие не выполнено — всё, кранты — ошибка ибо нормальный код должен соответствовать контракту.
Это очень упрощенно и имхо, ещё ведь есть всякие TDD (cppUnit, Boost::Test) и т.д...

I>Что это — функция? Как она используется? И т.п.
... << А писал я этот бред на RSDN@Home 1.1.4 beta 7 rev. 447, под звуки Scorpions — Wind Of Change>>
"Всё что не убивает нас, делает нас сильнее..."
Re[2]: Что такое Инвариант?
От: Кодт Россия  
Дата: 11.05.05 19:19
Оценка: 2 (2)
Здравствуйте, Mr.Chipset, Вы писали:

MC>Отсюда:

MC>

Инвариант — это некоторое логическое условие, значение которого (истина или ложь) должно сохраняться.

MC>Приложительно к ЯП — это набор условий для класса которым должен следовать любой класс в момент вызова. Проще говоря — много инвариантов для методов класса.

Это ты не смешиваешь ли инвариант с предусловием?

Инвариант класса — это утверждение, которое (должно быть) истинно применительно к любому объекту данного класса в любой момент времени (за исключением переходных процессов в методах объекта).
Some x,y,z;

assert( SomeInvariant(x) && SomeInvariant(y) && SomeInvariant(z) );
x.do_something();
assert( SomeInvariant(x) && SomeInvariant(y) && SomeInvariant(z) );
do_something_with(y);
assert( SomeInvariant(x) && SomeInvariant(y) && SomeInvariant(z) );
interact(x,z);
assert( SomeInvariant(x) && SomeInvariant(y) && SomeInvariant(z) );

Например, инвариантом std::vector являются:
— 0<=size()<=capacity()
— все элементы в диапазоне [0;size()-1] являются живыми (сконструированными и не разрушенными) объектами

Предусловие — это утверждение, которое является требованием для начала работы (при вызове метода, при входе в блок и т.п.)
Some::method(args)
{
  assert( SomePrecondition(args && this->state && global::state) );
  .....
}

Например, предусловие std::vector::operator[](int index) — индекс должен лежать в диапазоне [0;size()-1]

Постусловие — это утверждение, истинное по окончании работы (возврат из метода, выход из блока и т.п.)
Some x;
result = x.method(args);
assert( PostCondition(result) );

Постусловие для std::vector::operator[] — результат является ссылкой на тот самый элемент (если индекс валидный).
Для std::vector::at() — либо результат это ссылка на существующий элемент, либо бросок исключения при невалидном индексе.

Естественно, что одним из постусловий является сохранение инварианта.
Перекуём баги на фичи!
Re: Что такое Инвариант?
От: _doctor Финляндия http://agilesoftwaredevelopment.com
Дата: 11.05.05 19:42
Оценка: 1 (1)
Здравствуйте, Ignoramus, Вы писали:

I>Честно несколько раз прочитал определение у Страуструпа, но смысл сего понятия от меня ускользает.

I>Пожалуйста объясните, чем являтся инвариант класса с точки зрения практического кода.
I>Что это — функция? Как она используется? И т.п.

Как говорит нам gramota.ru, инвариант — это "элемент системы, остающийся неизменным при всех ее модификациях".
Если человеческим языком, то:

У большинства классов присутствует множество членов-данных, которые периодически изменяются. В результате ошибок в программе можно наизменять такого, что объект будет представлять собой полную бессмыслицу. Функия-инвариант проверяет целостность объекта, имеет ли он смысл. Например, для объекта моделирующего человека, инвариант может проверить существование не более, чем двух рук и не более, чем трёх ног

Используется для ловли ошибок. Например в конце каждой сложной/неоднозначной функции можно вызвать инвариант, просто чтобы быть хоть немного уверенным, что объект не разрушен к чертям.
Частенько весь инвариант помещается в #ifdef _DEBUG, чтобы не включаться в финальные версии.
Chief Software Engineer,
Scrum Master, Symbian
Re: Что такое Инвариант?
От: Chez Россия  
Дата: 12.05.05 07:12
Оценка:
Здравствуйте, Ignoramus, Вы писали:

I>Честно несколько раз прочитал определение у Страуструпа, но смысл сего понятия от меня ускользает.


I>Пожалуйста объясните, чем являтся инвариант класса с точки зрения практического кода.


I>Что это — функция? Как она используется? И т.п.

MFC's CObject::AssertValid м ему подобные.

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.