2012-05-08 1 views
0

파일 캐시 (타사 API에 대한 요청 결과를 나타내는 각 파일) 역할을하는 WCF 서비스를 상속 받았습니다. 현재 파일이 존재하지 않으면 코드는 데이터를 생성하기위한 새로운 요청을 만들고 클라이언트 코드에 대한 예외도 발생시킵니다.GetValue() 메서드가 실패 할 경우 오류 발생

저는 클라이언트가 파일을 다시 요청하기 위해 다시 왔을 때 파일을 생성하는 데 몇 초가 걸릴 것이라고 생각합니다.

여기 코드 냄새가 있으며이 부분을 다시 작성해야한다고 생각합니다. 현재로서는 예외가 잡히고 몇 가지 방법으로 거품이 발생합니다. 파일이 있는지 여부를 소스에서 확인하고 해당 정보를 호출 스택 위로 전달해야한다고 생각합니다.

  1. 반환 null를 파일이 존재하지 않는 경우 : WCF 인터페이스에서

    나는 현재 두 가지 옵션이 있기는하지만 나는 그것을 대체하는 데 사용할 수 있다고 생각하는 GetValue() 방법이있다.
  2. bool TryGetValue(string key, out string value) 방법
  3. 를 사용

사람이 어떤 환경 설정/권장 사항이 있습니까?

감사합니다.

+0

왜 멋진 오류가 사용자에게 전송 될 수있는 오류 예외를 시도하지 않습니까? – Deepesh

답변

1

"TryGet"접근 방식은 좀 더 명확합니다. null 반환 방식을 사용하면 개발자가 해당 문서를 읽어야한다는 등의 이유로 메소드가 null을 반환한다고 문서화해야합니다. 우리 모두 아시다시피, 일부 사람들은 문서를 읽는 것에 알레르기가 있습니다.

"TryGet"접근법의 또 다른 이점은 bool이 아닌 enum을 사용하여 메서드가 실패한 이유와 방법에 대해 호출자에게 더 많은 정보를 제공 할 수 있다는 것입니다.

Jeffrey Richter 's (CLR in C#) 예외 정의 : 작업 멤버가 작업을 완료 할 수 없으면 예외를 throw해야합니다. 예외는 조치 구성원이 이름에 표시된대로 수행해야하는 타스크를 완료하지 못했음을의 L합니다. 내 질문은 클라이언트에서 사용할 수있는 GetValue 메서드를 유지해야하며 데이터를 사용할 수 없거나 제거하고 TryGetValue()로 바꿀 때 오류가 발생해야합니까? 당신이 당신의 API의 디자인을 결정할 때 각 액션 구성원의 작업을해야 어떤 결정 포함되어 있기 때문에

제프리 리히터의 정의는 없습니다 도움이됩니다.

디자인에서 당신은 당연히 값을 사용할 수 없기를 기대합니다. 즉, 값을 사용할 수없는 예외적 인 상황이 아닙니다. 따라서 TryGet ... 패턴을 사용합니다.

그러나 진실을 말하면 나는 다른 접근 방식을 모두 추구 할 것입니다.

while (!TryGetValue(key, out value)) {} 

나 :

SomeType value; 
bool flag = false; 
while (!flag) 
{ 
    try 
    { 
     value = GetValue(key); 
     flag = true; 
    } 
    catch {} 
} 

귀하의 WCF 서비스가 안타를 많이 얻을 것입니다 가정하자 누군가가이 방법을 시도합니다.비동기 모델을 살펴 보는 것이 더 나을 것입니다. 따라서 서비스를 계속 폴링하도록 클라이언트를 초대하는 대신 결과가 준비되면 클라이언트가 콜백을 통해 통지됩니다.

+0

Jeffrey Richter (C#의 CLR) 예외 정의 : 작업 멤버가 작업을 완료 할 수 없을 때 멤버는 예외를 throw해야합니다. 예외는 조치 구성원이 이름에 표시된대로 수행해야하는 타스크를 완료하지 못했음을의 L합니다. 내 질문에 클라이언트에서 사용할 수있는 GetValue 메서드를 유지하고 데이터를 사용할 수 없거나 제거하고 TryGetValue()로 바꿀 때 오류가 발생합니다? – openshac

+0

@openshac 위의 의견에 대한 답변을 추가했습니다. – phoog