주장은 악한가? [닫은] 개선하고 다시

Go언어 제작자는 쓰기 :

Go는 어설 션을 제공하지 않습니다. 그것들은 명백히 편리하지만 프로그래머들은 적절한 오류 처리 및보고에 대한 생각을 피하기 위해 목발로 사용한다는 경험이 있습니다. 적절한 오류 처리는 치명적이지 않은 오류 후에 서버가 충돌하지 않고 계속 작동 함을 의미합니다. 적절한 오류보고는 오류가 직접적이고 정확한 시점임을 의미하므로 프로그래머는 큰 충돌 추적을 해석하지 않아도됩니다. 정확한 오류는 프로그래머가 오류를보고 코드에 익숙하지 않은 경우 특히 중요합니다.

이것에 대한 당신의 의견은 무엇입니까?



답변

아니요, assert의도 한대로 사용하는 한 아무 문제가 없습니다 .

즉, 일반적인 오류 처리와는 달리 디버깅 중에 “발생할 수없는”경우를 포착하기위한 것입니다.

  • Assert : 프로그램 논리 자체에 오류가 있습니다.
  • 오류 처리 : 프로그램의 버그로 인한 잘못된 입력 또는 시스템 상태입니다.

답변

아니요, 악도 goto아닙니다 assert. 그러나 둘 다 오용 될 수 있습니다.

어설 션은 상태 점검을위한 것입니다. 올바르지 않은 경우 프로그램을 종료해야하는 것. 유효성 검사 또는 오류 처리를 대체하지 않습니다.


답변

이 논리에 따르면 중단 점도 악합니다.

어설 션은 디버깅 보조 도구로 사용되어야합니다. “악”은 오류 처리 대신 사용하려고 할 때 입니다.

프로그래머는 존재하지 않아야하는 문제를 감지 및 수정하고 가정이 계속 유지되는지 확인하는 데 도움이됩니다.

오류 처리와는 아무런 관련이 없지만 불행히도 일부 프로그래머는 오류를 악용 한 다음 “악”이라고 선언합니다.


답변

나는 assert를 많이 사용하고 싶다. 처음으로 응용 프로그램을 구축 할 때 (아마도 새로운 도메인) 매우 유용합니다. 매우 빠른 오류 검사 (조기 최적화를 고려할 것)를 수행하는 대신 빠르게 코딩하고 많은 주장을 추가합니다. 작동 방식에 대해 더 많이 알고 난 후에는 다시 작성하고 어설 션을 제거하고 더 나은 오류 처리를 위해 변경합니다.

주장으로 인해 코딩 / 디버깅 프로그램에 많은 시간을 소비하지 않습니다.

또한이 주장은 프로그램을 망칠 수있는 많은 것들을 생각하는 데 도움이된다는 것을 알게되었습니다.


답변

추가 정보로서 go는 내장 기능을 제공합니다 panic. 대신에 사용할 수 있습니다 assert. 예 :

if x < 0 {
    panic("x is less than 0");
}

panic스택 추적을 인쇄하므로 어떤 식 으로든 목적이 assert있습니다.


답변

프로그램에서 버그를 탐지하는 데 사용해야합니다. 나쁜 사용자 입력이 아닙니다.

올바르게 사용하면 악 이 아닙니다 .


답변

이것은 많이 나오며 어설 션 방어를 혼란스럽게 만드는 한 가지 문제는 종종 인수 확인을 기반으로한다는 것입니다. 따라서 어설 션을 사용할 수있는 다음과 같은 다른 예를 고려하십시오.

build-sorted-list-from-user-input(input)

    throw-exception-if-bad-input(input)

    ...

    //build list using algorithm that you expect to give a sorted list

    ...

    assert(is-sorted(list))

end

때때로 입력이 잘못 될 것으로 예상되므로 입력에 대해 예외를 사용합니다. 알고리즘에서 버그를 찾는 데 도움이되도록 목록이 정렬되어 있다고 주장합니다. 어설 션은 디버그 빌드에만 있으므로 검사 비용이 많이 들더라도 루틴을 호출 할 때마다 수행하지 않아도됩니다.

여전히 프로덕션 코드를 단위 테스트해야하지만, 코드가 올바른지 확인하는 다른 보완적인 방법입니다. 단위 테스트를 통해 일상적인 인터페이스를 유지할 수 있으며 단정은 구현이 예상 한대로 정확하게 수행되도록하는보다 세밀한 방법입니다.