Полный ответ вместо того, чтобы сбрасывать его в комментарии.
Почему мне не следует использовать утверждения для проверки аргументов в общедоступных методах?
Утверждения, основанные на assert
, можно отключить с помощью флага JVM. Следовательно, невозможно гарантировать, что утверждения действительно будут выполняться, когда ваши пользователи запускают ваш код. Вот почему плохо давать обещания выдавать ошибки проверки в вашем API, если вы на самом деле не можете гарантировать, что это произойдет. Таким образом, вы позволяете своим пользователям звонить вам с недопустимыми параметрами, не вызывая исключений, чтобы предупредить их. Вместо этого вы должны использовать исключения времени выполнения.
Тогда почему его можно использовать для постусловий в публичных методах?
В приведенном вами документе определяются предварительные и постусловия следующим образом:
Предварительные условия — что должно быть правдой при вызове метода. Постусловия — что должно быть истинным после успешного завершения метода.
Вы можете видеть, что предварительные условия зависят от вызывающего, а постусловия зависят от вызываемого. Если предварительные условия были выполнены, единственная причина, по которой постусловие может не выполниться, заключается в том, что код в методе содержит ошибки. Это не ошибка пользователя, это проблема самой библиотеки. Я предполагаю, что именно поэтому документ считает менее проблематичным в конечном итоге отключить утверждения пост-условий.
Я не уверен, что я лично согласен, потому что, если пост-условия не выполняются, это, вероятно, означает, что контракт метода был нарушен, и выполнение должно быть остановлено. Зависит от того, насколько критическим было постсостояние. Авторы API могут захотеть проверить, является ли какое-либо соотношение оптимальным для производительности в конце изменения размера динамического массива, но не обязательно создавать исключение, если это не так, поскольку программа все равно будет вести себя так, как ожидалось, даже при неоптимальном соотношении.
person
Dici
schedule
12.11.2017