2017-12-20 20 views
2

제 질문은 다소 모호하며 적어도 부분적으로 의도적 인 질문입니다. 인터페이스 디자인, 향후 확장 및 테스트 인터페이스에 대한 조기 조언을 원하며 정확한 코드에 대한 정보는별로 찾고 있지 않습니다. 그것이 C++ (17)에 특히 적용되는 솔루션/조언 인 경우에도 완벽합니다.함수가 반환 할 수있는 함수는 무엇이 실패해야합니까?

하드 조합 문제를 해결하는 시뮬레이션을했습니다. 시뮬레이션은 단계적으로 솔루션으로 전파됩니다. 그러나 때로는 단계는 막 다른 길입니다. 예를 들어, 아래의 의사 코드에서 while 루프는 조각을 먹여서 시뮬레이션을 전파합니다. '조각'을 사용하여 시뮬레이션을 전파 할 수없는 경우가있을 수 있습니다. 예 : 그것은 비싸지 만, 그것은 단순히 적합하지 않은 부분이거나, 어떤 이유에서 발생했는지에 대한 것입니다. 실패는 중단 할 이유가없는 정상적인 동작입니다.

while(!allNotHandledPieced.empty()) 
{ 
    auto nextPiece = allNotHandledPieces.back(); 
    allNotHandledPieces.pop_back(); 
    auto status = simulation.propagate(nextPiece); 
    if(status == 0) 
    next; // ok 
    else if (status == 1) 
    dropPieceDueToTooBadStatus(); 
} 

실제로 '시뮬레이션'의 경우 실패한 이유는 중요하지 않습니다. 상태는 여전히 유효합니다. 다른 부분을 사용하는 데 문제가 없으며 계속 진행할 수 있습니다. 그러나 나중에, '전파'방법이 실패한 이유를 알 필요가 있습니다. 그런 다음 실패시 의미있는 반환 값을 갖는 것이 합리적 일 수 있습니다.

'실패'를 반환하는 좋은 방법? 이와 같은 경우에 모범 사례이 있습니까?

+1

퇴거에 대해 들어 보셨습니까? – davidhigh

+2

C++에서 std :: optional 17 또는 boost :: optional –

+0

'throw' 키워드를 사용합니다. –

답변

1

내가 수집 할 수있는 것부터 예외 나 "반환 ​​중"이 귀하의 상황에 적절하지 않은 것으로 보입니다. 질문에서 "결과 반환"에 대해 이야기하지만 특정 코드 예제/사용 사례에서는 "불량 부품"이 사용될 경우 알고리즘이 중단되거나 중단되지 않아야 함을 알립니다. 예외와 함수에서 "반환"은 모두 예외 처리 방법에 따라보다 복잡한 제어 흐름을 가져오고 어떤 경우에는 더 복잡한 상태 처리를 초래합니다.

예외 경로를 선택하면 system_error 뒤에 "보고"클래스를 모델링하는 것이 좋습니다.

비 제어 흐름 경로를 선택하는 경우 오류 코드와 조각에 대한 기타 메타 데이터 (조각 자체가 너무 비싸서 복사 할 수없는 경우)를 소비 할 수있는 다른 데이터 구조로 푸시하는 것이 좋습니다.

나쁜 피스가 즉각적인 조치가 필요한지 여부에 따라 수행 할 작업을 선택하십시오. 그렇지 않은 경우, 예외는 어떤 시점에서 처리해야 함을 의미하기 때문에 예외가 아닙니다.