В широком смысле контракт в программировании — это обещание, договорённость.
В контракте участвуют как минимум две стороны.
Контракт функции — это обещание достигнуть определённой цели. Одна сторона такого контракта — сама функция, другая — код, который эту функцию вызывает. Вызывающий код — пользователь функции, он пользуется результатом её работы. Вызывающему коду нужны функции, потому что функция знает, как достичь нужного результата, а вызывающий код не знает. Это суть separation of concerns: мы не обязаны сами знать всё; за решением вопросов, в которых мы не компетентны, мы обращаемся к соответствующим специалистам. Текст контракта короткий — это название функции плюс параметры функции (если есть) плюс возвращаемое значение (если есть); эта связка называется сигнатурой функции.
В идеале смысл контракта должен быть однозначно понятен по его тексту (названию функции и параметров, типам параметров и возвращаемого значения), однако это бывает крайне редко; поэтому нам всё ещё нужна документация — чтобы там были описаны все нюансы получаемого результата (а также требования к входным данным). Кстати, развитость языка программирования заключается как раз в способности выразить договорённости, содержащиеся в контракте, непосредственно в коде программы в виде формальных конструкций.
К контракту функции не относится реализация — это полностью личное внутреннее дело функции. Реализация функции может как угодно изменяться, если это не нарушает контракта.
Контракт класса сложнее, он включает в себя не отдельный результат, а серию взаимосвязанных результатов. Взаимосвязанные результаты я называю умением. Контракт класса так же заключается между самим классом и кодом, который использует его в своих целях.
Для переменных есть свои контракты. Контракт переменной оговаривает, для каких целей следует использовать её содержимое (соответственно, для всех остальных — не следует). Как и для функции, текст контракта переменной — в её названии, вот почему точность названия переменной предельно важна.
Разумеется, полное формальное определение контракта сложнее.
Смотри также: