Контрактное программирование в языке D сосредоточено на предоставлении простых и понятных средств обработки ошибок. Контрактное программирование в D реализуется тремя типами блоков кода:
Блок body содержит фактический исполняемый код. Блоки in и out являются необязательными, а блок body является обязательным. Ниже приведён простой синтаксис.
возвращаемый_тип имя_функции(параметры_функции) in { // блок in } out (result) { // блок out } body { // фактический блок функции }
Блок in используется для простых предварительных условий, в которых проверяется, допустимы ли входные параметры и находятся ли они в пределах того диапазона, который может обрабатываться кодом. Преимущество блока in в том, что все входные условия могут храниться вместе и отделяются от фактического тела функции. Ниже приведено простое предусловие для проверки пароля на минимальную длину.
import std.stdio; import std.string; bool isValid(string password) in { assert(password.length>=5); } body { // другие условия return true; } void main() { writeln(isValid("пароль")); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
true
Блок 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