2011-01-20 4 views
14

StyleCop 규칙 SA1600은 모든 유형 멤버에게 자체 문서 헤더가 있어야합니다. 나는 그것이 꽤 합리적이라고 생각하고 나는이 규칙을 좋아한다. 그러나 우리는 다음과 같은 계층 구조가 있다고 가정 : 여기StyleCop SA1600 규칙 및 인터페이스 구현

/// <summary> 
/// Documentation for interface ISomeModule. 
/// </summary> 
interface ISomeModule 
{ 
    /// <summary> 
    /// Documentation for DoA. 
    /// </summary> 
    void DoA(); 

    /// <summary> 
    /// Documentation for DoB. 
    /// </summary> 
    void DoB(); 
} 

/// <summary> 
/// Documentation for StandardModule. 
/// </summary> 
class StandardModule : ISomeModule 
{ 
    private readonly SomeCoolType _value; 

    /// <summary> 
    /// Documentation for constructor. 
    /// </summary> 
    public StandardModule(SomeCoolType value) 
    { 
     _value = value; 
    } 

    // SA1600 violation here! 
    public void DoA() 
    { 
     // realisation of DoA(). 
    } 

    // SA1600 violation here! 
    public void DoB() 
    { 
     // realisation of DoB(). 
    } 

    /// <summary> 
    /// Documentation for MyOwnDoC. 
    /// </summary> 
    public void MyOwnDoC() 
    { 
     // realisation of MyOwnDoC(). 
    } 
} 

을, 나는 완전히 문서화 인터페이스 멤버는 DOA()와 DOB(), 우리는이 방법을 정확히 인터페이스 문서에서 무엇을 알고있다. VS Intellisence도이를 알고 있으며 StandardModule 클래스에서도이 메서드 위로 마우스를 가져 가면 메서드에 대한 설명을 볼 수 있습니다. 따라서 인터페이스에서 파생 된 클래스로 문서를 복사 할 필요가 없습니다. 그러나 StyleCop은 그것을 요구합니다. 왜? 아무도 몰라? 인터페이스에서

1. 복사 문서 : 우리는이 문제를 해결하려고하면

, 우리는 4 개 가지 방법으로 갈 수 있습니다. 여기서 문제는 문서를 복사 할 때 인터페이스 동작이 변경되면 모든 파생 클래스에서 설명서를 업데이트하는 문제를 해결할 것입니다.

2. SuppressMessageAttribute과 함께 메시지를 표시하지 않습니다. 음, "Ok, SuppressMessageAttribute를 사용할 수 있습니다"라고 말하면 내가 동의하지 않는이 위반을 억제한다고 가정 해 봅시다. 그리고 규칙 SA1600에 대해 SuppressMessageAttribute 클래스 StandardModule 앞에 덧붙입니다. 그러나 이제 StyleCop은 StandardModule 클래스의 문서 헤더를 전혀 검사하지 않습니다. 우리가 생성자와 다른 방법을 가지고 있기 때문에 나는 그것을 원하지 않는다. 지역에

3. 나누기 클래스는 우리는이 개 지역에 클래스 StandardModule을 나누어에만 인터페이스 ISomeModule를 구현하는 부분에 메시지 억제를 사용할 수 있습니다. 그리고 모든 부분을 하나의 파일에 배치해야한다고 생각합니다. 나는이 접근 방식을 가장 좋아합니다. (# 4 이후), 이제는 한 클래스의 여러 부분을 다뤄야합니다.

4. 규칙 SA1600을 수정하십시오. 규칙 SA1600을 자체적으로 구현하여 클래스 멤버가 기본 클래스 또는 인터페이스에 문서화되었는지 여부를 고려할 수 있습니까? (여기에서는 StyleCop에 대한 자체 규칙을 작성할 수 있는지 묻지 않습니다. 가능하다고 알고 있지만 StyleCop 엔진이 일부 멤버가 인터페이스 또는 기본 클래스에서 왔는지 확인할 수 있는지 여부를 나타냅니다.)

인터페이스 구현시 SA1600 문제를 해결하는 가장 좋은 방법은 무엇입니까?

+1

+1 잘 쓰여진 고품질의 질문입니다. –

답변

7

곧 출시 될 StyleCop 4.4.1 릴리스는 inheritdoc 태그를 지원해야합니다. 이 태그를 지원하는 문서 생성 도구 (예 : Sandcastle 또는 FiXml)를 사용하려는 경우 두 가지 문제를 모두 해결할 수있는 효과적인 해결책이있을 수 있습니다.

+0

+1 잘 몰랐습니다. 이걸 직접해볼거야. – Filburt

+1

좋아요! BTW,이 기능에 대한 링크는 다음과 같습니다. http://stylecop.codeplex.com/workitem/6637. 우리가 사용할 수있는 좋은 소식 4.4.1 미리보기! –

+0

VS 2008 Intellisence는 inheritdoc 태그를 좋아하지 않습니다. inheritdoc 태그가있는 멤버를 앞에 붙이면 VS 2008에서 마우스로 가리키는 멤버의 인터페이스 문서가 표시되지 않으므로 멤버 서명 (이름, 매개 변수, 반환 유형). 아마도 VS 2010에서는 inheritdoc을 올바르게 처리하는 방법을 알고 있습니까? 무엇을 할 수 있습니까? –

8

내가 항상이 인터페이스의 구현의 문서 이외의 다른 무언가와 같은 인터페이스의 선언의 문서를 간주하기 때문에이 문제가 될 것이라고 나에게 발생하지 않았다.

내가 틀릴 수도 있지만 배우게되어 기쁩니다.

내 질문에 대한 실제 답변은 다음과 같습니다. 1) 복사 인터페이스에서 설명서 번역.

+0

그럼 클래스 문서를 인터페이스 문서에 동기화 된 상태로 유지해야하므로 코드를 변경하고 작성하는 과정에서 한 단계 더 추가해야합니다. 나는 문서가 두 배로 늘어나고 있다고 생각하며, 코드가 두 배가되는 것을 피하려고한다면 왜 문서와 같은 다른 것을 두 배로 늘리고 싶습니다. 배가시키는 것은 나쁘다 :) –

+0

@ 드미트리 나는 두 배가 악하다고 동의한다. 하지만 인터페이스를 변경하면 구현을 변경하는 것과 마찬가지로 문서를 업데이트해야합니다. 나는 그것이 일어날 수있는 방법에 관해서 두 번째로 일어날 것으로 가정되는 것을 문서화하는 것으로 첫 번째 것을 봅니다. 반복적으로 자신을 반복하지 말고 Robert "삼촌 Bob"C. Martin의 "Clean Code"라인을 생각해 보면 메시지를 표시하지 않는 것이 가장 좋습니다. – Filburt

+0

@Dmitry 실제로 코드에 아무런 가치도 부여하지 않는 규칙을 준수해야하는 방식으로 살펴보면 대답은 명확해야합니다.이 규칙을 사용하지 않고이 규칙을 끄거나 사용하지 말고 거짓말 한 문서로 끝나야합니다. – Filburt

관련 문제