Spec # - это популярный исследовательский проект Microsoft , который допускает некоторые конструкции DBC, такие как проверка после и предварительных условий. Например, двоичный поиск может быть реализован с предварительными и последующими условиями вместе с инвариантами цикла. Этот пример и другие:
public static int BinarySearch(int[]! a, int key)
requires forall{int i in (0: a.Length), int j in (i: a.Length); a[i] <= a[j]};
ensures 0 <= result ==> a[result] == key;
ensures result < 0 ==> forall{int i in (0: a.Length); a[i] != key};
{
int low = 0;
int high = a.Length - 1;
while (low <= high)
invariant high+1 <= a.Length;
invariant forall{int i in (0: low); a[i] != key};
invariant forall{int i in (high+1: a.Length); a[i] != key};
{
int mid = (low + high) / 2;
int midVal = a[mid];
if (midVal < key) {
low = mid + 1;
} else if (key < midVal) {
high = mid - 1;
} else {
return mid; // key found
}
}
return -(low + 1); // key not found.
}
Обратите внимание, что использование языка Spec # дает проверку времени компиляции для конструкций DBC, что, на мой взгляд, является лучшим способом использовать преимущества DBC. Часто полагаться на утверждения во время выполнения становится головной болью в производственном процессе, и люди обычно решают использовать вместо этого исключения .
Существуют другие языки , которые принимают концепции DBC как конструкции первого класса, а именно Eiffel , который также доступен для платформы .NET.