Как определить инвариант в классе в java? - PullRequest
0 голосов
/ 07 февраля 2020

Я понимаю, что такое Инвариант, но проблема в том, чтобы определить его по классу. плохо объясняю - когда учитель в классе показывает нам код java и спрашивает нас, что такое инвариант, - вот когда я падаю, я не знаю, чтобы идентифицировать его.

снова - я знаю, что это такое - просто иметь возможность идентифицировать это. Если вы можете объяснить или дать мне совет, как это сделать, я буду рад услышать. благодарю вас.

отредактировано: добавлено изображение примера. что является здесь инвариантом, но для меня важно ПОЧЕМУ.

picture

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

К сожалению, не существует систематического c способа посмотреть на кусок кода и отработать его инварианты. Один из методов - подумать о том, что состояние экземпляра может быть недействительным, а затем проверить, что это не может произойти; в этом случае каждое правило для того, что делает состояние «действительным», является инвариантом. Но для этого вам нужно использовать интуицию и опыт.

Для вашего примера у этого класса есть два инварианта:

  • Стек содержит только целые числа в диапазоне от 1 до 10 включительно.
  • Элементом в нижней части стека является целое число 5.

Нетрудно убедиться, что конструктор устанавливает оба инварианта, а метод addCard сохраняет их:

  • Конструктор добавляет только число 5, находящееся в диапазоне, а addCard добавляет числа в стек только в том случае, если они находятся в пределах диапазона.
  • Числа никогда не удаляются из стека. и числа добавляются только в верхней части стека, поэтому 5 в нижней части стека (который помещает туда конструктор) останутся в нижней части стека.

Это Важно отметить, что конструктор и метод addCard являются единственными двумя способами изменения состояния экземпляра или его стека, поэтому нам не нужно проверять, сохраняет ли какой-либо другой код i nvariants. Если бы стек не был private, тогда он был бы другим; другой код мог бы поместить числа в стек вне допустимого диапазона (или null), или другой код мог бы удалить 5 из нижней части стека.

0 голосов
/ 07 февраля 2020

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

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