Проверка предусловия и постусловия в публичных методах

Я читал документацию Oracle об использовании ключевое слово assert для проверки предварительных и постусловий метода.

В документе говорится, что можно использовать ключевое слово assert для проверки постусловий для методов public, но вы должны использовать ключевое слово assert только для проверки предварительных условий для методов private.

Почему это?


person Ogen    schedule 12.11.2017    source источник
comment
Можете ли вы поделиться источником?   -  person assylias    schedule 13.11.2017
comment
Это было где-то здесь: docs.oracle.com/ javase/7/docs/technotes/guides/language/   -  person Ogen    schedule 13.11.2017
comment
Хотя написано Java 7, текст явно старше. Для другого представления: stackoverflow.com/a/37605954/829571   -  person assylias    schedule 13.11.2017


Ответы (2)


Полный ответ вместо того, чтобы сбрасывать его в комментарии.

Почему мне не следует использовать утверждения для проверки аргументов в общедоступных методах?

Утверждения, основанные на assert, можно отключить с помощью флага JVM. Следовательно, невозможно гарантировать, что утверждения действительно будут выполняться, когда ваши пользователи запускают ваш код. Вот почему плохо давать обещания выдавать ошибки проверки в вашем API, если вы на самом деле не можете гарантировать, что это произойдет. Таким образом, вы позволяете своим пользователям звонить вам с недопустимыми параметрами, не вызывая исключений, чтобы предупредить их. Вместо этого вы должны использовать исключения времени выполнения.

Тогда почему его можно использовать для постусловий в публичных методах?

В приведенном вами документе определяются предварительные и постусловия следующим образом:

Предварительные условия — что должно быть правдой при вызове метода. Постусловия — что должно быть истинным после успешного завершения метода.

Вы можете видеть, что предварительные условия зависят от вызывающего, а постусловия зависят от вызываемого. Если предварительные условия были выполнены, единственная причина, по которой постусловие может не выполниться, заключается в том, что код в методе содержит ошибки. Это не ошибка пользователя, это проблема самой библиотеки. Я предполагаю, что именно поэтому документ считает менее проблематичным в конечном итоге отключить утверждения пост-условий.

Я не уверен, что я лично согласен, потому что, если пост-условия не выполняются, это, вероятно, означает, что контракт метода был нарушен, и выполнение должно быть остановлено. Зависит от того, насколько критическим было постсостояние. Авторы API могут захотеть проверить, является ли какое-либо соотношение оптимальным для производительности в конце изменения размера динамического массива, но не обязательно создавать исключение, если это не так, поскольку программа все равно будет вести себя так, как ожидалось, даже при неоптимальном соотношении.

person Dici    schedule 12.11.2017

Вы должны проверять аргументы ваших public функций во всех случаях. Если assert отключен, то такая проверка не будет выполняться, если она реализована через assert.

person Joe C    schedule 12.11.2017
comment
Я спрашиваю, почему можно проверять постусловия в публичных методах, но не предусловия. Я все еще в замешательстве, я не думаю, что на мой вопрос ответили. - person Ogen; 13.11.2017
comment
Утверждения @Ogen, основанные на assert, можно отключить с помощью флага JVM. Следовательно, невозможно гарантировать, что утверждения действительно будут выполняться, когда ваши пользователи запускают ваш код. Вот почему плохо давать обещания выдавать ошибки проверки в вашем API, если вы на самом деле не можете гарантировать, что это произойдет. Вместо этого вы должны использовать исключения времени выполнения. - person Dici; 13.11.2017
comment
Итак, вы говорите, что утверждения не должны использоваться в качестве замены проверки аргументов в общедоступных методах, потому что у вызывающего объекта могут быть отключены утверждения - в этом случае ваши проверки утверждений не будут выполняться. Если это так, то зачем вообще использовать утверждения для проверки постусловий в публичных методах? Почему бы и здесь не использовать стандартную проверку аргументов? - person Ogen; 13.11.2017
comment
@Ogen Я не верю, что видел это в документе, но я не читал все. Я бы сказал, что утверждения не подходят для какой-либо общедоступной проверки во время выполнения. Честно говоря, ошибки, которые они генерируют, не так хороши, как исключения, поэтому я бы лично не рекомендовал их ни в каком контексте. - person Dici; 13.11.2017
comment
@Dici Я понимаю, что это самоуверенный вопрос. Но документация оракула ясно дает понять, что вы можете использовать assert для публичных постусловий и приватных предусловий. Я думаю, что их полезность выходит за рамки этого вопроса. - person Ogen; 13.11.2017
comment
@Ogen Я попытался сжать свои предыдущие ответы, а также личную интерпретацию документа, касающегося пост-условий, в один правильный ответ. Посмотрите и не стесняйтесь комментировать, я буду повторять по мере необходимости - person Dici; 13.11.2017