문제

왜 궁금합니다 assert 키워드가 Java에서 너무 많이 사용 되었습니까? 나는 그들이 사용한 것을 거의 본 적이 없지만, 나는 그들이 좋은 생각이라고 생각합니다. 나는 확실히 다음의 간결성을 선호한다.

assert param != null : "Param cannot be null";

의장에 :

if (param == null) {
    throw new IllegalArgumentException("Param cannot be null");
}

내 의심은 그들이 저수로 사용된다는 것입니다

  • 그들은 비교적 늦게 도착했으며 (Java 1.4) 많은 사람들이 이미 Java 프로그래밍 스타일/습관을 설립했습니다.
  • 기본적으로 런타임에 꺼집니다
도움이 되었습니까?

해결책

주장 이론적으로 테스트를위한 것입니다 불변, 그 가정 ~ 해야 하다 코드가 올바르게 완료되기 위해서는 사실입니다.

표시된 예는 유효한 입력에 대한 테스트입니다. 일반적으로 사용자가 제공되기 때문에 어설 션에 대한 일반적인 사용법이 아닙니다.

오버 헤드가 있기 때문에 생산 코드에서 일반적으로 사용되지 않으며, 불변량이 실패한 상황이 개발 및 테스트 중에 코딩 오류로 잡힌 것으로 가정합니다.

그들이 자바에게 "늦게"오는 것에 대한 당신의 요점은 또한 그들이 더 널리 보지 못하는 이유입니다.

또한 단위 테스트 프레임 워크를 사용하면 프로그래밍 방식의 어설 션이 테스트중인 코드 외부에 있어야합니다.

다른 팁

사용자 입력을 테스트하는 데 사용하는 것은 주장의 남용입니다. 던지기 IllegalArgumentException 유효하지 않은 입력은 호출 방법이 예외를 포착하고 오류를 표시하고 필요한 모든 것을 수행 할 수있게하므로 더 정확합니다 (입력을 요청하고 종료하십시오).

그 방법이 클래스 중 하나 내에서 개인 방법 인 경우, 실수로 널 주장을 전달하지 않도록 노력하고 있기 때문에 주장은 괜찮습니다. 당신은 어설 션으로 테스트하고, 모든 경로를 테스트하고 어설 션을 유발하지 않으면 자원을 낭비하지 않도록 꺼질 수 있습니다. 그들은 또한 의견처럼 유용합니다. an assert 방법이 시작될 때 관리자에게 특정 전제 조건을 따라야한다는 좋은 문서와 assert 결국 도전 후 문서가있는 방법이 무엇을 해야하는지 문서화합니다. 그들은 의견만큼 유용 할 수 있습니다. Moreso는 주장에 따라 실제로 문서화 된 내용을 테스트하기 때문에 실제로 테스트합니다.

어설 션은 오류 확인이 아닌 테스트/디버깅을위한 것이므로 기본적으로 꺼져있는 이유입니다. 사람들이 어설 션을 사용하여 사용자 입력을 검증하지 못하게하는 것입니다.

에서 어설 션으로 프로그래밍

기본적으로 런타임에 어설 션이 비활성화됩니다. 두 개의 명령 줄 스위치를 사용하면 어설 션을 선택적으로 활성화 또는 비활성화 할 수 있습니다.

즉, 런타임 환경을 완전히 제어하지 않으면 어설 션 코드가 호출되도록 보장 할 수 없습니다. 주장은 생산 코드가 아닌 시험 환경에서 사용되어야합니다. 사용자가 어설 션 비활성화로 응용 프로그램을 실행하는 경우 ( 기본), 모든 오류 처리 코드가 사라집니다.

"효과적인 Java"에서 Joshua Bloch는 ( "유효성에 대한 매개 변수 확인"주제에 대한 간단한 규칙과 같은 경우) 공개 방법에 대해 인수를 검증하고 유효하지 않은 경우 필요한 예외를 던져야한다고 제안했습니다. 비공개 방법 (노출되지 않고 사용자로서 귀하는 유효성을 보장해야 함)의 경우 대신 주장을 사용할 수 있습니다.

YC

@Don, 당신은 기본적으로 주장이 꺼진 것에 대해 좌절합니다. 나는 또한이 작은 Javac 플러그인을 썼다. if (!expr) throw Ex 이 어리석은 바이트 코드를 주장하는 것보다.

포함하는 경우 fa.jar Java 코드를 컴파일하는 동안 클래스 경로에서 마법을 수행하고

Note: %n assertions inlined.

@보다 http://smallwiki.unibe.ch/adriankuhn/javacompiler/forceassertions 대안 적으로 Github에서 https://github.com/akuhn/javac

왜 당신이 어설 션을 작성하고, 그 다음의 조건 명령문을 표준으로 대체하는지 잘 모르겠습니다. 처음에는 조건을 작성하지 않겠습니까?

