Предварительное условие
Эта статья в значительной степени или полностью опирается на один источник . ( сентябрь 2010 г. ) |
В компьютерном программировании предусловие , — это условие или предикат который всегда должен быть истинным непосредственно перед выполнением некоторого раздела кода или перед операцией в формальной спецификации .
Если предварительное условие нарушено, эффект раздела кода становится неопределенным и, таким образом, может выполнять или не выполнять запланированную работу. Предварительные условия, которые отсутствуют, недостаточны или формально не доказаны (или имеют неправильную попытку доказательства) или не проверяются статически или динамически, могут привести к проблемам безопасности , особенно в небезопасных языках, которые не являются строго типизированными.
Часто предварительные условия просто включаются в документацию затронутого раздела кода. Предварительные условия иногда проверяются с использованием защитных мер или утверждений внутри самого кода, и в некоторых языках для этого предусмотрены специальные синтаксические конструкции.
Пример [ править ]
Функция факториала определяется только в том случае, если ее параметром является целое число, большее или равное нулю. Таким образом, реализация функции факториала будет иметь предварительное условие, чтобы ее параметр был целым числом и чтобы этот параметр был больше или равен нулю. В качестве альтернативы можно использовать систему типов языка, чтобы указать, что параметром функции факториала является натуральное число (целое число без знака), которое может быть формально проверено автоматически с помощью средства проверки типов компилятора.
Кроме того, если числовые типы имеют ограниченный диапазон (как в большинстве языков программирования), предварительное условие должно также указывать максимальное значение, которое может иметь параметр, чтобы не произошло переполнение. (например, если реализация факториала возвращает результат в виде 64-битного целого числа без знака, тогда параметр должен быть меньше 21, поскольку факториал(21) больше максимального целого числа без знака, которое может быть сохранено в 64 битах). Если язык поддерживает подтипы диапазонов (например, Ada ), такие ограничения могут автоматически проверяться системой типов. Более сложные ограничения можно формально проверить в интерактивном режиме с помощью помощника по доказательству .
В объектно-ориентированном программировании [ править ]
Предварительные условия в объектно-ориентированной разработке программного обеспечения являются важной частью контрактного проектирования . Проектирование по контракту также включает в себя понятия постусловия и инварианта класса .
Предварительное условие для любой процедуры определяет любые ограничения на состояние объекта, необходимые для успешного выполнения. С точки зрения разработчика программы, это составляет часть контракта, касающуюся вызывающей программы. Затем вызывающая сторона обязана убедиться, что предварительное условие выполняется перед вызовом подпрограммы. Награда за усилия вызывающей стороны выражается в постусловии вызываемой процедуры . [1]
Пример Эйфелевой [ править ]
Процедура в следующем примере, написанная на Eiffel, принимает в качестве аргумента целое число, которое должно быть допустимым значением для часа дня, т. е. от 0 до 23 включительно. Предварительное условие следует за ключевым словом require
. Он указывает, что аргумент должен быть больше или равен нулю и меньше или равен 23. Тег " valid_argument:
" описывает это предварительное условие и служит для его идентификации в случае нарушения предварительного условия во время выполнения.
set_hour ( a_hour : INTEGER )
— Установите для `hour' значение `a_hour'
require
valid_argument : 0 <= a_hour и a_hour <= 23
dohour
: = a_hour
убедитесь,
чтоhour_set : hour = a_hour
end
Предварительные условия и наследование [ править ]
При наличии наследования подпрограммы, унаследованные классами-потомками (подклассами), делают это с действующими предварительными условиями. Это означает, что любые реализации или переопределения унаследованных подпрограмм также должны быть написаны в соответствии с их унаследованным контрактом. Предварительные условия можно изменить в переопределенных процедурах, но их можно только ослабить. [2] То есть переопределенный распорядок дня может уменьшить обязательства клиента, но не увеличить их.
См. также [ править ]
- Проектирование по договору
- Охранник (информатика)
- Постусловие
- логика Хоара
- Инварианты, поддерживаемые условиями
- Триггер базы данных
Ссылки [ править ]
- ^ Мейер, Бертран , Объектно-ориентированное создание программного обеспечения , второе издание, Prentice Hall , 1997, стр. 342.
- ^ Мейер, 1997, стр. 570–573.