Да. Или если посмотреть немного с другого угла и воспользоваться другими словами, то то же постусловие - это синоним слова "цель".
Постусловие - это цель, которой должен достичь участок кода, к написанию которого мы сейчас готовимся. Цель нашего участка кода в конечном счёте диктуется характеристиками той программы, разработку которой нам поручили. В свою очередь, цель любой мало-мальски полезной программы - автоматизация. То есть, мы пишем участок кода программы, которая автоматизирует ряд действий в какой-то области. Назовём эту область предметной. И инвариант - это крупица предметной области.
Языки общего назначения - ада, лисп, оберон, си и т.д. - имеют различия по ряду признаков. Но и кое-что общее у них есть. А именно - в их синтаксисе нет элеметнов предметных областей. Всех предметных областей. Но зато есть кирпичики, из которых эти элементы можно построить. Таким образом, в коде программы на языке общего назначения сущности предметной области представлены идиоматически. И то же ООП такое популярное именно потому, что даёт очень удобно представлять идиомы. Но даже ООП не решает всех проблем. Например, нет гарантий, что метод вызывается в нужное время. Или что ему переданы правильные параметры.
Программист лишь в своей голове может прокрутить все ситуации и все условия. Язык за него это не сделает. Максимум, что может быть в языке - синтаксически отведённое место для того же постусловия. Теряется гибкость, но зато голове не приходится тратить калории на поиск подходящего места, и она может заняться более важным делом - собственно постусловием. И когда до собственно постусловий и инвариантов доходит, то ни эйфиль, ни плюсы друг от друга сильно не отличаются.
Есть пару замечаний: 1. Всё выше сказанное касалось только языков общего назначение. Предметно ориентированные языки - это отдельная тема. По-хорошему, там тоже не должно быть синтаксической поддержки постусловий, предусловий и инвариантов - всё уже запаковано внутрь. Но я всех предметных языков не видел, поэтому допускаю, что где-то такие конструкции будут к месту. 2. Алгебраические типы данных и т.п. отчасти решают проблему инвариантов. Но только если они реализованы под конкретную задачу. А если их нужно реализовать, то мы снова сталкиваемся с изначальной проблемой. 3. Поскольку одну и ту же задачу иногда можно решить разными способами (исходя, например, из того, чем мы готовы платить: временем или местом), то постусловие, предусловие и инвариант тоже будут отличаться. Но сумма всех постусловий для программы всё равно приведёт к программе, которая будет решать поставленную задачу. То есть, немного различающиеся наборы "крупиц" способны покрывать одну и ту же предметную область.
|