2011-01-20 23 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クラスのドキュメンテーションヘッダーのチェックをやめます。コンストラクタや他のメソッドがあるので、私はそれを望んでいません。我々は2つの領域にクラスStandardModuleを分割のみインターフェイスISomeModuleを実装部にメッセージ抑制を使用することができる領域に

3分割クラス、 。そして、私はすべての部分を1つのファイルに配置する必要があると思います。私はこのアプローチが大好きです(#4の方法の後)が、今は1つのクラスの複数の部分に対処する必要があります。

4.ルールSA1600を変更します。ルールSA1600の独自の実装を作成して、クラスメンバーが基本クラスまたはインタフェースで文書化されたかどうかを考慮に入れることは可能ですか? (ここで私はStyleCopのための独自のルールを書くことができるかどうかは尋ねませんが、できることは分かりますが、StyleCopエンジンが一部のメンバーがインターフェースクラスかベースクラスかをチェックできるかどうかを意味します)。

インターフェイスの実現に関するSA1600の問題を解決する最も好ましい方法は何ですか?

+1

+1よく書かれた質の高い質問です。 –

答えて

7

今後のStyleCop 4.4.1リリースでは、inheritdocタグをサポートする予定です。このタグをサポートするドキュメント生成ツール(例:SandcastleまたはFiXml)を使用する場合は、両方の問題に対処する実用的な解決策があると考えられます。

+0

+1よく分かりませんでした。これを自分で試してみる。 – Filburt

+1

素晴らしい!ところで、この機能へのリンクは次のとおりです:http://stylecop.codeplex.com/workitem/6637。そして、私たちが使える良いニュース4.4.1今すぐプレビュー! –

+0

VS 2008のように見えるIntellisenceはinheritdocタグが好きではありません。なぜなら、メンバーがinheritdocタグを前に付けると、VS 2008はマウスのホバリングメンバーのインターフェースのドキュメントを表示しないからです。 )。おそらくVS 2010はinheritdocを適切に処理する方法を知っていますか?何ができますか? –

8

私はいつもこのインタフェースの実装のドキュメントよりも別の何かとしてインターフェイスの宣言のドキュメントを考えているため、これは問題になるだろうと私に起こったことはありません。

私は間違っているかもしれませんが、私は喜んで学びます。

私の実際の答えは次のようになります:1) コピー インターフェイスからのドキュメントの翻訳。

+0

私はクラスのドキュメントをインターフェイスのドキュメントに同期させておく必要があります。したがって、コードを変更して書く過程でもう1つステップを追加する必要があります。ドキュメンテーションの倍増は倍増していると思うし、コードを倍にすることを避けようとすると、なぜドキュメンテーションのようなものに倍増を導入したいのか。倍増は悪いです。 –

+0

@ドミトリー倍増は悪いと私は全く同意します。しかし、インタフェースを変更すると、実装の変更と同じようにドキュメントが更新されるはずです。私は最初のものが、それが起こる方法について二番目に起こるはずのものを文書化するものとして見る。あなたが繰り返し繰り返すことを強く感じ、ロバート "おじさんのおじさん" C. Martinの "Clean Code"の行に沿って考えると、あなたの最善の選択はメッセージを抑制することでしょう。 – Filburt

+0

@ドミトリーあなたが実際にコードに価値を追加しないルールに従わなければならない方法で見た場合、その答えは明確でなければなりません:このルールを回避/抑制し、存在する文書で終わる。 – Filburt

関連する問題