Asserts는 테스트 만용이며, 두 가지 부작용이 있습니다. 활성화 될 때 더 큰 바이너리와 성능이 저하 된 성능 (이를 꺼질 수있는 이유입니다!).

Asserts는 Asserts가 활성화/비활성화 된 경우 런타임에 앱의 동작이 다르다는 것을 의미하기 때문에 조건을 검증하는 데 사용해서는 안됩니다.

주장은 다음과 같이 유용합니다.

  • 일찍 프로그래밍 오류를 잡습니다
  • 코드를 사용한 문서 코드

그것들을 코드 자기 검증으로 생각하십시오. 그들이 실패하면 프로그램이 고장 났고 중지해야한다는 것을 의미해야합니다. 단위 테스트 중에 항상 켜십시오!

~ 안에 실용적인 프로그래머 그들은 심지어 생산에서 운영 할 것을 권장합니다.

어설 션을 켜십시오

불가능을 방지하기 위해 주장을 사용하십시오.

어설 션은 실패하면 어설 션 오해를 던지므로 캐치 예외에 걸리지 않습니다.

주장은 매우 제한적입니다. 부울 조건 만 테스트 할 수 있으며 매번 유용한 오류 메시지를 위해 코드를 작성해야합니다. 이를 입력에서 유용한 오류 메시지를 생성 할 수있는 Junit의 AsserTequals ()와 비교하여 Junit 러너의 IDE에서 두 입력을 나란히 표시 할 수 있습니다.

또한 지금까지 본 IDE에서 어설 션을 검색 할 수는 없지만 모든 IDE는 메소드 호출을 검색 할 수 있습니다.

실제로 그들은 Java 1.4에 도착했습니다

주요 문제는 Eclipse 또는 J2EE 서버에서와 같이 직접 JVM 옵션을 직접 관리하지 않는 환경에서 코딩 할 때 (두 경우 모두 JVM 옵션을 변경할 수 있지만 위치를 깊이 검색해야합니다. 할 수 있습니다), IF와 예외를 사용하는 것이 더 쉽습니다 (또는 아무것도 사용하지 않으면 더 나쁘게 사용합니다).

다른 사람들이 언급했듯이 : 어설 션은 사용자 입력 검증에 적합하지 않습니다.

당신이 진실성에 관심이 있다면, 나는 내가 쓴 도서관을 확인하는 것이 좋습니다. https://bitbucket.org/cowwoc/requirements/. 코드가 거의없는 상태에서 이러한 검사를 표현할 수 있으며 귀하를 대신하여 오류 메시지를 생성 할 수도 있습니다.

requireThat("name", value).isNotNull();

그리고 당신이 주장을 사용한다고 주장한다면, 당신은 이것도 할 수 있습니다.

assertThat("name", value).isNotNull();

출력은 다음과 같습니다.

java.lang.NullPointerException: name may not be null

tl; dr

  • 예, 생산에서 어설 션 테스트를 사용하십시오 그것이 의미가있는 곳.
  • 다른 라이브러리 사용 (주니, Assertj, Hamcrest, 내장보다는 등.) assert 원하는 경우 시설.

이 페이지의 다른 답변의 대부분은 Maxim "Assertions가 일반적으로 생산 코드에서 사용되지 않는다"고 푸시. 워드 프로세서 또는 스프레드 시트와 같은 생산성 앱에서는 Java가 일반적으로 사용되는 사용자 정의 비즈니스 앱에서 사실입니다. 생산 테스트는 매우 유용하며 일반적입니다.

프로그래밍 세계의 많은 최대 값과 마찬가지로 한 맥락에서 시작되는 것은 잘못 해석 된 다음 다른 맥락에서 잘못 입력됩니다.

생산성 앱

이 "어설 션은 일반적으로 생산 코드에서 사용되지 않는다"는이 최대는 일반적이지만 부정확합니다.

공식화 된 어설 션 테스트는 Word-Processor와 같은 앱에서 시작되었습니다. 마이크로 소프트 워드 또는 스프레드 시트와 같은 마이크로 소프트 엑셀. 이 앱은 다양한 어설 션 테스트 어설 션을 호출 할 수 있습니다. 모든 키 스트로크에서 사용자가 만들었습니다. 그런 극심한 반복은 성능에 심각하게 영향을 미쳤습니다. 따라서 제한된 분포에서 이러한 제품의 베타 버전만이 주장을 가능하게했습니다. 따라서 최대 값.

비즈니스 앱

대조적으로, 데이터 입력, 데이터베이스 또는 기타 데이터 프로세싱을위한 비즈니스 지향 앱에서 생산에서 어설 션 테스트 사용이 엄청나게 유용합니다. 성능에 대한 무의미한 타격은 매우 실용적이며 일반적입니다.

