Учебники

D — Программирование контракта

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

  • блок кузова
  • в блоке
  • вне блока

Блок кузова в D

Блок body содержит актуальный код функциональности исполнения. Блоки in и out являются необязательными, а блок body — обязательным. Простой синтаксис показан ниже.

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

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

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

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

Live Demo

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 заботится о возвращаемых значениях из функции. Это подтверждает, что возвращаемое значение находится в ожидаемом диапазоне. Ниже показан простой пример, содержащий как вход, так и выход, который преобразует месяцы, год в комбинированную десятичную возрастную форму.

Live Demo

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)); 
} 

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