К сожалению, не существует систематического c способа посмотреть на кусок кода и отработать его инварианты. Один из методов - подумать о том, что состояние экземпляра может быть недействительным, а затем проверить, что это не может произойти; в этом случае каждое правило для того, что делает состояние «действительным», является инвариантом. Но для этого вам нужно использовать интуицию и опыт.
Для вашего примера у этого класса есть два инварианта:
- Стек содержит только целые числа в диапазоне от 1 до 10 включительно.
- Элементом в нижней части стека является целое число 5.
Нетрудно убедиться, что конструктор устанавливает оба инварианта, а метод addCard
сохраняет их:
- Конструктор добавляет только число 5, находящееся в диапазоне, а
addCard
добавляет числа в стек только в том случае, если они находятся в пределах диапазона. - Числа никогда не удаляются из стека. и числа добавляются только в верхней части стека, поэтому 5 в нижней части стека (который помещает туда конструктор) останутся в нижней части стека.
Это Важно отметить, что конструктор и метод addCard
являются единственными двумя способами изменения состояния экземпляра или его стека, поэтому нам не нужно проверять, сохраняет ли какой-либо другой код i nvariants. Если бы стек не был private
, тогда он был бы другим; другой код мог бы поместить числа в стек вне допустимого диапазона (или null
), или другой код мог бы удалить 5 из нижней части стека.