2011-04-26 5 views
1

함수 호출에서 오류 집합과 결합 된 결과를 반환하는 데 어려움을 겪고 있습니다.함수에서 오류 목록과 결과를 반환하는 방법

나는 두 번째 단계는 새로운 클래스를

public class OperationResult 
{ 
    public bool Result {get;set;} 
    public List<string> Errors {get;set;} 

} 

을 소개했다 다음 방법

List<String> errors; 
bool result = Obj.GetResult(out errors, int id); 

에서 시작하지만 더러운 코드는 getResult를 방법 안에 표시하기 시작했다. 예를

public OperationResult GetResult(int id) 
{ 
    if (id == 0) 
    { 
    return new OperationResult { Result = false, Errors = {"Error"}}; 
    } 

    if (id < 400) 
    { 
    var result = new OperationResult { Result = false, Errors = {"Error"}}; 
    if (id >200) 
     result.Errors.Add("Error"); 
    return result; 
    } 
} 

를 들어

은 그 때 나는 그들이 얻을 결과를 편집 할 수없는 결과 사용자를 걱정하기 시작했습니다.

데이터를 읽을 수만있는 OpearationResult 클래스에서 인터페이스를 추출했습니다.

는 지금은 ... 결과 빌더 클래스를 추가 할 수있어

그리고이 시점에서 내가 뭔가를 잘못하고 있어요 생각으로 시작했습니다

. 자전거를 재발 명하려고하거나 공중에서 문제를 일으키고 있습니다.

이 모든 것들을 처리하는 방법에 대해 조언 해주십시오. 함수 프로그래밍 언어에서 어떻게 처리되는지 궁금합니다. (나는 불변성을 의미합니다)

+3

모든 이유는 다음 OperationResult 객체를 생성 구축, 오류의 목록을 설정? –

+0

절대로 예외 남용을 좋아했는데, 이유는 MS가 예외 기반 UI 유효성 검사를 포기하도록 강요 한 것과 같은 이유 일 수 있습니다. – v00d00

+1

throw 문을 과도하게 사용할 수 있습니다. 객체로 예외를 반환하는 것은 좋습니다. bool을 반환하는 메서드는 다른 방법으로는 꽤 나쁜 것입니다. –

답변

3

예외가 발생하기 시작할 수 있습니다.

CustomResult result = myUser.CanLogOn(); 

는 사용하기 쉬운 경우 CanLogOn 단순히 나타내는 부울을 반환해야합니다 코드를 읽고 나타납니다 때문에 그의 책 Clean Code에서 , 혼란 및 읽을 수있는 코드의 부족에 대한 로버트 마틴 회담 당신이 뭔가 같이 할 때 로그온 할 수 있지만, 지금은 오류 코드 등을 가지고 사용자 정의 결과 객체를 얻는 것은 이것은 당신이 더

if(result.Result) 
    LogOn(); 

대신

같은 것들을 사용하여 코드를 오염 원인이됩니다 0

또는 더 나은

myUser.LogOn() 

과 수 아닌지가 결정하게.

이것은 DB 예외와 별도로 CanLogOn() 메서드에서 발생할 수있는 가능한 많은 오류가 없다고 가정하기 때문에 간단한 예제입니다.

정상적인 흐름에는 예외를 사용해서는 안되지만 부분적으로는 출력값 패턴과 반환시 오류 코드를 방지하고 반환 코드와 200의 차이점을 알아야합니다. 402 및 -134.

코드가 더 깨끗하고 읽기 쉽도록 만들고, 모든 예외가 실제로 필요한지 여부를 확인하라는 메시지가 표시 될 수 있으며, 그렇다면이 메서드는 예외를 throw하는 가장 좋은 방법입니다.

이 수정으로
internal class OperationResult 
{ 
    public OperationResult(bool result, List<string> errors) 
    { 
     Result = result; 
     Errors = errors; 
    } 

    readonly bool Result { get; set; } 
    readonly List<string> Errors { get; set; } 
} 

는, 2 개의 속성 만 생성자 내에서 설정할 수 있습니다, 그래서 당신의 고객을위한 방법은 수정할 없음 :

1

여기에 들어가는 혼란을 막기 위해 예외가 만들어졌습니다.

bool을 반환하지 않는 다른 방법 은요?

나는 당신의 접근법에 대한 다른 문제를 생각할 수도 있지만, 주된 것은 다음과 같을 것입니다 : 그것은 훨씬 더 많은 일 (대 던지기)이고 이것으로 실수를 매우 쉽게 할 것입니다. 오류보고 중 오류 ...

1

나는 당신이 필요로하는 보호 수준이 readonly 키워드를 통해 액세스 할 수 있다고 생각합니다. 당신이 좋아하는 그래서 그들을 사용하는, 조금 프로그램을 수정 : 당신이 예외를 사용하지 않을

public OperationResult GetResult(int id) 
{ 
    if (id == 0) 
    { 
    return new OperationResult(false, new List<string>{"Error"}); 
    } 

    if (id < 400) 
    { 
    var errors = new List<string>{"Error"}; 
    if (id >200) 
     errors.Add("Error"); 
    return new OperationResult(false, errors); 
    } 
} 
관련 문제