Можно ли считать это утверждение классовым инвариантом? - PullRequest
3 голосов
/ 02 декабря 2011

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

Учитывая, что

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

Делает это утверждение

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

описывает инвариантиз Foo?

Ответы [ 2 ]

2 голосов
/ 05 января 2012

номер

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

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

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

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

0 голосов
/ 05 июля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...