비즈니스 규칙을 테스트합니다

생산 런타임시 비즈니스 규칙을 확인하는 것은 전적으로 합리적이며 권장해야합니다. 예를 들어, 송장에 항상 하나 이상의 라인 항목이 있어야하는 경우 송장 라인 항목 수가 0보다 큽니다. 제품 이름이 3 자 이상이어야하는 경우 문자열의 길이를 테스트하는 어설 션을 작성하십시오. 이러한 테스트는 생산 성능에 큰 영향을 미치지 않습니다.

런타임 조건

앱이 생산에서 실행될 때 앱이 항상 사실이 될 것으로 예상하는 경우, 해당 기대치를 코드에 어설 션 테스트로 작성하십시오.

이러한 조건이 가끔씩 실패 할 것으로 예상하면 ~ 아니다 어설 션 테스트를 작성하십시오. 아마도 특정 예외를 던질 것입니다. 그런 다음 가능한 경우 복구하십시오.

정신 확인

정신 점검 생산 런타임에도 전적으로 합리적이며 장려해야합니다. 진실하지 않은 것을 상상할 수없는 몇 가지 임의의 조건을 테스트하면 일부 기괴한 일이 발생했을 때 수많은 상황에서 베이컨을 구해주었습니다.

예를 들어, 니켈 (0.05)을 페니에 둥글게하는 것을 테스트하면 특정 라이브러리에서 니켈 (0.05)이 생겨서 Apple이 애플이 선적 한 부동산 기술 결함을 발견하는 데 도움이되었습니다. 로제타 Powerpc-to-Intel 전환 중 라이브러리. 그러한 결함이 대중에게 도달하는 것은 불가능 해 보였을 것입니다. 그러나 놀랍게도 결함은 원래의 공급 업체, 전이 및 애플, 그리고 애플 베타에 대한 초기 접근 개발자의 통지를 피했다.

(그건 그렇고, 나는 언급해야한다… 돈을위한 부동 소수점, 사용 BigDecimal.)

프레임 워크 선택

내장을 사용하기보다는 assert 시설, 다른 어설 션 프레임 워크 사용을 고려할 수 있습니다. 다음과 같은 여러 옵션이 있습니다.

또는 Roll-Your-Own. 프로젝트에서 사용할 수있는 작은 수업을 만드십시오. 이 같은.

package work.basil.example;

public class Assertions {
    static public void assertTrue ( Boolean booleanExpression , CharSequence message ) throws java.lang.AssertionError {
        if ( booleanExpression ) {
            // No code needed here.
        } else { // If booleanExpression is false rather than expected true, throw assertion error.
            // FIXME: Add logging.
            throw new java.lang.AssertionError( message.toString() );
        }
    }

}

예제 사용 :

Assertions.assertTrue( 
    localTime.isBefore( LocalTime.NOON ) , 
    "The time-of-day is too late, after noon: " + localTime + ". Message # 816a2a26-2b95-45fa-9b0a-5d10884d819d." 
) ;

당신의 질문

그들은 비교적 늦게 도착했으며 (Java 1.4) 많은 사람들이 이미 Java 프로그래밍 스타일/습관을 설립했습니다.

예, 이것은 꽤 사실입니다. 많은 사람들이 Sun/JCP가 주장 테스트를 위해 개발 된 API에 실망했습니다. 기존 라이브러리에 비해 디자인이 부족했습니다. 많은 사람들이 새로운 API를 무시하고 알려진 도구 (3 자 도구 또는 Roll-Your Own Mini-Library)를 고수했습니다.

기본적으로 런타임에 꺼져 있습니다. 왜 오 왜 ??

초창기에 Java는 성능 저하 속도가 좋지 않은 랩을 얻었습니다. 아이러니하게도, Java는 빠르게 진화했습니다 성능을위한 최고의 플랫폼 중 하나가됩니다. 그러나 나쁜 랩은 냄새 나는 냄새처럼 매달렸다. 따라서 Sun은 측정 가능한 방식으로 영향을 줄 수있는 모든 것에 대해 매우 조심했습니다. 따라서 이러한 관점에서, 어설 션 테스트를 비활성화하는 것이 기본값을 비활성화하는 것이 합리적이었습니다.

기본적으로 비활성화해야 할 또 다른 이유는 새로운 주장 시설을 추가 할 때 Sun이 그 단어를 납치했다는 사실과 관련이있을 수 있습니다. assert. 이했다 ~ 아니다 이전에 예약 된 키워드였으며 Java 언어에 대한 몇 가지 변경 사항 중 하나가 필요했습니다. 메소드 이름 assert 많은 도서관과 많은 개발자들이 자체 코드로 사용했습니다. 이 역사적 전환에 대한 논의를 위해이 오래된 문서를 읽으십시오. 어설 션으로 프로그래밍.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top