2011-12-08 4 views
-4

참고로 에 대해 this question을 고려해야합니다.매개 변수의 유효성을 검사하는 올바른 순서는 무엇입니까?

public void DoSomething1(Dictionary<string, string> param1, Object param2) 
{ 
    if (null == param1) 
     throw new ArgumentNullException("param1"); 
    if(!param1.Keys.Contains("somekey")) 
     throw new ArgumentException("param1 must contain key \"somekey\""); 
    if(null == param2) 
     throw new ArgumentNullException("param2"); 

    // now we do some stuff 
} 

public void DoSomething2(Dictionary<string, string> param1, Object param2) 
{ 
    if (null == param1) 
     throw new ArgumentNullException("param1"); 
    if (null == param2) 
     throw new ArgumentNullException("param2"); 
    if(!param1.Keys.Contains("somekey")) 
     throw new ArgumentException("param1 must contain key \"somekey\""); 

    // now we do some stuff 
} 

두 방법 모두에있어서의 내부 동작에 동일한 보호를 달성한다 :

는 예를 들어 다음과 같은 두 가지 단편을하자. 내 질문은

...

방법에 전달 된 매개 변수를 테스트하는 올바른 방법/순서가 (예 :이 예에서와 같이) 란 무엇입니까?

답변을 백업 해주십시오.

+3

나는 이것이 "올바른 접근법"이라고 생각하지 않습니다. 이 경우 실제로는 선호의 문제처럼 보입니다. –

+0

올바른 접근 방식이 합리적입니다. 예를 들어, param1에 대한 null 예외는 코드 샘플에서 수행하는 것처럼'Contains()'를 호출하기 전에 먼저 검사해야합니다. –

+0

나는 둘 다 이해한다; param2의 유효성을 검사하기 전에 param1의 유효성을 완전히 검사해야합니까? 또는 테스트에서 가장 단순한 예외에서 복잡한 예외로 진행해야합니까? –

답변

0

"올바른 순서"가 없습니다.

완벽하게 구현됩니다. 즉, 매개 변수가 null 인 것을 다시보고하는 것이 더 중요합니까? 아니면 매개 변수에 대해 자세히 조사하는 것이 더 중요합니까?

내가 이것을하고 있다면 나는 "성능"접근 방식을 취할 것이다. 즉, 먼저 모든 필수 매개 변수가 null이 아니 었는지 테스트 한 다음 각 매개 변수를 열어 내가 원하는 것을 얻었는지 확인합니다. 사전이 키를 포함하는지 여부를 테스트하는 것보다 null 참조 검사를 수행하는 것이 더 빠릅니다 (약간).

물론이 방법이 초당 수백 번 호출되도록 예정되어 있고 null 매개 변수가 전달 될 가능성이있는 경우에만 걱정할 수 있습니다. 제한된 영향을 미치는 메소드의 경우 호출자가 먼저 알아야 할 필요가있는 부분을 고수 할 것입니다.

+0

나는 당신과 같은 의견하에 있습니다. 그러나 * 모든 사례의 실적을 통해 testin의 "우수 사례"를 수립하는 것이 공정한가? –

+0

@ davids : 아니요. 더 나은 성능을 낼 수 있도록 코드를 작성할 수있는 많은 방법이 있습니다. 그러나 성능이 우수한 코드는 읽기 어려운 코드로 이어질 수 있습니다. 이 관점에서 사례별로 가독성보다 성능이 더 중요한지 여부를 결정해야합니다. – NotMe

+0

또 다른 이유는 편도로 작성된 코드와 다른 코드에서 작성된 코드의 성능 차이가 애플리케이션 실행에 별다른 영향을 미치지 않을 수도 있다는 것입니다. 예를 들어, 예제의 코드가 최대 한 시간에 한 번 실행되는 경우이 방법으로 코드를 최적화하는 것은 의미가 없습니다. 그러나 수백 또는 수천 초에 한 번 실행하면 고도로 최적화 된 것과 최적화되지 않은 것의 차이가 실제로 성능 목표를 달성하는 데 필요한 하드웨어에 재정적 인 영향을 미칠 수 있습니다. 그렇기 때문에 공통된 모범 사례는 필요한 경우에만 최적화하는 것입니다. – NotMe

관련 문제