почему утверждение не используется при развертывании - PullRequest
4 голосов
/ 02 марта 2011

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

Ответы [ 3 ]

5 голосов
/ 02 марта 2011

Утверждения не включены по умолчанию, вам нужно передать параметр -ea в JVM, чтобы включить их. Так что во многих случаях это может быть простым упущением в развертывании. Другими причинами могут быть производительность (у меня нет доказательств того, что утверждения могут заметно замедлить выполнение), или правильная обработка ошибок, т. Е. Для производственной системы может быть сочтено неуместным запускать AssertionError s live.

Утверждение аргументов закрытого метода уместно, потому что вы должны полностью контролировать передаваемые им аргументы. Открытые методы OTOH вызываются из внешнего мира, поэтому вы не можете контролировать конкретные передаваемые аргументы, поэтому лучше делать явные проверки аргументов и соответствующим образом обрабатывать недопустимые аргументы (например, выбрасывая подходящее исключение времени выполнения, такое как IllegalArgumentException) или для нулевых ссылок пусть JVM выдает NullPointerException.

1 голос
/ 02 марта 2011

Утверждения отключены по умолчанию, поскольку накладные расходы делают их приемлемыми только для сред разработки, поскольку они действительно полезны при поиске ошибок. Во всех ваших публичных методах вы все равно должны проверять ввод, не полагаясь на включенные утверждения (опция -ea JVM), поэтому там они (или должны быть) бесполезны.

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

0 голосов
/ 16 июня 2011

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

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

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

...