2014-09-12 3 views
2

프런트 엔드 라이브러리를 구축 중입니다. 내가 좋아하는 것 편의를 위해열거 된 값의 충돌을 피하는 방법은 무엇입니까?

enum fronterr {FRONT_ERR1, FRONT_ERR2, FRONT_ERR3}; 

는 하나의 오류를 가지고 :

enum backerr {BACK_ERR1, BACK_ERR2, BACK_ERR3}; 

내 프런트 엔드 추가 오류 코드의 숫자를 생성합니다 백엔드는 열거 오류 코드의 숫자를 생성 어느 것이 발생했는지에 따라 프런트 엔드 또는 백엔드 오류를 반환하는 코드 반환 함수.

두 오류 코드의 값 충돌없이 어떤 일이 발생할 수 있으며 백엔드 값을 알 수 없다고 생각합니까?

+1

전이 문제를 해결했습니다. 프론트 엔드는 백엔드의 오류 코드에 대해 충분히 알고 있어야한다고 생각합니다. 프런트 엔드 오류 코드가 백 엔드 코드의 상위 집합인지 확인하십시오. 백엔드의 처음 1000 개의 번호를 예약하고 나머지는 정면으로 사용할 수 있습니다. –

+0

또 다른 옵션은 오류 코드가 열거 형을 나타내는 일부분을 포함하고 나머지는 열거 형 값을 나타냅니다. –

+0

훨씬 간단한 메커니즘은 모든 백엔드 오류가 음수이고 모든 프론트 엔드 오류가 양수임을 정의하는 것입니다. 그 반대의 경우도 마찬가지이며 '오류가 아님'을 0으로 예약합니다. 시스템 오류를 처리하는 방법을 고려하십시오 (1에서 대략 150까지의 'errno'값은 프론트 엔드 또는 백엔드에 나타날 수 있습니다). O/S를 위해 적어도 1..200을 유지하고 이전과 같이 프론트 엔드와 백엔드를 구별 할 수있는 양수 및 음수 값을 유지하려고 할 수 있습니다. 나는 자체 오류에 대해 100과 121 사이의 오류 번호를 사용하는 소프트웨어에서 작업했습니다. 'errno' 만 50 세가되었을 때도 괜찮 았지만 끝이없는 슬픔을 안겨주었습니다. –

답변

2

을 알고 있다면 백엔드가 생성 할 수있는 내용을 알고 있습니다. 아니요, 충돌하지 않도록 신뢰할 수있는 오류 코드를 선택할 방법이 없습니다.

그래서 몇 가지 옵션이 있습니다.

백엔드가 어떻게 든 헤더 파일과 같은 오류 범위를 게시하면 첫 번째는 유용합니다. 솔직히 말하면 프로그램 다른 오류 코드 및/또는 형식을 구분할 수있는 방법이 없으므로이 작업을 수행해야합니다.

이 게시 된 경우이 게시 된 경우 가장 높은 항목을 찾아서 자신의 코드를 선택하여 백엔드를 확장 할 수있는 충분한 공간을 확보하는 것이 간단합니다. 예를 들어 백엔드가 1..100을 사용하는 경우 1000에서 시작합니다. 어떤 시스템이 갑자기 이전 버전보다 10 배 많은 오류를보고 할 가능성은 희박합니다.

두 번째 방법은 충돌 가능성이없는 실제 분리를 원하는 경우입니다.

struct sFrontError { 
    enum fronterr errorCode; 
    enum backerr backendCode; 
}; 

하고 오류가 사용 : 유사한 구조를 반환 당신을 막을 거기에 아무것도

.

enum fronterr {FRONT_OK, FRONT_BACK, FRONT_ERR1, FRONT_ERR2, FRONT_ERR3}; 

을 다음과 같이 당신은 그것을 평가할 수있다 : 그런 다음 프런트 엔드에 대한 열거된다 errorCodeFRONT_OK입니다

  • 경우, 없는 오류가 있습니다.
  • errorCodeFRONT_BACK 인 경우 백엔드에서 오류가 발생했으며 해당 코드는 backendCode에서 찾을 수 있습니다.
  • 그렇지 않으면 프런트 엔드 오류이고 errorCode의 코드는이를 완전히 지정합니다.
+0

비슷한 옵션은 [HRESULT] (http://en.wikipedia.org/wiki/HRESULT)와 같은 체계를 사용하는 것입니다. –

+0

좋은 추가 접근법. 'errorCode'와'backendCode'를 각각'enum'이 아닌'int'로 선언 한 이유가 있습니까? C에서 허용되지만 조금 혼란 스럽습니다. 또 다른 영감의 원천은 유사한 문제를 해결하려고하는 C++ ['system_error'] (http://en.cppreference.com/w/cpp/header/system_error) 헤더 일 수 있습니다. 단, 추가적으로 * multiple * 백엔드)를 표시하는 것과 비슷한 방식으로 수행합니다. – 5gon12eder

+0

@ 5gon12eder : 좋은 점, 그것을 'enum'으로 변경했습니다. – paxdiablo

1

백엔드가 오류 코드의 전체 목록을 노출하는 경우 자신의 프론트 엔드 오류 코드가 분리 된 하위 집합 인 진정한 수퍼 집합을 쉽게 만들 수 있습니다.

/* in backend.h */ 

enum backend_error 
{ 
    BACK_ERR_1, 
    BACK_ERR_2, 
    BACK_ERR_3, 
}; 
/* in frontend.h */ 

#include <backend.h> 

enum frontend_error 
{ 
    FRONT_ERR_1 = BACK_ERR_1, 
    FRONT_ERR_2 = BACK_ERR_2, 
    FRONT_ERR_3 = BACK_ERR_3, 
    FRONT_ERR_4, 
    FRONT_ERR_5, 
}; 

이 방법은 백엔드 오류 코드의 값에 어떤 가정을하지만 백엔드의 이후 버전이 추가 오류 코드를 정의하는 경우, 당신은 씻어 버렸어요 수 있습니다 강요하지 않습니다

. 또 다른 단점은 헤더 파일 #include이 백엔드의 헤더이므로 네임 스페이스를 오염시키고 있다는 것입니다.

사용자가 백엔드를 직접 호출하지 않는 경우, 즉 모든 백엔드 기능에 대한 추상화를 제공하는 경우 자체 오류 코드를 모두 정의하고 백엔드 오류 코드를 자신의 것으로 매핑 할 수 있습니다. 이 함수는 ID 함수가 될 필요가 없으므로 나중에 백엔드를 변경하더라도 항상이 함수를 사용할 수 있습니다. 또한 자신의 구현 파일에서 구현되어 백엔드 네임 스페이스를 사용자의 그림 밖으로 유지할 수 있습니다.

관련 문제