Честно несколько раз прочитал определение у Страуструпа, но смысл сего понятия от меня ускользает.
Пожалуйста объясните, чем являтся инвариант класса с точки зрения практического кода.
Что это — функция? Как она используется? И т.п.
Здравствуйте, Ignoramus, Вы писали:
I>Честно несколько раз прочитал определение у Страуструпа, но смысл сего понятия от меня ускользает.
I>Пожалуйста объясните, чем являтся инвариант класса с точки зрения практического кода.
I>Что это — функция? Как она используется? И т.п.
здесь помоему понятно написано
Здравствуйте, 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>>
Здравствуйте, 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() — либо результат это ссылка на существующий элемент, либо бросок исключения при невалидном индексе.
Естественно, что одним из постусловий является сохранение инварианта.
Здравствуйте, Ignoramus, Вы писали:
I>Честно несколько раз прочитал определение у Страуструпа, но смысл сего понятия от меня ускользает.
I>Пожалуйста объясните, чем являтся инвариант класса с точки зрения практического кода.
I>Что это — функция? Как она используется? И т.п.
Как говорит нам gramota.ru, инвариант — это
"элемент системы, остающийся неизменным при всех ее модификациях".
Если человеческим языком, то:
У большинства классов присутствует множество членов-данных, которые периодически изменяются. В результате ошибок в программе можно наизменять такого, что объект будет представлять собой полную бессмыслицу. Функия-инвариант проверяет целостность объекта, имеет ли он смысл. Например, для объекта моделирующего человека, инвариант может проверить существование не более, чем двух рук и не более, чем трёх ног
Используется для ловли ошибок. Например в конце каждой сложной/неоднозначной функции можно вызвать инвариант, просто чтобы быть хоть немного уверенным, что объект не разрушен к чертям.
Частенько весь инвариант помещается в #ifdef _DEBUG, чтобы не включаться в финальные версии.
Здравствуйте, Ignoramus, Вы писали:
I>Честно несколько раз прочитал определение у Страуструпа, но смысл сего понятия от меня ускользает.
I>Пожалуйста объясните, чем являтся инвариант класса с точки зрения практического кода.
I>Что это — функция? Как она используется? И т.п.
MFC's CObject::AssertValid м ему подобные.
Chez, ICQ#161095094
Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent