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