2013-02-20 3 views
0

이 질문에 답하십시오 : Avoiding != null statements 저는 고위 개발자 중 한 명에게 어설 션을 사용하는 이유를 묻습니다. 그의 답변은 합리적인 것으로 판명되었지만 (사용자 정의 예외를 사용함), 그는 또한 개발 및 테스트 중에는 어설 션을 사용하지만 생산에서는 사용하지 말 것을 주장했습니다. 어설 션을 프로덕션에서 또는 개발 중에 만 사용할 수 있습니까?

하지만 오라클의 설명서는 주장이 그들을 해제의 가능성을 주어 더 많은 테스트를 넘어 사용하는 의미처럼 보인다 http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html 에서

.

그래서 어설 션을 사용하지 않는 것이 더 좋은 이유입니까?

답변

0

어설 션은 언어에 따라 다르게 동작합니다. C에서는 잘못 사용되는 경우가 많으며 잘못된 사용법은 흔히 사용되므로 전혀 사용하지 말라고 조언합니다. 프로덕션 환경에서 사용해서는 안됩니다 (예 : C의 프로덕션 컴파일은 사전 처리기에 대해 NDEBUG으로 정의해야 함).

어설 션의 목적은 결과를 확인하지 않고 논리적 필요를 진술하는 것입니다. 지금 쓰고

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

을하지만 완전히 잘못 : 예를 들어 그것을 쓰기 (C에서) 올바른

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

쓰기 완벽하게 유효하기 때문에, 실제로 유용

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

독자에게 xmalloc이 결코 null 값을 반환하지 않도록 정의 된 문서 역할을합니다.

는 그들은 종종 함수의 시작 부분에 사용됩니다

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

이러한 사용은하지 에러 체크 입니다. 오히려 함수 f이 결코 null 포인터를 전달하지 않을 것으로 예상한다는 것을 나타냅니다. f에 널 포인터를 전달하는 것은 프로그래밍 오류입니다. 이를 어설 션으로 설정하면 어설 션이 활성화 된 런타임에서 오류를 감지 할 수 있습니다.

+0

어설 션을 사용할 때 C와 Java의 차이점이 있습니다. 또한 문서 페이지에서 "공용 메소드에서 인수 검사에 어설 션을 사용하지 마십시오"라고되어 있습니다. –