2010-11-19 1 views
5

저는 현재 대학 프로젝트를 위해 C#으로 작은 인공 지능 프레임 워크 (유전 알고리즘/신경망)를 개발 중입니다.어떻게 .NET의 알고리즘 코드에서 주장합니까?

첫 번째 관심사는 재사용 가능한 프레임 워크를 개발하는 것이므로 모든 것을 꽤 모듈화하도록 설계하고 있습니다. 나는이 (공연)에 대한 대가를 지불하고 있다는 것을 알고 있지만, 나는 그것을 잃을 때보 다 더 많은 것을 얻는다는 것을 느낀다. 모 놀리 식 코드 블록에 도입하기 어려운 새로운 것들을 추가하려고 할 때 버그를 발견하고 많은 시간을 낭비).

기본적으로 내 코드, 어설 션의 다른 부분에 대해 많은 검사를하고 싶습니다. 메소드 XI를 실제로 실행하는 경우 올바른 상태인지 확인하십시오. 그런 종류의 어설 션은 개발할 때 유용하지만 릴리스 코드에서 벗어나기를 바랍니다 (즉, 내가 떠나기로 결정할 때). 이 마지막 밤에 내 최종 연구 결과를 얻을). 방법

  1. System.Diagonists.Assert 제품군 :

    나는 이것을 달성하는 여러 가지 방법을 볼 수 있습니다.

  2. 코드 (x)는 다음의 #if의 DEBUG로 둘러싸인 InvalidStateException()을 던져

당신이 그것을 할 것이다 어떻게 그리고 왜 #endif // 이는/갖는 계약합니다?

나는 단위 테스트도 알고있다. (나는 그것들을 사용하고있다.) 또한 코드에 대해서도 어떤 종류의 주장을하고 싶다. 이 방법

Util.Assert(a == b, "a == b"); 

통화 만 할 것이다 : Util라는 클래스에 정의 된 방법을 가정,

[Conditional("DEBUG")] 
public static void Assert(bool condition, string message) 
{ 
    if (!condition) 
     throw new InvalidStateException("Assertion failed: " + message); 
} 

그래서 같이 주장 :

답변

8

는이 같은 정적 인 방법을 사용할 수 있습니다 ConditionalAttribute 덕분에 DEBUG 기호가 설정 될 때 컴파일러에서 방출됩니다. 따라서 어떤 전화도 #if 지시문에 포함 할 필요가 없습니다. 이렇게하면 코드 혼잡이 줄어 듭니다.

는 (방법 자체는 여전히 컴파일 않습니다. 이것은 당신이 다른 어셈블리에서 이러한 방법을 사용할 수 있습니다!)

+1

코드 계약은 비슷한 방식으로 작동하지 않습니까? 나는 당신이 릴리스 모드에서 완전히 해제 할 수 있다고 생각 했었습니다. –

+0

아마도. 솔직히 나는 그것에 익숙하지 않다. 내 대답의 기술은 내가 사용하는 기술이기 때문에 나는 그것을 공유 할 것이라고 생각했다. 코드 계약보다 더 좋든 나쁘지는 말할 수 없습니다. – cdhowie

+0

나는 cdhowie가 말하는 것과 같이 갈 것입니다. 코드 계약은 훨씬 더 많은 것을 제공하지만 아마 당신이 필요로하는 것이 아닙니다. 그래서 올바른 도구 인라인 # if, # else 또는 Debug.Asset()보다는 코드를 인라인으로 어지럽히는 대신 Conditional 특성으로 꾸며진 메서드를 사용한다고 생각합니다. –

0

#if/#endif의 장점은 제거 어설 함수에 대한 호출입니다뿐만 아니라이다, 또한 매개 변수를 준비하는 모든 작업 (부작용이 없으므로 ...).

+2

'[조건부 (...)] '와 동일합니다. – cdhowie