2012-03-01 4 views
1

나는 동료와성공/실패 및 메서드에서 개체를 검색 할 때 선택할 패턴은 무엇입니까?

대체

ResultSet<User> result = users.Get(1); 
if(result.OK) 
    Console.WriteLine(user.ToString()); 
else 
    Console.WriteLine("Failed to get user.."); 

대안 A는 int.Parse(string, out value) 같은 행동과 유사하고, 확장하고 읽기 쉬운

User user; 
if (users.TryGet(1, out user)) 
    Console.WriteLine(user.ToString()); 
else 
    Console.WriteLine("Failed to get user.."); 

대안 B를 다른 구현 기술을 논의하고있다. 성공이 쉽고 읽기 쉬운 것처럼 보일 때 더 많은 객체를 출력에 추가합니다.

대체 B는 각 행에 더 많은 코드가 있다는 점에서 조금 더 복잡한 것처럼 보입니다. 그러나 다른 정보를 ResultSet에 포함하고 객체를 다시 포함 할 수 있습니다. 해결 방법과 관련하여 하나 이상의 객체 또는 아이디어를 반환하는 것이 더 어렵습니까?

그런 매개 변수를 사용하는 것은 바람직하지 않거나 나쁜 습관으로 간주됩니까?

+0

가져 오기 전에 사용자가 존재하는지 확인하지 않으시겠습니까? – RvdK

답변

2

일반적으로 Microsoft discourages using out-parameters in public methods. 메소드가 그 이름으로 식별 된 작업을 수행하지 못하면 예외를 throw하는 것이 적절한 접근 방법입니다. 이 경우 Get 메서드가 이 아닐 경우 데이터 레코드를 가져 오는 경우 예외가 발생해야합니다. 이 상황이 자주 발생하는 경우 매번 예외를 throw하는 것과 달리, 대안 B를 사용하여 성능을 약간 향상시킬 수 있습니다.
대체 A의 경우,이 경우 FCL 명명 규칙 (TryParse, TryGetValue 등)과 일치하도록 메서드의 이름을 TryGet으로 지정해야합니다.

+0

TryGet 예 :) +1 – Makach

0

이러한 두 가지 방법의 문제점은 사용자를 검색하지 못한 이유를 알 수 없다는 것입니다. 예를 들어

, 당신의 Get 또는 TryGet 방법은 다음과 같이 보면 ...

public bool TryGet(int userId, out User user) { 
    try { 
     var conn = CreateDbConnection(); 
     var myUser = GetUser(userId, conn); 
     user = myUser; 
     return true; 
    } 
    catch { 
     return false; 
    } 
} 

... 당신은 사용자를 검색하는 동안 오류가 무엇인지 알 방법이 없습니다.

public MyUser GetUser(int userId) { 
    MyDbConnection conn; 
    try { 
     conn = CreateDbConnection(); 
    } 
    catch (Exception ex) { 
     throw new Exception("The DB connection could not be created.", ex); 
    } 
    MyUser myUser = GetUser(userId, conn); 
    if (myUser == null) 
     throw new Exception("No user exists with the ID '" + userId + "'."); 
    return myUser; 
}  

그런 식으로, 당신은 실패 무엇을 알고, 당신이 : 아마 DB 연결을 만들 수 없습니다, 아마 어떤 사용자는 등

더 좋은 방법이 될 수도, 지정된 ID와 존재하지 않는 체인을 더 자세히 기록하는 더 좋은 메시지입니다.