D - Контрактное программирование

Контрактное программирование в программировании на языке D ориентировано на предоставление простых и понятных средств обработки ошибок. Контрактное программирование в D реализовано тремя типами кодовых блоков:

  • блок тела
  • в блоке
  • из блока

Блок тела в D

Блок тела содержит фактический функциональный код выполнения. Блоки входа и выхода являются необязательными, а блок тела - обязательным. Ниже показан простой синтаксис.

return_type function_name(function_params) 
in { 
   // in block 
} 

out (result) { 
   // in block 
}
 
body { 
   // actual function block 
}

В блоке для предварительных условий в D

Блок In предназначен для простых предварительных условий, которые проверяют, приемлемы ли входные параметры и находятся ли они в диапазоне, который может быть обработан кодом. Преимущество блока in заключается в том, что все условия входа могут храниться вместе и отдельно от фактического тела функции. Ниже показано простое предварительное условие для проверки пароля на его минимальную длину.

import std.stdio; 
import std.string;
  
bool isValid(string password) 
in { 
   assert(password.length>=5); 
}
 
body { 
   // other conditions 
   return true; 
}
  
void main() { 
   writeln(isValid("password")); 
}

Когда приведенный выше код компилируется и выполняется, он считывает файл, созданный в предыдущем разделе, и дает следующий результат:

true

Выходные блоки для условий публикации в D

Блок out заботится о значениях, возвращаемых функцией. Он подтверждает, что возвращаемое значение находится в ожидаемом диапазоне. Ниже показан простой пример, содержащий как in, так и out, который преобразует месяцы и год в комбинированную десятичную форму возраста.

import std.stdio;
import std.string;

double getAge(double months,double years) 
in { 
   assert(months >= 0); 
   assert(months <= 12); 
}
 
out (result) { 
   assert(result>=years); 
} 

body { 
   return years + months/12; 
} 
 
void main () { 
   writeln(getAge(10,12)); 
}

Когда приведенный выше код компилируется и выполняется, он считывает файл, созданный в предыдущем разделе, и дает следующий результат:

12.8333