assert는 쓰면 안되나요?

조회수 2257회

여기에 Go언어 만든 사람이 이렇게 적어놨던데요 다른사람들도 다 그렇게 생각하나요?


왜 Go는 assertion을 없을까? Go는 assertion이 없다. 확실히 있으면 편리하지만 우리 경험에 비춰봤을 때 프로그래머들은 적절히 에러를 처리하고 리포팅에 관한 고려를 하지 않기 위한 도구로 사용하는 것을 여겨진다. 적절한 에러 처리는 서버가 심각한 에러가 아닌 상황을 맞았을 때 다운되지 않고 계속 동작하는 것을 말한다. 적절한 에러 리포팅은 에러를 바로 그 부분을 보게되어 프로그래머가 시스템을 망친 부분을 찾기 위해서 엄청난 메시지들을 분석하지 않다도 되도록 하는 것이다. 익숙하지 않은 코드에서 프로그래머가 에러를 보게 될 때 에러가 명확하게 드러나는 것이 특히 중요하다.

테스트 프로그램에서 assert()의 사용에도 동일한 생각이다. 테스트가 실패한 후에 다른 테스트를 실행하게 하는데도 적절한 에러 처리가 필요하다. 따라서 실패난 것을 디버깅 하는 사람은 무엇이 잘 못되었는지 완벽하게 이해할 수 있게 한다. isPrime이 잘못된 결과를 내는 것을 테스트하는데도 유용하다. 테스트가 실패하도록 하는 프로그래머는 실패하는 코드에도 익숙하지 않다. 멋진 에러 메시지를 작성하는데 투자하는 시간은 나중에 테스트가 멈출 때 보답하게 된다.

테스팅에서 에러를 위해 작성한 많은 코드들이 중복적이고 쓸데없이 보인다면 테이블 주도 테스트(table-driven test)를 추천한다. Go는 자료구조를 아주 잘 지원한다.

우리는 이런 부분은 논쟁의 소지가 있고 생각한다. Go언어에 있는 많은 것들과 라이브러리는 최근에 것들과 차이가 있다. 단순히 우리는 다른 접근법을 시도하는 것이 충분히 가치가 있다고 생각한다.


1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    아닙니다. assert()의 목적에 맞게 사용하면 아무런 문제가 없습니다.

    일반적인 에러 처리 방식이 "에러가 발생했을 때 이걸 처리해서 계속 진행하자" 라면, assert()는 "어떤 에러가 발생하면 프로그램을 죽이자"가 목적입니다.

    • Assert: 프로그램의 logic이 실패했을 때
    • Error Handling: 프로그램의 버그가 원인이 아닌 input/시스템 상태 에러가 발생한 경우

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)