Контракт

Контракт - правило, обеспечивающее соблюдение программой формальных требований. Является центральным понятием контрактного программирования.

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

Использование контрактов позволяет сделать программу более надежной без необходимости постоянного регрессионного тестирования - иными словами, избежать ошибок, когда после внесения изменений в программу перестает работать то, что работало ранее. В этом смысле контрактное программирование является альтернативой разработке через тестирование (test-driven development), но ничто не мешает использовать обе парадигмы одновременно - в некоторых языках (например, в D) они дополняют друг друга. Однако некоторые виды контрактов позволяют верифицировать то, что невозможно верифицировать при помощи тестов.

В основе парадигмы контрактного программирования лежит логика Хоара - способ формального доказательства корректности алгоритма. Она оперирует такими понятиями, как предусловие, постусловие и инвариант.

Виды контрактов

К контрактам также можно отнести следующие языковые конструкции: