대안

2012-01-28 8 views
3

내가 지정된 객체로 변환의 여러 유형을 수행 할 수있는 클래스가 객체.대안

모든 데이터는 사용자가 손으로 만든 명령 파일을 통해 제공되지만 대부분의 경우 파일 명령이 변환되기 전까지 유효한지 여부를 알 수있는 방법이 없습니다.

이러한 변환 방법은 개체에서 호출되며 새로 변환 된 개체를 반환하지만 문제가 발생하면 개체를 반환 한 후 예외가 발생합니다 (빈 개체조차도 예외가 발생 함).)는 성공과 혼동 될 수 있지만 예외는 명확한 신호를 보내고 문제가 있으며 객체를 반환 할 수 없습니다. 그것은 또한 우리가 잘못 그래서이 보인다에 많은 답변을 읽기에서 그러나 (오류 코드, 메시지, 성명 등)

정확히 무엇인지 찾기 위해 "마지막 오류"타입의 함수를 호출 할 필요가 없습니다 의미 잘못된 사용자 입력이 예외적 인 상황이 아니기 때문에 올바르지 않습니다. 그리고이 명령문의 복잡성으로 인해 사용자가 잘못된 명령 파일을 제출하는 경우는 드뭅니다. 우리가 오류를 치면 우리가 중지하고 사용자에게 다시 이동해야하기 때문에

성능은 여기에 정말 문제가되지 않습니다. 내가 반환 코드를 사용하는 경우

나는 만약 내가 긴 중첩 필요하려는 반환 코드를 확인하기 위해 다음 매개 변수로 출력 개체를 가지고해야 할 것 블록 (예. 방법은 COM에서 HRESULT 확인)

코드를 적당하게 깔끔하게 유지하면서이 경우 예외를 피하는 방법은 무엇입니까?

+0

해당 인스턴스가 유효한지 여부를 알기 위해 개체 자체에 플래그를 추가 할 수 없습니까? –

+0

¤ 대답은 바보 같은 이상을 수용하기 위해 디자인을 변경하지 않는 것입니다. 실용적이고 로널드 레이건의 말을 기억하십시오. 그것이 파손되지 않으면 고치지 마십시오. 즉, Barton Nackman "Fallible"개념, 논리적으로 비어있는 반환 객체 유형 및 비어있는 경우 포함 된 값의 액세스가 실패한 경우를 사용할 수 있습니다. 실패는 종료 또는 예외 일 수 있습니다. 'boost :: optional' 클래스는 무효 한 결과 액세스에 대한 예외를 기반으로합니다. 건배 & hth., –

+0

@puller : 의견을 주셔서 감사합니다. 그러나 플래그를 확인하려고 할 때 반환 여부를 확인해야하는 경우 해당 플래그를 어딘지에서 확인해야합니다 (플래그가 설정되면 처리를 계속하고 싶지 않습니다). 값. – TownCube

답변

3

문제의 디자인은 정말 예외를 빌려 준다. 사용자가 잘못된 입력 파일을 제공하면 프로그램 실행이 중단되거나 무효화된다는 사실은 "예외적 인 상황"의 징후입니다. 물론, 많은 프로그램 실행은 예외가 발생하여 (그리고 잡히면) 종료 될 것이지만, 이것은 프로그램을 한 번 실행하는 것입니다.

다른 모든 상황에서 사용할 때 예외 상황에 대해 읽고있는 내용은 프로그램이 복구 할 수 있고 자주 복구해야하는 경우에만 유효합니다 (예 : 검색 디렉토리에서 헤더를 찾지 못하는 컴파일러 및 정말 많이 발생하는 검색 디렉토리 목록에서 다음 디렉토리를 살펴야합니다.

사용 예외. 의심스러운 경우, 이것이 성능을 죽이는 것인지를 측정하십시오. 더 깨끗한 코드 >>는 사람들이 말하는대로 따라합니다. 하지만 다시 말하면, 내가 방금 말한 것을 무시할 이유가 될 것입니다.

1

글쎄, 난 (예외를 피하기)하지 않을 것입니다. "오류보고"메커니즘이 필요하다면, 반환 값과 예외 외에도 많은 부분이 있습니다. 나는 충분히 예외적 인 것 (그리고 그에 대한 예외가 필요함)에 대한 전체 논쟁과 그렇지 않은 것에 대한 논쟁이 당신을 당신의 문제를 푸는 것으로부터 지키지 않는 것이 중요하다고 생각합니다. 특히 performace는 문제가되지 않습니다. 그러나 정말로 예외를 피하려면, 일종의 글로벌 대기열을 사용하여 오류 발생을 대기열에 넣을 수 있습니다. 하지만 네가 나에게 묻는다면 그건 완전히 못생긴다.