2013-11-01 3 views
0

일부 프로그램 디자인 지침을 찾고 있습니다.libarary 클래스의 예외 처리 디자인

데이터베이스의 데이터를 처리하는 클래스 라이브러리가 있습니다. 나는 사용자가 데이터를 입력하고 관리 할 수있는 프리젠 테이션 레이어 인 winforms 앱을 가지고있다. 예를 들어 사용자가 일부 데이터를 입력하고 저장하려고 시도한다고 가정 해보십시오. winforms 앱에서 나는 다음과 같은 것을합니다 :

MyTool theTool = new MyTool(); 
MyTool.FirstName = this.Textbox1.Text; 
MyTool.LastName = this.Textbox2.Text; 
//etc... 
int result = MyTool.SaveData(); //result is the ID of the inserted record. 

MyTool은 내 클래스 라이브러리에있는 유형입니다. 이 타입 내에서 나는 다음과 같이 나타낼 것입니다.

public int SaveData() 
{ 
    if (IsReadyForInput()) 
    { 
    //..open a DB connection and save out the data 
    //..get the ID of the saved record 
    } 
    else 
    { 
     throw new ArgumentException("One or more arguments prevented saving the data"); 
    } 
    return theID 
} 

private bool IsReadyForInput() 
{ 
    if (this.FirstName.Length == 0) 
    { return false; } 
    if (this.LastName.Length == 0) 
    {return false;} 
    return true; 
} 

이제 예외 처리가 어떻게 작동해야하는지에 대한 가장 좋은 디자인을 살펴 보겠습니다. 예를 들어, 위의 방법은 전혀 구체적이지 않으므로 사용자는 무엇이 잘못되었는지 알지 못합니다. 그냥 문자열 길이를 비교하는 것으로 매우 우아한 (또는 고속) 방법을하지 않는 것 같습니다 그러나

public void SaveData() 
{ 
    string errMess = IsReadyForInput(); 
    if (errMess.Length == 0) 
    { 
     //..open a DB connection and save out the data 
     //..get the ID of the saved record 
    } 
    else { 
     throw new ArgumentException(errMess); 
    } 
    return theID 
} 

private string IsReadyForInput() 
{ 
    if (this.FirstName.Length == 0) 
    { return "Specify a first name"; } 
    if (this.LastName.Length == 0) 
    {return "Specify a last name";} 
    return true; 
} 

오류 메시지를 찾을 수 : 그래서 내가 좋아하는 뭔가를이를 다시 작성할 수 있습니다. 내가 좋아하는 뭔가를 쓰는 시도했다 :

public void SaveData() 
{ 
    ValidateInput(); 
    //..open a DB connection and save out the data 
    return theID 
} 

private void ValidateInput() 
{ 
    if (this.FirstName.Length == 0) 
    { throw new ArgumentException("Specify a first name"; } 
    if (this.LastName.Length == 0) 
    {throw new ArgumentException("Specify a first name"; } 
} 
이 가진 문제는 프론트 엔드는 "위해 SaveData"를 호출 할 때 예외가 실제로 예외가 최고에 도달 그렇게 할 때, ValidateInput에 의해 발생된다는 것이다 나에게

, 그것은 것 (특히 MyTool 내에서 "ValidateInput()"을 호출하는 여러 방법이있는 경우) 명확하지 않게 보입니다.

또한 프런트 엔드에서 예외를 처리하는 가장 좋은 방법은 오류가 발생하면 ID가 반환되지 않기 때문입니다.

나는이 상황과 유효성 검사/오류 처리를 처리하는 방법에 대한 지침을 찾고있는 중이다. 어떤 도움을 주셔서 감사합니다.

답변

1

내가 궁금해 우선 일반적인 제어 흐름이 충분히있을 때 모든 예외를 던질 필요 여부 :

if (IsReadyForInput()) 
{ 
    //..open a DB connection and save out the data 
    //..get the ID of the saved record 
} 
else 
{ 
    //..do whatever you need in case of invalid input 
} 

이 제안에 분명한 문제는 우리가 어디에서하는 방법에 있다는 것입니다 클래스 라이브러리 및 원하는 효과 (사용자에게 경고 표시 등) 중 일부는 WinForms 레이어에서 발생합니다. 그러나 이것은 더 나은 해결책을 제시합니다. 즉, 윈폼 코드의 유효성 검사를 수행하는 :

if (IsReadyForInput()) 
{ 
    int result = theTool.SaveData(); 
    //...and whatever else should happen. 
} 
else 
{ 
    //..do whatever you need in case of invalid input 
} 

위의 접근 방식은 간단하고 (MyTool으로 사용자 입력의 유효성에 대해 신경 쓸 필요가 없습니다) 서로에 대한 프로그램의 부분이 덜 의존하게 예를 들어 예외를 던지거나 특수한 반환 값을 사용하여 실패를 알리는 것과 비교할 때.

0

FluentValidation (http://fluentvalidation.codeplex.com/)을 살펴보십시오. 나는 그것이 당신이 찾고있는 것이라고 생각합니다.

유효성 검사 규칙을 정의하고 유효성 검사 메소드를 호출 할 수 있습니다. 코드에서 예외가 throw되지 않고 잠재적 유효성 검사 오류의 전체 목록을 반환합니다.

+0

많은 분들께 감사드립니다.하지만 모범 사례에 대한 지침을 얻고 다른 사람들이이를 어떻게 처리하는지 궁금합니다. 직접 해결할 수 있습니다. 이것은 데이터 입력을위한 매우 일반적인 구조 인 것 같습니다 ... – rune711

+0

fluentvalidation은 꽤 엉덩이처럼 보입니다. – rune711

+0

=) 좋은 프레임 워크이고 많은 유효성 확인 프레임 워크/패턴은 매우 유사합니다. – ohiodoug