Pull to refresh

Comments 8

Спасибо за интересную статью.
В этом напралении остаётся большой потенциал для роста. Например, нетривиальные ограничения на параметры метода хорошо бы сделать видимыми для программиста, его использующего (без анализа исходного кода). Если это делать вручную в комментариях, нет гарантии что проверка имплементирована и имплементирована правильно.
Просто брошенные Exceptions при нетривиальных проверках также могут быть малоинформативны.
А есть ли системы формальной верификации, поддерживающие данные контракты? То есть, например, что бы по коду с контрактами можно было сгенерировать задание для SMT-солвера, которое ищет нарушение контракта?

"По сути, условия быстро перестают работать. Нет смысла запускать код, если в конце, вычисление завершится неудачно из-за неправильного предположения."


Я бы сказал не "условия перестают работать", они все таки не перестают.
А "условия прерывают работу".


Спасибо за перевод

Заинтересовавшимся программированием по контракту рекомендую почитать статьи Сергея Теплакова здесь.

Ведь очень многое можно проверять статически и заставлять вызывающего программиста убеждаться в правильности параметров вызова. Когда уже до этого дойдет научная мысль встроить более жесткие контракты прямо на уровень объявления методов, а не рандомными падениями в проде при неверных данных.

Статья интересная, но меня немного смутил последний пример (я не пишу на котлине, хотя немного тыкал его):


    require(amount <= BigDecimal.ZERO)
    require(source.getBalance() <= BigDecimal.ZERO)

Мне кажется что логичнее было бы использовать >= вместо <=. Я, как человек не знающий как реализована функция require(), прочитал это как "требуется чтобы сумма была меньше или равна нулю, и чтобы баланс переводящего был меньше или равен нулю".
Как по мне, поведение классической функции assert() является более логичным.

Sign up to leave a comment.

Articles