Шрифт:
Ответ: Мы продемонстрируем функциональные сигнатуры на языке Java, обозначая предусловия и постусловия в соответствии с iContract. Сначала инвариант для класса:
/**
* @invariant getSpeed >0
* implies isFull // Не запускать пустое
* @invariant getSpeed>=0 &&
* getSpeed <10 // Проверка границ
*/
Затем предусловия и постусловия:
/**
* @pre Math.abs(getSpeed – х) <= 1 // Единственный выбор
* @рге х>= 0 && х > 10 // Проверка границ
* @post getSpeed == х // Проверка скорости
*/
public void setSpeed (final int x)
/**
* @pre !isFull // Heзаполнять дважды
* @post isFull // Убедитесь, что было выполнено
*/
void fill
/**
* @pre isFull // He очищатьдважды
* @post !isFull // Убедиться, что выполнено
*/
void empty
Ответ: В этом ряду содержится 21 число. Если вы ответили «20», то допустили так называемую ошибку "поста охраны".
Ответ:
1. В сентябре 1752 г. было всего лишь 19 дней. Это было сделано с целью синхронизации при переходе с юлианского на григорианский календарь.
2. Каталог мог быть удален другим процессом, у вас нет прав доступа на его чтение, выражение &sb может быть недопустимым – вы все уловили.
3. Мы проявили малодушие, не указав типов а и b. Во время перегрузки операторов могло случиться так, что поведение знаков +, =, или != стало непредсказуемым. Кроме того, а и b могут быть псевдонимами одной и той же переменной, так что при втором присвоении произойдет перезапись значения, сохраненного во время первого.
4. В неевклидовой геометрии сумма углов треугольника не будет составлять 180°. Подумайте о треугольнике, отображаемом на поверхности сферы.
5. Минуты, приходящиеся на високосный год, могут состоять из 61 или 62 секунд.
6. Переполнение может оставить результат операции а+1 отрицательным (это также может произойти в языках С и С++).
Ответ: Мы решили реализовать очень простой класс с единственным статическим методом TEST, который выводит на печать сообщение и след стека, если переданный параметр condition является ложным.
package com.pragprog.util;
import java.lang.System; //для exit
import java.lang.Thread; //для dumpStack
public class Assert {
/** Write a message, print a stack trace and exit if
* our parameter is false.
*/
public static void TEST(boolean condition) {
if (Icondition) {
System.out.println("==Assertion Failed==");
Thread.dumpStack;
System.exit(1);
}
}
// Testbed. If our argument is 'okay', try an assertion that
// succeeds, if 'fail' try one that fails
public static final void main(String args[]) {
if (args[0].compareTo("okay") == 0) {
TEST(1 == 1);
}
else if (args[0].compareTo("fail") == 0) {
TEST(1 == 2);
}
else {
throw new RuntimeException("Bad argument") ,
}
}
}
Ответ: Нехватка памяти является исключительным состоянием, поэтому мы полагаем, что в случае (1) должно возбуждаться исключение.
Невозможность отыскания точки входа – вполне нормальная ситуация. Приложение, которое вызывает наш класс-набор, может написать программу, которая проверяет наличие точки входа, перед тем как добавить потенциальный дубликат. Мы полагаем, что в случае (2) нужно просто осуществить возврат ошибки.
Случай (3) более проблематичен – если указатель null играет существенную роль в приложении, его добавление к контейнеру может быть оправдано. Но если для хранения пустых значений нет веских оснований, то, по всей вероятности, необходимо возбудить исключительную ситуацию.