Редактирование: Программирование по контракту

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 17: Строка 17:
 
== Пример ==
 
== Пример ==
 
Необходимо гарантировать, что функции данного класса будут возвращать корректные данные, либо, вообще не будут работать.
 
Необходимо гарантировать, что функции данного класса будут возвращать корректные данные, либо, вообще не будут работать.
   public class Time {
+
   class Time {
     private int hours;
+
     int hours;
     private int minutes;
+
     int minutes;
     private int seconds;
+
     int seconds;
     public int getHours();
+
     int getHours();
 
     {
 
     {
 
         return hours;
 
         return hours;
 
     }     
 
     }     
     public int getMinutes();
+
     int getMinutes();
 
     {
 
     {
 
         return minutes;
 
         return minutes;
 
     }
 
     }
     public int getSeconds()
+
     int getSeconds()
 
     {
 
     {
 
         return seconds;
 
         return seconds;
 
     }
 
     }
     public void setHours(int newHOURS);
+
     void setHours(int newHOURS);
 
     {
 
     {
 
         hours = newHOURS;
 
         hours = newHOURS;
 
     }
 
     }
     public void setMinutes(int newMINUTES);
+
     void setMinutes(int newMINUTES);
 
     {
 
     {
 
         minutes = newMINUTES;
 
         minutes = newMINUTES;
 
     }
 
     }
     public void setSeconds(int newSECONDS)
+
     void setSeconds(int newSECONDS)
 
     {
 
     {
 
         seconds = newSECONDS;
 
         seconds = newSECONDS;
Строка 48: Строка 48:
 
Инвариант:  
 
Инвариант:  
  
hours >= 0 and hours <= 23  
+
<tex> hours >= 0 </tex> <tex> and</tex> <tex> hours <= 23 </tex>
  
minutes >= 0 and minutes < 60
+
<tex> minutes >= 0 </tex> <tex> and</tex> <tex> minutes < 60 </tex>
  
seconds >= 0 and seconds < 60  
+
<tex> seconds >= 0 </tex> <tex> and</tex> <tex> seconds < 60 </tex>
  
 
Постусловия и предусловия:
 
Постусловия и предусловия:
  
 +
<tex>int</tex> <tex> getHours() </tex>
  
int getHours()
+
<tex>post:</tex>  возвращенное значение будет являться текущим часом.
post: возвращенное значение будет являться текущим часом.
 
  
 +
<tex>int</tex> <tex> getMinutes() </tex>
  
int getMinutes()
+
<tex>post:</tex>  возвращенное значение будет являться текущей минутой.
post: возвращенное значение будет являться текущей минутой.
 
  
 +
<tex>int</tex> <tex> getSeconds() </tex>
  
int getSeconds()
+
<tex>post:</tex>  возвращенное значение будет являться текущей секундой.
post: возвращенное значение будет являться текущей секундой.
 
  
 +
<tex> void </tex> setHours(int newHours)
  
void setHours(int newHours)
+
<tex> pre: </tex> 0 <= newHours <= 23
pre: 0 <= newHours <= 23
 
post: hours == newHours
 
  
 +
<tex> post: </tex> hours == newHours
  
void setMinutes(int newMinutes)
+
<tex> void </tex> setMinutes(int newMinutes)
pre: 0 <= newMinutes < 60
 
post: minutes == newMinutes
 
  
 +
<tex> pre: </tex> 0 <= newMinutes < 60
  
void setSeconds(int newSeconds)
+
<tex> post: </tex> minutes == newMinutes
pre: 0 <= newSeconds < 60
 
post: seconds == newSeconds
 
  
 +
<tex> void </tex> setSeconds(int newSeconds)
 +
 +
<tex> pre: </tex> 0 <= newSeconds < 60
 +
 +
<tex> post: </tex> seconds == newSeconds
 +
 +
Постусловие: (например для getHours()) возвращенное значение будет являться текущим часом.
 
==== Решение 1 ====
 
==== Решение 1 ====
 
Выбрасывать исключение. Имеет недостатки: неочевидность проверки, необходимость писать кучу кода вручную.
 
Выбрасывать исключение. Имеет недостатки: неочевидность проверки, необходимость писать кучу кода вручную.
   void setHours(int newHours){
+
   void getHours(newHours){
 
         if (newHours < 0 || newHours > 23)  
 
         if (newHours < 0 || newHours > 23)  
 
             throw GREAT_Time_Exception;
 
             throw GREAT_Time_Exception;
        hours = newHours;
+
        return hours;
 
   }
 
   }
  
Строка 95: Строка 99:
 
   @Contracted // говорит о том, что класс использует контракты – для отображения в IDE
 
   @Contracted // говорит о том, что класс использует контракты – для отображения в IDE
 
   class Time
 
   class Time
   {  
+
   {
     void setHours(int newHours);
+
     @Ensures ({“result >= 0”,“result <= 23” })
 +
    int getHours();
 
     {
 
     {
         hours = newHours;
+
         return HOURS;
 
     }
 
     }
 
     @Requires ({“newHOURS>= 0”,“newHOURS<= 23” })
 
     @Requires ({“newHOURS>= 0”,“newHOURS<= 23” })
     @Ensures (“hours == newHOURS”)
+
     @Ensures (“HOURS == newHOURS”)
 
   }
 
   }
 
@Requires – буквально означает, «Убедиться, что ДО выполнения подпрограммы («условие выполняется»)» Иначе – бросить исключение.
 
@Requires – буквально означает, «Убедиться, что ДО выполнения подпрограммы («условие выполняется»)» Иначе – бросить исключение.
Строка 127: Строка 132:
  
 
<tex> isEmpty - </tex> проверка на пустоту
 
<tex> isEmpty - </tex> проверка на пустоту
 
public class ArrayStack {
 
  private int size = 0;
 
  private Object[] elements = new Object[2];
 
  public void push(Object element){
 
      assert element != null;
 
      ensureCapacity(size + 1);
 
      elements[size++] = element;
 
  }
 
  private void ensureCapacity(int capacity) {
 
    if (capacity <= elements.length) {
 
        return;
 
    }
 
    Object[] newElements = new Object[2 * capacity];
 
    for (int i = 0; i < size; i++) {
 
        newElements[i] = elements[i];
 
    }
 
    elements = newElements;
 
  }
 
  public Object pop() {
 
    assert size > 0;
 
    return elements[--size];
 
  }
 
  public int size() {
 
    return size;
 
  }
 
  public boolean isEmpty() {
 
    return size == 0;
 
  }
 
  public Object peek() {
 
    assert size > 0;
 
    return elements[size - 1];
 
  }
 
}
 
  
 
Инвариант:
 
Инвариант:
Строка 170: Строка 141:
 
Контракты:
 
Контракты:
  
push
+
<tex>push </tex>
pre: element != NULL  
+
 
post: size = size' + 1  and   elements[size'] == element
+
<tex>pre: element != NULL </tex>
void push (Object  element)  
+
 
 +
<tex>post: size = size' + 1</tex> <tex> and </tex> <tex>  elements[size'] == element </tex>
 +
 
 +
<tex> void</tex> <tex> push (Object</tex> <tex> element) </tex>
 +
 
 +
 
 +
<tex> pop:</tex>
 +
 
 +
<tex> pre: size > 0 </tex>
 +
 
 +
<tex>post: size == size' - 1</tex> <tex> and </tex> <tex>result == elements[size]</tex>
 +
 
 +
<tex> Object</tex> <tex> pop() </tex>
 +
 
 +
 
 +
 
 +
<tex> peek:</tex>
 +
 
 +
<tex>pre: size > 0</tex>
 +
 
 +
<tex>post: result == elements[size - 1]</tex>
 +
 
 +
<tex> Object</tex> <tex> peek() </tex>
 +
 
 +
 
 +
<tex> size:</tex>
 +
 
 +
<tex>post: result == size </tex>
 +
 
 +
<tex>int</tex> <tex> size()</tex>
  
pop
 
pre: size > 0
 
post: size == size' - 1 and result == elements[size]
 
Object pop()
 
  
peek
+
<tex>isEmpty:</tex>
pre: size > 0
 
post: result == elements[size - 1]
 
Object peek()
 
  
size
+
<tex>post: result == size > 0</tex>
post: result == size  
 
int size()
 
  
isEmpty
+
<tex>boolean</tex> <tex>isEmpty() </tex>
post: result == size > 0
 
boolean isEmpty()
 

Пожалуйста, учтите, что любой ваш вклад в проект «Викиконспекты» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Викиконспекты:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Чтобы изменить эту страницу, пожалуйста, ответьте на приведённый ниже вопрос (подробнее):

Отменить | Справка по редактированию (в новом окне)

Шаблон, используемый на этой странице: