Выбрать главу

sub arrayType() {

  my ($name, $type, $size) = @_;

  print « $type $name\[$size];\n":

}

sub simpleType{) {

  my ($name, $type) = @_;

  print « $type $пате;\п";

}

1;

А вот генератор текста на языке Pascaclass="underline"

#!/usr/bin/perl – w

package CG;

use strict;

# Code generator for 'Pascal' (see cg_base.pl)

sub blankLine() {print «V;)

sub comment() {print «{$_[0] }\n";)

sub startMsg()  {print «$_[0] = packed record\n"; }

sub endMsg()   {print «end;\n\n"; }

sub arrayType() {

  my ($name, $type, $size) = @_;

  $size--;

  print» $name: array[0…$size] of $type;\n";

)

sub simpleType() {

  my ($name, $type) = @_;

  print» $name: $type;\n7 ',

}

1;

Упражнение 14 из раздела «Проектирование по контракту»

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

Упражнение 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[]) {