C#でインターフェイスと実装のコメントを同期する方法[終了]


98

インターフェースとその実装の間でコメントを自動的に同期する方法はありますか?現在、両方を文書化していますが、手動で同期を維持したくありません。

更新:

このコードを考えてみましょう:

interface IFoo{
    /// <summary>
    /// Commenting DoThis method
    /// </summary>
    void DoThis();
}
class Foo : IFoo {
    public void DoThis();
}

このようなクラスを作成すると:

IFoo foo=new Foo();
foo.DoThis();//comments are shown in intellisense

ここではコメントは表示されません:

Foo foo=new Foo();
foo.DoThis();//comments are not shown in intellisense

<inheritDoc/>タグは完全に砂の城のドキュメントを生成しますが、それはインテリセンスのツールチップでは動作しません。

あなたのアイデアを共有してください。

ありがとう。


この機能は実装されていますか?visualstudio.uservoice.com/forums/121579-visual-studio/...
ヘルボーイ

インターフェイスのドキュメントが利用可能な場合、Atomineer Proに実装用の<inheritDoc />ドキュメントタグを生成させるにはどうすればよいですか?
hellboy 14

3
あなたが正しい<inheritdoc/>のVisual Studioで壊れています。バグレポートに投票してください。visualstudio.uservoice.com/ forums / 121579
大佐パニック

回答:


62

これは、Microsoft Sandcastle(またはNDoc)inheritdocタグを使用して非常に簡単に行うことができます。仕様では正式にサポートされていませんが、カスタムタグは完全に許容されます。実際、MicrosoftはSandcastleの作成時にNDocからこれ(および1つまたは2つの他のタグ)をコピーすることを選択しました。

/// <inheritdoc/>
/// <remarks>
/// You can still specify all the normal XML tags here, and they will
/// overwrite inherited ones accordingly.
/// </remarks>
public void MethodImplementingInterfaceMethod(string foo, int bar)
{
    //
}

以下は、SandcastleヘルプファイルビルダーGUIのヘルプページで、その使用方法を完全に説明しています。

(もちろん、これはあなたの質問が言及しているように、具体的には「同期」ではありませんが、それでも、まさにあなたが探しているもののように思われます。)

注として、これは私には完全に公正な考えのように聞こえますが、一部の人々は、派生クラスと実装クラスでコメントを常に再指定する必要があると考えていることに気付きました。(私は実際に自分のライブラリの1つを文書化することで自分でやったが、問題はまったく見当たらない。)ほとんどの場合、コメントがまったく異なる理由はないので、継承してそれを簡単な方法で行わないのはなぜですか。

編集:更新に関しては、Sandcastleが処理します。サンドキャッスルは、入力に使用する実際のXMLファイルの変更バージョンを出力できます。つまり、Visual Studioによって直接ビルドされたものではなく、ライブラリDLLと共にこの変更バージョンを配布できます。つまり、インテリセンスおよびドキュメントファイル(CHMなど)。


ねえ、それはかなりいいです!サンドキャッスルが好き!
Tor Haugen、

更新された質問に回答するように編集された投稿。
ノルドリン2009

2
これはクラスレベルで実行できますか?すべてのメソッドの前に/// <inheritdoc />を置く必要がないように。
アントニースコット

1
私が気づいたことの1つ<inheritdoc/> は、<param>タグのドキュメントを継承しないことです。
スティーブン、2014年

1
持ってアップ投票このユーザーの音声機能を行く<inheritdoc />正式にインテリセンスVSとC#の仕様と作業に追加visualstudio.uservoice.com/forums/121579-visual-studio/...
deadlydog

14

まだ使用していない場合は、GhostDocという無料のVisual Studioアドオンをお勧めします。文書化プロセスが容易になります。やや関連する質問に対する私のコメントを見てください。

GhostDocは自動的に同期を行いませんが、次のシナリオで役立ちます。

文書化されたインターフェースメソッドがあります。クラスにこのインターフェースを実装し、GhostDocショートカットキーを押すとCtrl-Shift-D、インターフェースからのXMLコメントが実装されたメソッドに追加されます。

移動オプション- >キーボード設定]にGhostDoc.AddIn.RebuildDocumentation(私が使用したCtrl-Shift-Alt-D)にキーを割り当てます。 代替テキスト

インターフェースでXMLコメントを変更する場合は、実装されたメソッドでこのショートカットキーを押すだけで、ドキュメントが更新されます。残念ながら、これは逆に機能しません。


