Программист-прагматик. Путь от подмастерья к мастеру

ОглавлениеДобавить в закладки К обложке

Упражнение 15 из раздела "Проектирование по контракту"

Ответ: Это неудачно. Математическое действие в индексном выражении (index-1) не будет работать с граничными условиями, подобными первой точке входа. Постусловие предполагает определенную реализацию; контракты должны быть более абстрактными по сравнению с указанным выше.

Упражнение 16 из раздела "Проектирование по контракту"

Ответ 16: Это удачный контракт, но неудачная реализация. Здесь высовывает свою уродливую голову ошибка типа "Heisenbug" [URL52]. Вероятно, программист допустил опечатку – набрал pop вместо top. Хотя это простой и надуманный пример, весьма трудно диагностировать побочные эффекты в утверждениях (или в любом, самом неожиданном месте в программе).

Упражнение 17 из раздела "Проектирование по контракту"

Ответ: Мы продемонстрируем функциональные сигнатуры на языке 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()

Упражнение 18 из раздела "Проектирование по контракту"

Ответ: В этом ряду содержится 21 число. Если вы ответили «20», то допустили так называемую ошибку "поста охраны".

Упражнение 19 из раздела "Программирование утверждений"

Ответ:

1. В сентябре 1752 г. было всего лишь 19 дней. Это было сделано с целью синхронизации при переходе с юлианского на григорианский календарь.

2. Каталог мог быть удален другим процессом, у вас нет прав доступа на его чтение, выражение &sb может быть недопустимым – вы все уловили.

3. Мы проявили малодушие, не указав типов а и b. Во время перегрузки операторов могло случиться так, что поведение знаков +, =, или != стало непредсказуемым. Кроме того, а и b могут быть псевдонимами одной и той же переменной, так что при втором присвоении произойдет перезапись значения, сохраненного во время первого.

4. В неевклидовой геометрии сумма углов треугольника не будет составлять 180°. Подумайте о треугольнике, отображаемом на поверхности сферы.

5. Минуты, приходящиеся на високосный год, могут состоять из 61 или 62 секунд.

6. Переполнение может оставить результат операции а+1 отрицательным (это также может произойти в языках С и С++).

Упражнение 20 из раздела "Программирование утверждений"

Ответ: Мы решили реализовать очень простой класс с единственным статическим методом 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") ,

  }

 }

}

Упражнение 21 из раздела "Случаи, когда используются исключения"

Ответ: Нехватка памяти является исключительным состоянием, поэтому мы полагаем, что в случае (1) должно возбуждаться исключение.


Логин
Пароль
Запомнить меня