Java - программирование с утверждениями вопросов - PullRequest
8 голосов
/ 07 января 2011

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

Но я никогда не видел ни одного проекта, использующего утверждения (кроме тестов junit / testng ...).

Я заметил, что брошенный классэто ошибка, а не исключение.Может кто-нибудь сказать мне, почему они выбирают ошибку?Может ли это быть из-за того, что исключение может быть неожиданно перехвачено, а не записано / перезагружено?

Если вы разрабатываете приложение с компонентами, мне интересно, куда вы помещаете утверждения: - На стороне компонента, непосредственно перед возвратом данных черезпубличный API?- На стороне клиента компонента?И если API вызывается везде, вы устанавливаете шаблон фасада, который будет вызывать механизм утверждения?(Тогда, я полагаю, вы положили свои утверждения и фасад на какой-то внешний проект, и ваши клиентские проекты будут зависеть от этого проекта утверждений?)

Я понимаю, как использовать утверждения и когда их использовать, но просто удивляюсь, есть ли у некоторых людейрекомендации, основанные на реальном опыте утверждения.

Спасибо

Ответы [ 4 ]

5 голосов
/ 07 января 2011

Кстати, вы ссылаетесь на assert в Java?

Я лично считаю утверждения особенно полезными для инвариантов. Примите во внимание, что проверка утверждений по умолчанию отключена в Java. Вы должны добавить флаг -ea, чтобы включить проверку утверждений. Другими словами, вы можете протестировать ваше приложение в своего рода режиме отладки, когда программа остановится после того, как утверждение будет нарушено. С другой стороны, у приложения-релиза утверждение будет отключено и оно не будет подвергаться штрафу за проверку времени, оно будет игнорироваться.

В Java утверждения гораздо менее сильны, чем исключения, и имеют совершенно разные значения. Исключения бывают, когда происходит что-то неожиданное, и вы должны справиться с этим. Утверждения о правильности вашего кода. Они здесь, чтобы подтвердить, что то, что «должно быть», действительно так.

Моя грубая политика, особенно при работе со многими разработчиками:

  • публичные методы: всегда проверять аргументы и генерировать IllegalArgumentException, если что-то не так
  • приватные методы: используйте утверждения для проверки аргументов против нулевых указателей и т. Д.
  • сложные методы: промежуточные утверждения, гарантирующие, что промежуточные результаты удовлетворяют требуемым свойствам

... но на самом деле я использую их редко. Только там, где это критично или подвержено ошибкам.

4 голосов
/ 07 января 2011

О незначительном использовании утверждений Я думаю, что было плохим решением сделать утверждения отключенными по умолчанию.

О расширении Error. Я полагаю, это расширяет Error, поскольку ошибки - это исключения, которые не должны быть перехвачены.И таким образом, когда в вашем коде у вас есть catch (Exception), утверждение не кэшируется.

И об использовании лучше всего использовать предварительные условия, постусловия или в середине кода любой инвариант, который вы хотитепроверьте.

1 голос
/ 07 января 2011

По моему мнению, ошибки в Java должны рассматриваться как исключение.Поэтому я бы включил утверждения в разработке и в частных методах, чтобы проверить, что мой код работает нормально и не передает недопустимые значения в частные методы.

Поскольку эти проверки должны выполняться в открытых методах, я бы не сталне проверять снова в приватных методах.

Чтобы отключить утверждения:

-da flag in compiler

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

0 голосов
/ 07 января 2011

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

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

...