Можно ли считать это утверждение классовым инвариантом?
Это очень общая мысль, но давайте использовать C# в этом примере.
При условии
- У меня одноразовый класс
Foo
реализуетIDisposable
, Foo
имеет логический флагdisposed
это ложно, покаDispose
называется, после чего это правда.- Все публичные методы
Foo
бросаетObjectDisposedException
еслиdisposed
верно, когда они называются.
Это утверждение
Любой метод
Foo
, КромеDispose
КидаюObjectDisposedException
когда вызывается на экземплярFoo
это было утилизировано.
описать инвариант Foo
?
2 ответа
Решение
Нет.
Это набор правил, общих для всех методов класса. Инварианты не являются правилами для методов.
Проектирование по контракту включает определение следующих частей контракта:
- Предварительные условия метода
- Метод постусловий
- Инвариант класса
То, что вы описываете, это метод постусловий. Они принадлежат контракту каждой функции (который, конечно, является частью контракта класса), но не относятся к инварианту класса.
Это не инвариант. Это утверждение о состоянии объекта. ИМО, то, что вы описали, это постусловие метода утилизации и постусловие всех методов.