0

내 소프트웨어를보다 견고하게 만드는 코드를 작성하는 것이 싫다. 이것은 프레임 워크가해야만했던 것입니다! 그렇다면 누구나 코드를 확고히하는 코드 "향상"유틸리티에 대해 알고 있습니까?강력한 코드 프레임 워크?

나는 다음과 같이 일하는 것이, 이런 식으로 자신을 무언가를 창조했다 경우 : 당신이 디버그 플래그는 자동 - 마술 각 방법에 대한 코드를 추가합니다 "응고"것이라고하여 코드를 컴파일 할 때 :

try-catch를 사용하여 코드를 왜곡하고 catch에 Debug.Assert (true)를 넣어 예외가 원래 위치에서 발견되도록합니다.

"ToString()"인수 값을 인쇄하여 각 메소드의 항목을 기록하므로 진행 상황을 추적 할 수 있습니다.

각 인수가 null인지 확인하십시오.

"IsValid"프레임 워크를 사용하여 개체 자체와 각 인수를 확인합니다. 여기서 IsValid()는 개체의 기대 값이 참임을 선언하는 방법입니다 (예를 들어, 내가 항상 TableOfContentsEntry 인 경우 IsValid()와을의 책이 IsValid의 페이지를 가리 키도록().

그래서, 왜?

+0

또한 이러한 프레임 워크에 포함되어야하는 사항에 대한 제안을 듣고 싶습니다. 포커스는 C#에 있으며, 분명히 정적 코드 검사 규칙에 추가됩니다. – Avi

답변

1

메서드 호출을 기록하려면 PostSharp과 같은 AOP 프레임 워크를 사용할 수 있습니다. 메소드 시행 전/후행 조건과 같은 사항은 .net4.0과 함께 제공되는 새로운 Code Contracts 라이브러리와 같은 설계 별 메커니즘을 사용하여 가장 잘 이루어집니다. 메서드에 따라 유효한 값일 수 있으므로 null 인수를 확인하는 것은 의미가 없습니다. 디버그 삽입.소스 함수에서 예외를 처리하고 싶지 않거나 처리 할 수 ​​없으므로 코드에 대한 어설 션은 문제가 될 수 있습니다. 이런 종류의 일을위한 일반적인 프레임 워크를 만드는 것은 불가능하지는 않을지라도 프로젝트간에 요구 사항이 크게 다를 것이므로 실용적이지 않을 것이라고 생각합니다.

편집 : - 방법으로 디버그 주장을 추가하는 방법에 대한 내 의견을 명확히하기 위해 나는 이런 일에 메소드 본문을 변환 할 수 귀하의 제안을 읽어

public void SomeMethod(args) 
{ 
    try 
    { 
     //original method body 
    } 
    catch(Exception ex) 
    { 
     Debug.Assert(false); 
     throw; 
    } 
} 
이의 문제가 어설 즉

일을 표시하는 거짓이되어서는 안된다. 그래서이 구조는 결코 그 방법이 결코 진실이 아닌 것을 던질 수 없다는 것을 의미한다. 문제는 이제 메서드가 throw하는 경우 호출하는 메서드가 예외를 적절하게 처리하는 경우에도 어설 션이 실패합니다. 귀하의 코멘트에서 당신이이 같은 일을 보인다 :

public void SomeMethod(object arg) 
{ 
    Debug.Assert(arg != null); 
    if(arg == null) throw new ArgumentNullException("arg"); 

    //rest of method 
} 

이 유용한 연습을, 나는 코드 계약 라이브러리가 지원하는 '레거시'전제 조건은 정적 분석 (예외를 던지는) 확인 있다고 생각합니다.

+0

감사합니다. 훌륭한 참고 문헌이 있습니다. IMHO Debug.Assert는 예외를 발생시키지 않으며 문제가 감지되는 지점 근처에서 실행을 중지하는 중요한 이점을 제공합니다. 문제는 런타임에 "죽는다"는 것이고, 오류가 발생하면 그 값은 그대로 유지됩니다. 그래서 내가 시작한 것은 : #region ArgCheck bool badCond = (theArgument == null) // 예 : Debug.Assert (! badCond); if (badCond) 새 예외 발생 ArgumentNullException(); #endregion ArgCheck 가난한 프로그래머의 해결책. 그러나이 코드를 단계별로 실행하면 그 영역이 확장된다는 것을 귀찮게합니다. – Avi

0

나는 뭔가 그렇게하고 있다면, 그것은 확인하십시오 사용할 수 없습니다 의심한다. 그것을 당신의 규칙 정의에 달려 있고, 다른 사람들은 다르게 생각하고, 다른 필요와 프레임 워크를 가지고 있습니다 ... 설명 된 것들은 메타 프로그래밍이나 매크로 시스템에 의해 달성 될 수 있습니다. In J ava, 그런 접근법을 구현하는 데 도움이 될 수있는 몇 가지 프로젝트가 있습니다. 주석을 사용하고, C# 유니버스에 상응하는 것이 있는지를 모릅니다. 그러나 isValid() 기능은 계약 개념에 의한 디자인과 매우 비슷하게 보이기 때문에 프레임 워크가 있습니다.

+0

Safari Books Online의 Peter Vogel이 ".NET에서 실용적인 코드 생성"을 "거친 커팅"(예 : 미리보기) 한 것을 보았는데 왜 코드를 생성하는지 생각하기 시작했습니다. 그런 다음이 유효성 검사를 제거하면 수작업이 큰 도움이 될 것입니다. 그래서 누군가가 그 일을하고 있는지 궁금합니다. 그리고 "규칙/정의"등 - 이것은 정적 코드 분석과 FxCop과 같은 규칙 시행 도구에 의해 해결되었습니다. 분명히 그러한 프레임 워크는 구성 가능해야합니다. – Avi

+0

정적 분석은 일부 메트릭을 사용하지만 컴파일러의 일부일 경우 아무것도 증명하지 않는다는 것을 잊지 마십시오. 코드 생성은 한 가지 방법입니다. –

1

제 책이 막혀있는 것을 보는 것이 좋습니다. 큰 문제는 코드 생성이 개발자 코드 옆에있는 것을 목표로해야한다는 것입니다. 이상적으로 생성 된 코드는 개발자 코드와 섞이지 않을 것입니다. 이 'solidfying'코드를 부분 클래스 또는 클래스와 클라이언트 사이에 설정하는 프록시로 추가 할 수있는 방법이 있는지 궁금합니다. 물론 코드를 생성하여 개발자 코드에 삽입하는 것이 가능하지만 개발자가 변경하고 "soldifying"코드를 재생성 할 때 일종의 규칙을 작성하여 도구가 이전 코드를 삭제할 수 있도록해야합니다 개발자 코드의 최신 버전을 기반으로 새 코드를 생성 할 수 있습니다.

1

뭔가를 작업자 스레드에 전달할 때 스택을 잃지 않는 무언가를 좋아할 것입니다. 나는이 문제를 해결할 방법조차 모른다 (C#). 상위 스레드의 스택을 알고 작업자 스레드가 생성 된 지점까지 알면 좋을 것입니다.

일반적으로 나는 정말로 유용한 것들이 언어에 내장 될 필요가 있고 라이브러리 나 프레임 워크만으로는 깨끗하게 달성 될 수 없다고 생각합니다. 고등학교 때 그들은 항상 함수에 대한 주석의 사전/사후 조건을 작성하도록 가르쳤지 만 컴파일 타임에 가능한 경우 사전/사후 조건을 쓰고 싶습니다. 실행 시간. 에디터가 옵션을 표시하거나 숨겨서 실제 코드를 읽지 못하게하는 등의 방법으로 플래그를 지정할 수 있습니다.