2010-03-22 3 views
4

우리 회사에서는 시스템이 3 개의 레이어를 갖도록 설계되었습니다. Layer1은 비즈니스 로직 처리를 담당합니다. Layer3은 백엔드 시스템을 호출합니다. Layer2는 두 레이어 사이에 위치하므로 layer1은 백엔드 시스템에 대해 알 필요가 없습니다. layer3에서 정보를 중계하려면 layer2가 layer1에 대한 인터페이스를 정의해야합니다.메쏘드 리턴 타입

예를 들어, layer1은 사용자의 PIN이 올바른지 확인하려고합니다. 그것은 layer2 checkPin() 메소드를 호출 한 다음 layer2가 관련 백엔드 시스템을 호출합니다. checkPin() 결과는 correctPin, inCorrectPin 및 internalError 일 수 있습니다. 현재 우리는 반환 유형 'int'를 정의했습니다. 따라서 layer2가 0을 반환하면 correctPin을 의미합니다. 1이 반환되면 inCorrectPin을 의미합니다. 9가 반환되면 internalError를 의미합니다.

작동합니다. 그러나 나는이 접근에 대해 약간 불안하다. 더 좋은 방법이 있습니까? 예를 들어 열거 형 CheckPinResult {CORRECT_PIN, INCORRECT_PIN, INTERNAL_ERROR}을 정의하고 CheckPinResult 유형을 반환 하시겠습니까?

감사합니다, 사라

+3

각 레이어에서 예외를 사용하십시오. 레이어가 실패하면 해당 예외를 catch합니다. 그렇게하면 어떤 계층이 실패했는지 알 수 있습니다. 제안이기 때문에 답변으로 게시하지 않은 이유는 무엇입니까? –

+0

네, 요점이 있습니다. 우리가 현재하고있는 일은 내부 오류 일 때 오류를 기록하는 것입니다. 예외가있는 경우이를 포착하여 layer1에 기록합니다. Layer2 및 Layer3은 상위 레이어로 에스컬레이션합니다. – sarahTheButterFly

+0

엘리트는 각 레이어에서 사용자 지정 예외를 만드는 것이 무엇이라고 생각합니다. 이것은 비즈니스 예외이며 이것이 우리가하는 일입니다. 또한 API를 사용하여 레이어를 사용하면 외부 개발자가 오류를 처리 할 수 ​​있습니다. –

답변

1

나는 enum 방식을 좋아한다. 자체 문서화가 가능하며 쉽게 확장 할 수 있습니다. 각각의 반환 값을 0, 1, 9 규칙과 일치하도록 설정할 수 있습니다.

예외를 throw하는 것은 확실한 방어 방법이지만 예외를 던지는 것은 값 비싼 일일 수 있습니다. 나는 항상 그들이 예외적 인 상황을 나타내는 데 사용해야한다고 믿었습니다. 나쁜 핀을 갖는 것은 비즈니스 문제에 따라 예외적 일 수도 있고 그렇지 않을 수도 있습니다. 귀하의 프로세스가 핀에 "5 나인"신뢰도를 허용한다면, 예외는 좋은 방법이라고 말할 수 있습니다.

그러나 오류 발생률이 1 % 정도가되면 반환 값이 더 좋을 수 있습니다. 많은 양의 값을 반복하여 실패한 핀이있는 부품 #을 큰 배치로 축적하는 것이 좋습니다. 오류 코드 사용 방법에 따라 다릅니다.

+0

우리 건축가는 분명히 당신과 동의 할 것입니다. 그는 Java 예외 메커니즘을 전혀 좋아하지 않습니다. – sarahTheButterFly

+0

슬프게도 동료들에게 열거 형을 사용하도록 설득 할 수 없었습니다. 그들은 너무 많은 일을 다시 생각한다고 말했습니다. : – sarahTheButterFly

+0

우리는 단일 메서드의 서명을 변경하는 것에 대해 이야기하고 있습니다. 맞습니까? 그렇다면 IntelliJ와 같은 도구에서는 쉽습니다.이 메서드를 몇 번이나 호출합니까? 많이 지원 "할 수있는 정량화 할 수있는 증거가 없다면 – duffymo

1

는 당신이 내부 오류가 합리적인 일반적인 경우인가? 그렇지 않다면 checkPin은 부울을 반환하고 내부 오류가있는 경우 예외를 throw합니다.하지만 그 대신 pinIsValid 또는 이와 비슷한 메서드를 호출 할 수 있습니다.

(어떤 이유로) 내부 오류가 발생할 것으로 예상되는 결과라면 tri-state 열거 형이 잘 작동 할 수 있습니다 (현재 프로젝트에서 비슷한 경우가 있음).

1

열거 형은 확실히 정수 반환 유형 및 완벽하게 유효한 접근보다 개선 된 기능입니다. 또 다른 옵션은 다음과 같은 레이어 2 서명을 갖는 것입니다.

public boolean isPINValid() throws InternalErrorException(); 

내부 오류는 예외이므로 왜 그러한 것으로 처리하지 않을까요?

1

이것은 스타일에 대한 질문입니다. 당신이 묘사 한 방식은 목표를 성취하기위한 일종의 C 스타일입니다. java 스타일은 다음과 같습니다. checkPin (pin)은 부울을 반환해야합니다. 핀이 괜찮다는 것을 의미하는 진정한 의미이며, 거짓이라는 것은 오케이가 아님을 의미합니다. 오류가 발생하면 예외가 발생합니다. 예외는 Java의 오류를 처리하는 표준 방법입니다. 예외는 디버깅을 돕기 위해 형식과 오류 메시지를 가질 수 있기 때문에 유용합니다.

C에서 오류를 처리하는 표준 방법은 정의에 매핑되는 정수를 반환 한 다음 찾고있는 값을 참조로 전달하기 때문에 설명하는 메커니즘이 C 스타일이라고 말합니다 case는 부울).그래서 C에서 당신은 내가 강력 부울을 반환 같은 장소에서 오류 값을 반환하지 않는 것이 좋습니다,

int checkPin(int pin, bool &ans); //returns an error value. 

어느 쪽이든있을 것입니다. 단일 값 (반환 값)이 실제로 한 가지만 나타내야하기 때문에 혼동이 생깁니다. 오류 상태와 질문에 대한 대답은 두 가지이며 서로 다른 채널을 통해 반환되어야합니다.

도움이 되었기를 바랍니다.

+0

하하 .. 알 겠어, C 스타일. 인터페이스를 정의한 내 동료는 C 배경에서 왔어. C 배경에서 사람들이 enum을 사용하도록 설득하는 것. – sarahTheButterFly