2013-02-20 2 views
0

Вслед за этим вопросом: Avoiding != null statements Я спросил одного из наших старших разработчиков, почему бы не использовать утверждения. Хотя его ответ оказался разумным (мы используем специальные исключения), он также утверждал, что утверждения предназначены для использования при разработке и тестировании, но не в производстве.Могут ли утверждения использоваться в производстве или только при разработке?

Но в документации Oracle, http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html это выглядит как утверждения предназначены для использования вне тестирования, даже больше, учитывая возможность их отключения.

Итак, есть ли лучшая причина или хорошая практика не использовать утверждения?

ответ

0

Утверждения ведут себя по-разному в зависимости от языка. В C они часто используются некорректно, и неправильное использование настолько распространено, что многие советуют не использовать их вообще. Они не должны использоваться в производстве (т. Е. Производственные компиляции C должны определять NDEBUG для препроцессора), поскольку они служат только для замедления выполнения.

Целью утверждения является утверждение логической необходимости, а не проверка результата. Например, это правильно (в C), чтобы написать:

f = malloc(s); 
if(f == NULL) { 
    ...; exit(1); 
} 
assert(f != NULL); # This is logically necessary. 

Но совершенно неправильно, когда-либо писать:

f = malloc(x);  # THIS IS AN EXAMPLE OF INCORRECT USAGE 
assert(f != NULL); # DO NOT DO THIS 

Это действительно полезно, так как это вполне допустимо, чтобы написать:

f = xmalloc(x); 
assert(f != NULL); 

Что является документацией для читателя о том, что xmalloc определен таким образом, что он никогда не вернет нулевое значение.

Они часто используются в начале функции:

void f(void *p) { assert(p != NULL); ... } 

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

+0

Я думаю, что есть некоторые отличия в C и Java, когда дело доходит до использования утверждений. На этой странице документации также говорится: «Не используйте утверждения для проверки аргументов в публичных методах». –