실패로 true
돌아 오지 않으면 성공 으로 돌아올 이유가 전혀 없습니다 false
. 클라이언트 코드는 어떻게 보입니까?
if (result = tryMyAPICall()) {
// business logic
}
else {
// this will *never* happen anyways
}
이 경우, 호출자 는 어쨌든 try-catch 블록이 필요하지만 더 잘 쓸 수 있습니다.
try {
result = tryMyAPICall();
// business logic
// will only reach this line when no exception
// no reason to use an if-condition
} catch (SomeException se) { }
따라서 true
반환 값은 호출자에게 완전히 영향을 미치지 않습니다. 따라서 방법을 유지하십시오 void
.
일반적으로 실패 모드를 설계하는 세 가지 방법이 있습니다.
- 참 / 거짓 반환
- 사용
void
, 던져 (체크) 예외
- 중간 결과 개체를 반환 합니다.
반품 true
/false
이전의 대부분 c 스타일 API에서 사용됩니다. 단점은 명백하다. 당신은 무엇이 잘못되었는지 전혀 모른다. PHP는 이것을 자주 수행하여 다음과 같은 코드를 생성합니다.
if (xyz_parse($data) === FALSE)
$error = xyz_last_error();
멀티 스레드 컨텍스트에서는 더 나빠집니다.
예외 확인 (확인)
이것은 좋은 방법입니다. 어떤 시점에서는 실패를 예상 할 수 있습니다. Java는 소켓으로 이것을 수행합니다. 기본 가정은 호출이 성공해야하지만 모든 사람이 특정 작업이 실패 할 수 있다는 것을 알고 있습니다. 소켓 연결이 그중 하나입니다. 따라서 호출자는 실패를 처리해야합니다. 호출자가 실제로 실패를 처리하고 호출자에게 실패를 처리하는 우아한 방법을 제공하기 때문에 멋진 디자인입니다.
결과 객체 반환
이것은 이것을 처리하는 또 다른 좋은 방법입니다. 종종 구문 분석이나 유효성 검사가 필요한 것들에 사용됩니다.
ValidationResult result = parser.validate(data);
if (result.isValid())
// business logic
else
error = result.getvalidationError();
발신자에게도 좋고 깔끔한 논리.
두 번째 경우를 사용할 때와 세 번째 경우를 사용할 때 약간의 논쟁이 있습니다. 어떤 사람들은 예외가되어야한다고 생각 뛰어난 당신이 마음에서 예외의 가능성을 설계하지 말아야하며, 거의 항상 세 번째 옵션을 사용하는 것으로합니다. 괜찮아 그러나 우리는 Java에서 예외를 확인했기 때문에 예외 를 사용 하지 않을 이유가 없습니다 . 소켓을 사용하는 것처럼 호출이 성공 해야 한다는 기본 가정이있을 때 확인 된 expetions를 사용하지만 실패가 가능하며 호출이 성공 해야하는지 확실하지 않은 경우 (데이터 유효성 검사와 같은) 세 번째 옵션을 사용합니다. 그러나 이것에 대해 다른 의견이 있습니다.
귀하의 경우에는 void
+ 와 함께 갈 것입니다 Exception
. 파일 업로드가 성공할 경우 예외가 발생합니다. 그러나 호출자는 해당 실패 모드를 처리해야하며 어떤 종류의 오류가 발생했는지 올바르게 설명하는 예외를 반환 할 수 있습니다.