사용자를 생성하는 작업이 있다고 가정합니다. 지정된 전자 메일 또는 사용자 이름이 있으면이 작업이 실패 할 수 있습니다. 실패한 경우 정확히 이유를 알아야합니다. 내가보기에 이것을하는 세 가지 접근법이 있으며 나는 확실한 승자가 있는지 궁금해하고 있습니다.가장 바람직한 디자인은 test-create, try-create, create-catch입니까?
class User
{
public string Email { get; set; }
public string UserName { get; set; }
}
그리고 작업을 만들 달성의 3 가지 방법이 있습니다 :
이
if (UserExists(user)) act on user exists error;
if (UsernameExists(user)) act on username exists error;
CreateUser(user);
UserExists 및 UsernameExists을 테스트-만들기에 요청 만든다
그래서, 여기에 클래스 사용자입니다 db 서버가 유효성 검사를 수행합니다. 이러한 호출은 API가 올바르게 사용되도록 CreateUser에서 다시 반복됩니다. 유효성 검사에 실패하면 두 경우 모두 ArgumentOutOfRangeException을 throw합니다. 그래서 성과가 있습니다.
enum CreateUserResultCode
{
Success,
UserAlreadyExists,
UsernameAlreadyExists
}
if (!TryCreate(user, out resultCode))
{
switch(resultCode)
{
case UserAlreadyExists: act on user exists error;
case UsernameAlreadyExists: act on username exists error;
}
}
이 패턴은 한 번만 검증을 수행을 시도-만들기, 그러나 우리는 좋은 습관으로 간주되지 않습니다 소위 오류 코드를 사용하여 리조트.
try
{
CreateUser(user);
}
catch(UserExistsException)
{
act on user exists error;
}
catch(UsernameExistsException)
{
act on username exists error;
}
내가 여기에 오류 코드를 사용하지 않는 잡기 만들기,하지만 지금은 모든 경우에 대해 별도의 예외 클래스를 만들어야합니다. 그것은 다소 예외가 어떻게 사용되어지기를 원하지만 enum 엔트리 대신 별도의 예외를 만드는 것이 가치가 있는지 궁금합니다.
그래서 우리는 확실한 승자가 있습니까? 아니면 더 맛이 좋은가요?
관심을 가질만한 곳 Raymond Chen의 블로그 게시물 [ "Cleaner, elegant and wrong"] (http://blogs.msdn.com/b/oldnewthing/archive/2004/04/22/118161.aspx) 및 "더 깨끗하고, 우아하고, 알아보기가 더 힘듭니다"(http://blogs.msdn.com/b/oldnewthing/archive/2005/01/14/352949.aspx), 오류 코드 예외보다 낫다. – ruakh
다른 외부 참조는 무엇입니까? 나는 매우 흥미 롭다. – QED