GhostDocの最新バージョン(5.3.16270)でも、継承されたドキュメントを作成できます。私は自分のインターフェース実装のためにそれを試してみました。素敵なボーナスです。また、スローされた例外のメッセージとともに例外を追加します:-)
Christoph

6

私は通常、次のようなコメントを書きます。

/// <summary>
/// Implements <see cref="IMyInterface.Foo(string, int)"/>
/// </summary>
/// <returns></returns>

メソッドはインターフェースでのみ使用されるため、このコメントはコーディング時のツールチップにも表示されません。

編集:

インターフェイスを使用せずにクラスを直接呼び出すときにドキュメントを表示するには、クラスを2回記述するか、GhostDocなどのツールを使用する必要があります。


4

GhostDocをお試しください!わたしにはできる :-)

編集: Sandcastleがをサポートしていることを知ったので、<inheritdoc/>Noldorinの投稿を支持します。それははるかに優れたソリューションです。ただし、一般的にはGhostDocをお勧めします。


6
個人的にはGhostDocは好きではありません。実際にはないドキュメントを生成します。これは、何かが文書化されていないという事実を隠しています。個人的な意見ですが、一般的に悪いことではありません。
Stefan Steinegger、2009

1
GhostDocは完全ではないという点でStefanのコメントに同意しますが、このような「継承された」コメントは自動的に取り込まれるので、質問に対するかなり良い回答になります。
スティーブ

ステファン、私は同意しません-反対に、GhostDocはメンバー名にすでに「入れた」ドキュメントを反映するだけなので(名前から散文を構築することによって)、ドキュメントがすでに存在する(暗黙的に)ドキュメントのみを生成します。そのため、何も「生成」しませんが、生成された散文は、実際の価値を追加できる優れた出発点です。実際のドキュメントは、まだいくらかの作業が必要です。
Tor Haugen、

2

私はより良い答えがあります:FiXml、私はその作者の一人です

クローンは確かに効果的なアプローチですが、次のような重大な欠点があります。

  • 元のコメントが変更された場合(開発中に頻繁に発生します)、そのクローンは変更されません。
  • 大量の複製を作成しています。ソースコード分析ツール(Team CityのDuplicate Finderなど)を使用している場合、主にコメントが検索されます。

言及したように、Sandcastleには<inheritdoc>タグがありますが、FiXmlと比較していくつかの欠点があります。

  • サンドキャッスルはコンパイルされたHTMLヘルプファイルを生成します-通常は変更されません .xml抽出されたXMLコメントを含むファイル(これは、コンパイル中に「オンザフライ」で行うことはできません)。
  • サンドキャッスルの実装はそれほど強力ではありません。例えば、いいえ <see ... copy="true" />です。

サンドキャッスルの説明を見る<inheritdoc>を参照してください。

FiXmlの簡単な説明:これは、C#\ Visual Basic .Netによって作成されたXMLドキュメントのポストプロセッサです。これはMSBuildタスクとして実装されるため、どのプロジェクトにも簡単に統合できます。これらの言語でXMLドキュメントを書くことに関連するいくつかの迷惑なケースに対処します。

  • 基本クラスまたはインターフェイスからのドキュメントの継承はサポートされていません。つまり、オーバーライドされたメンバーのドキュメントは最初から作成する必要がありますが、通常は少なくともその一部を継承することが非常に望ましいです。
  • 「このタイプはシングルトンです- <see cref="Instance" />プロパティを使用してその唯一のインスタンスを取得してください。」や「<CurrentType>クラスの新しいインスタンスを初期化」などの一般的に使用されるドキュメントテンプレートの挿入はサポートされていません

上記の問題を解決するために、次の追加のXMLタグが提供されています。

  • <inheritdoc />, <inherited /> タグ
  • <see cref="..." copy="..." /><see/>タグ内の属性。

こちらがそのウェブページダウンロードページです。



1

<inheritdoc />タグのサポートを追加するために、XMLドキュメントファイルを後処理するライブラリを構築しました。

ソースコードのIntellisenseには役立ちませんが、変更されたXMLドキュメントファイルをNuGetパッケージに含めることができるため、参照されているNuGetパッケージのIntellisenseで動作します。

詳細については、www.inheritdoc.ioをご覧ください(無料バージョンが利用可能)。


0

そんなことしないで。このように考えてください。両方のコメントを常に同じにする必要がある場合は、どちらか一方のコメントは不要です。コメントには理由がある必要があります(すべての関数と変数をコメントブロックするというある種の奇妙な義務に加えて)。その固有の理由を理解し、それを文書化する必要があります。


3
テストで偽造していなければ、ここでインターフェイスを使用しなかったでしょう。
Valentin Vasilyev、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.