2010-06-11 5 views
1

는 어설 션과 코드의 가독성이 아닌 코드 중복은 여러 곳에서 나는 그렇게 같은 동일한 조건에 대해 확인하는 Debug.Assert 사용 : 실제 목록 있지만,Debug.Assert-s가 동일한 오류 메시지를 사용합니다. 이 변수를 정적 변수로 승격시켜야합니까? 내가 사랑하는

Debug.Assert(kosherBaconList.SelectedIndex != -1, "An error message along the lines - you should not ever be able to click on edit button without selecting a kosher bacon first."); 

이 실제 버그에 대한 응답입니다 정결 한 베이컨을 포함하지 않습니다. 어쨌든, 나는 두 가지 방법을 생각할 수 있습니다

private static readonly mustSelectKosherBaconBeforeEditAssertMessage = 
    "An error message along the lines - you should not ever be able to " + 
    "click on edit button without selecting a something first."; 
... 
Debug.Assert(
    kosherBaconList.SelectedIndex != -1, 
    mustSelectKosherBaconBeforeEditAssertMessage) 

또는 :

if (kosherBaconList.SelectedIndex == -1) 
{ 
    AssertMustSelectKosherBaconBeforeEdit(); 
} 
... 
[Conditional("DEBUG")] 
private void AssertMustSelectKosherBaconBeforeEdit() 
{ 
    // Compiler will optimize away this variable. 
    string errorMessage = 
     "An error message along the lines - you should not ever be able to " + 
     "click on edit button without selecting a something first."; 

    Debug.Assert(false, errorMessage); 
} 

이상 둘 중 하나보다 짜증 세 번째 방법이? 공유하십시오. 일반적인 유용한 정보도 환영합니다.

+1

는 제목에서 "C 번호"와 같은 태그를 보관하십시오. 태그에 남겨주세요. –

답변

3

첫 번째 (반복적 인) 양식을 사용하십시오. 이것에 대한

이유는 다음과 같습니다

  • 그것은 적은 작업입니다. 어설 션은 디버그 전용이므로 반복으로 인해 릴리즈 빌드에 비효율적 인 부분이 추가되지는 않습니다. 이미 완벽하게 읽기 쉽고 기능적 일 때 "꽤"또는 "우아한"코드를 만들려고 시간을 낭비하지 마십시오.

  • 나는 실제로 당신의 대안보다 더 짧고, 읽기 쉽고, 유지 보수가 쉽다고 주장 할 것입니다.

  • 디버거에서 Assert를 눌렀을 때 코드에 전체 메시지를 포함하면 어설 션의 의미를 알 수 있으므로 매우 유용합니다. 많은 프로그래머가 Assert (kosherBaconList.SelectedIndex! = -1); 아무런 설명도없이 코드를 작성하면 괜찮습니다.하지만 다른 사람의 Assert를 치면 어떤 코드인지 알 수 없습니다. 을 의미합니다. 즉, 나는 당신의 방법을 "잘못"이라고 불렀다. 그러나 그것이 "옳다"라고 말하기 위해 고쳐야 만하는 것은 무엇인가? 따라서 assert 메시지는 문제가 무엇인지, 그리고 Assert() 호출을 응시하는 사람이 문제를 해결하기 위해 수행해야하는 작업을 나타냅니다. 디버거가 테스트 실행 중간에 멈 추면 바로 앞에 놓기를 원합니다.

  • 때때로 어설 션이 발생한 컨텍스트와 관련된 추가 정보를 추가하는 것이 유용하므로 코드를 디버그하지 않아도 3 가지 "동일한"어설트 중 어느 것이 실패했는지 확인할 수 있습니다. . 저는 종종 "BaconManager.Cook : 선택해야합니다 ..."와 "BaconManager.Wrap : 선택해야합니다 ..."와 같은 어설트 텍스트를 사용합니다.

  • 텍스트를 Assert 호출에 포함하면 릴리스 빌드로 컴파일되지 않습니다. 그러나 정적 변수로 만들 자마자 릴리스 빌드에 (사용되지 않은) 문자열을 포함시켜 디버깅 쓰레기로 막습니다.

두 개 이상의 조건을 검사하여 개체의 유효성을 테스트하려는 경우 서브 루틴을 사용할 수 있습니다. 즉

[Conditional("DEBUG")] 
private void AssertValidity() 
{ 
    Debug.Assert(kosherBaconList.SelectedIndex != -1, "Nothing selected in kosher bacon list"); 
    Debug.Assert(kosherBaconList.COunt > 0, "kosher bacon list is empty!"); 
} 
+0

+1 : 동일한 오류 메시지 _sucks_를 사용하는 17 개 장소에서 어떤 오류가 실패했는지 추적합니다. – Stephen

1

간단하게 유지하면 static mustSelectKosherBaconBeforeEditAssertMessage = " "으로 갈 것입니다. 인라인 문자열의 경우에도 약간의 차이가있을 수 있습니다.

AssertMustSelectKosherBaconBeforeEdit()은 미숙/미세 최적화와 너무 비슷합니다.

+0

"" "AssertMustSelectKosherBaconBeforeEdit()은 조숙/미세 최적화와 너무 비슷합니다." "- 자세하게 설명하십시오. 오류 대화 상자가 표시 될 때 효율이 중요하지 않음을 의미합니까? 코멘트를 삭제해야합니까? 나는 또한 가독성에 관심이있다. –

+0

그런데이 경우 메시지는 동일합니다. 변수/메소드 이름에 대한 주석? –

0

하나 개 이상의 제안 : 다소 정적 변수보다 그것을합니다

private const string mustSelectKosherBaconBeforeEditAssertMessage = 
    "An error message along the lines - you should not ever be able to " + 
    "click on edit button without selecting a something first."; 

정적 판독 전용 VS CONST에 상세 : http://blogs.msdn.com/b/csharpfaq/archive/2004/12/03/274791.aspx

차는하다는 정적 값 readonly 필드는 실행시에 시간으로 설정되며, 따라서 값 const 필드는 컴파일 시간이 상수로 설정됩니다. 또한 여기

: http://msdn.microsoft.com/en-us/magazine/cc300489.aspx

+0

이유를 자세히 설명해주십시오. Const은 일종의 정적입니다. 맞습니까? "Effective C#"은 const와 readonly 항목을 가지고 있으며 때때로 읽기 전용을 선호합니다. –

+0

@ Harnish, 좀 더 많은 정보로 내 소식을 업데이트했습니다. – code4life

관련 문제