Можно ли считать это утверждение классовым инвариантом?

Это очень общая мысль, но давайте использовать C# в этом примере.

При условии

  • У меня одноразовый класс Foo реализует IDisposable,
  • Foo имеет логический флаг disposed это ложно, пока Dispose называется, после чего это правда.
  • Все публичные методы Foo бросает ObjectDisposedException если disposed верно, когда они называются.

Это утверждение

Любой метод Foo, Кроме Dispose Кидаю ObjectDisposedException когда вызывается на экземпляр Foo это было утилизировано.

описать инвариант Foo?

2 ответа

Решение

Нет.

Это набор правил, общих для всех методов класса. Инварианты не являются правилами для методов.

Проектирование по контракту включает определение следующих частей контракта:

  • Предварительные условия метода
  • Метод постусловий
  • Инвариант класса

То, что вы описываете, это метод постусловий. Они принадлежат контракту каждой функции (который, конечно, является частью контракта класса), но не относятся к инварианту класса.

Это не инвариант. Это утверждение о состоянии объекта. ИМО, то, что вы описали, это постусловие метода утилизации и постусловие всех методов.

Другие вопросы по тегам