во время разработки и развертывания, как ведут себя утверждения утверждения

может ли кто-нибудь объяснить смысл утверждения «утверждения позволяют вам проверять свои предположения во время разработки, но код утверждения в основном испаряется при развертывании программы, не оставляя после себя накладных расходов или кода отладки, который нужно отследить и удалить»


person satheesh    schedule 23.03.2011    source источник
comment
возможный дубликат Что делает assert?   -  person Erik    schedule 23.03.2011


Ответы (3)


РЕДАКТИРОВАТЬ: утверждения следует использовать для обнаружения ошибок кодирования, а не ошибок ввода.

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

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

Для проверки пользовательского ввода лучше использовать if(!condition) friendly_user_message().


assertions позволяют выполнять дорогостоящие тесты, которые вы хотите отключить для производственного cocde.

JVM оптимизирует утверждения, когда они не включены.

РЕДАКТИРОВАТЬ: у вас может быть сложная проверка, которую вы хотите выполнить, если утверждения включены. Это можно сделать двумя способами.

boolean debug = false;
assert debug = true;

if (debug) // do something.

OR

assert validate();

// later
private boolean validate() {

     return passed;
}
person Peter Lawrey    schedule 23.03.2011
comment
@Peter Lawrey, когда мы собираемся разработать код, тогда для тестирования мы будем использовать утверждения, но если в этом тестовом выражении есть присвоенные значения времени выполнения ... тогда эти утверждения должны быть включены, даже когда они развернуты, знаете? - person satheesh; 23.03.2011
comment
Код для тестов будет там. Когда вы запускаете программу, JVM оптимизирует код, чтобы включить ваши утверждения, если они включены, и исключить их, если они отключены. - person Peter Lawrey; 23.03.2011
comment
@Peter Lawrey, спасибо ... это не мое сомнение .... позвольте мне сказать таким образом ... мы используем утверждения для проверки и почему для отключения утверждений, которые они нужны, все время обряда ... даже когда это пользователь ... (поскольку он обрабатывается на основе ввода пользователя и проверки ...) - person satheesh; 23.03.2011
comment
Утверждения следует использовать для обнаружения ошибок программирования. Для проверки пользовательского ввода вы должны использовать другие средства, такие как if (userInput > MAXIMUM) System.out.println("Number is too large, must be less than "+ MAXIMUM+" , try again"). Вы не должны полагаться на утверждения для проверки пользовательского ввода, поскольку они не предназначены для удобства. Утверждения следует использовать для того, что вы можете отключить, если знаете, что программа работает. - person Peter Lawrey; 23.03.2011
comment
@ Питер Лоури ... последнее и последнее сомнение ... не могли бы вы привести небольшой пример, где утверждения необходимы во время разработки, и они не нужны при развертывании ..... (Как я думаю, условия утверждений, которые необходимы в разработке также следует протестировать при развертывании ...) Я ожидаю примера, который устранит мои сомнения таким образом, пожалуйста ... - person satheesh; 23.03.2011
comment
@ поддерживающее утверждение к моему предыдущему .... всегда ли мы должны заменять некоторые операторы if или условные операторы вместо оператора утверждения при развертывании? если он не нужен, можете ли вы достать мне случай, когда он не нужен, пожалуйста - person satheesh; 23.03.2011
comment
@satheesh Я думаю, что этот вопрос stackoverflow.com/questions/368750/. Может помочь вам понять, когда использовать утверждения, а когда проверяет if, и, надеюсь, позволит вам не попасть в ситуацию, когда вам понадобятся ваши утверждения при развертывании в будущем. - person Simeon; 23.03.2011
comment
@satheesh, вы могли бы использовать assert, например, чтобы сказать, что аргумент не должен быть нулевым. например assert arg != null При правильном кодировании ваш аргумент никогда не будет изменен null Однако у вас может быть ошибка в коде или вы можете ввести ошибку в будущем, и assert позволит вам быстро исправить ошибку. Как только ошибка будет исправлена, утверждение assert не понадобится, но вы оставите его там на случай, если позже измените код. - person Peter Lawrey; 23.03.2011
comment
Утверждение также может служить документированием предположений, которые делает ваш код. например assert arg >= 0; означает, что любой, кто вызывает этот код, знает, что ему не следует передавать отрицательный аргумент, и код будет проверять его при разработке (поэтому это лучше, чем просто комментарий, в котором говорится то же самое) - person Peter Lawrey; 23.03.2011

Как правило, это означает, что, поскольку утверждения являются исключительно инструментом разработки, пока вы разрабатываете, вы можете запускать свою виртуальную машину с переключателями -enableassertions или -ea, которые будут выполнять ваши утверждения во время выполнения, это часть «утверждения позволяют вам проверять свои предположения во время разработки». заявление.

Я предполагаю, что в контексте того, что вы читаете, «развертывание» (возможно, производство?) Означает, что виртуальная машина запускается без -enableassertions или -ea, которые не будут запускать ваши утверждения (они просто пропустят их), таким образом, «оставив без накладных расходов или кода отладки, который нужно отследить и удалить ".

person Simeon    schedule 23.03.2011
comment
хорошо, сэр, я понял ... но когда программа передается конечному пользователю после разработки, когда мы не разрешаем утверждения, тогда как эти ошибки предположений или проверки будут обрабатываться, когда значения выражения будут получены во время выполнения .. - person satheesh; 23.03.2011
comment
Это зависит от того, что вы делаете. Если вы даете пользователю свое приложение (возможно, просто банку) и позволяете ему запускать его на своей виртуальной машине, вам не о чем беспокоиться, поскольку утверждения по умолчанию отключены. Если вы создаете веб-приложение, это зависит от используемого вами сервера, но я могу почти гарантировать вам, что любой сервер будет запускать ваше приложение с отключенными по умолчанию утверждениями в производственном режиме. Когда утверждения отключены, они просто пропускаются / игнорируются во время выполнения. Это может помочь прояснить ситуацию еще раз download.oracle.com /javase/1.4.2/docs/guide/lang/assert.html. - person Simeon; 23.03.2011
comment
спасибо ... я не сомневаюсь .... позвольте мне сказать таким образом ... мы используем утверждения для проверки и почему для отключения утверждений они необходимы постоянно ... даже когда они находятся у пользователя .. . (поскольку он обрабатывается на основе ввода пользователя и проверки ...) - person satheesh; 23.03.2011
comment
ааа, теперь я понимаю :) хорошо, я уверен, что вы уже поняли это, но вы не должны использовать утверждения для проверок, которые вам нужны в продакшене. Можете ли вы сказать мне, создаете ли вы веб-приложение или собираетесь позволить пользователю запускать ваше приложение на его собственной виртуальной машине? - person Simeon; 23.03.2011
comment
Я не знаю, есть ли способ контролировать аргументы виртуальной машины из манифеста jar (но я в этом сомневаюсь). Поэтому лучше всего проанализировать исходный код и заменить операторы assert на операторы if. Если вы используете веб-сервер, вам нужно найти способ заставить его выполнять утверждения в производственной среде. - person Simeon; 23.03.2011

Утверждения в java включаются указанием переключателя -enableassertions или -ea при запуске программы. В противном случае все ваши assert утверждения будут проигнорированы. Справа здесь у вас есть ссылка с учебником по утверждениям. Надеюсь на помощь.

person artaxerxe    schedule 23.03.2011