.NETデリゲート型の適切な命名規則?


82

慣例により、クラスは名詞のように、動詞のようにメソッドに、形容詞のようにインターフェースに名前が付けられることがよくあります。

デリゲートの一般的な命名規則は何ですか?または、デリゲートがタイプやその他のものの間でリストされているときにその名前を区別するための良い方法は何ですか?

私の当面の想定は、単一のメソッドインターフェイスをデリゲートに置き換えることができるため、デリゲートに形容詞の可能性が高い名前を付けることです。

いくつかの考え:

delegate object ValueExtracting(object container);

delegate object ValueExtractor(object container);

delegate object ValueExtractionHandling(object container);

delegate object ValueExtractionHandler(object container);

回答:


111

個人的に私はいくつかの異なるパターンを使用しています:

[Task][State]Handler - UITaskFinishedHandler

[Event]Handler - ControlLoadedHandler

[Function Name]Delegate - DoSomeWorkDelegate -私は異なる/新しいスレッド上で関数を呼び出すためのデリゲートを作成する必要があるときに使用されます

[Task]Callback - ContainerLoadedCallback -制御Aは、仕事とコントロールAのほとんどが制御Bに依存し過ぎているんコントロールBアクションを開始するときに使用される(つまり、ControlAを埋めるためにControlBのためのUIコンテナに合格し、実際にコンテナを表示するに通知を必要としていること)

多くのマルチスレッドまたは非同期WCF呼び出しを使用するプロジェクトがある場合、多くのデリゲートが浮かんでしまう可能性があるため、少なくとも自分にとって意味のある標準を採用することが重要です。


+1それは素晴らしい慣習です。また、デリゲートがイベントタイプで使用する@Aaronaughtの回答には、「ハンドラー」だけでなく「EventHandler」サフィックスを付ける必要があることに同意します。
サミュエル

1
「[FunctionName] Delegate」は残念ながらCA1711に違反しています。戻り値の型の有無に応じて、「[関数名] Func」または「[関数名]アクション」を使用するのが好きです。
Tinister 2013

1
これはおそらく、私がこれまでに見た中で最も有用な(そして最短の)コンベンションです。私から+1。@slugsterを共有していただきありがとうございます
FullStackForger

コード規則を委任して任意のデリゲートをサフィックスすることができません教えてdocs.microsoft.com/en-us/visualstudio/code-quality/...
クリスチャン・フィンドレー

2
作成したみんな言う@MelbourneDeveloper RequestDelegateasp.net-コアのための; - ]
t3chb0t

48

Microsoftのフレームワーク設計ガイドライン-私にとっての命名年鑑はこのトピックについて次のように述べています

√イベントで使用されるデリゲートの名前に接尾辞「EventHandler」を追加してください。
√イベントハンドラーとして使用されるデリゲート以外のデリゲートの名前には、接尾辞「コールバック」を追加してください。
Xデリゲートに接尾辞「デリゲート」を追加しないでください。


16
MSが「デリゲートにサフィックス「デリゲート」を追加しないでください」と言っているのはおかしいですが、この例では、デリゲートがProcessBookDelegate...
PadawanLondon 2016

@ PadawanLondonasp.net RequestDelegate-coreと同じ話-一貫性とコーディング規約に非常に重要です。私は彼ら自身のドキュメントさえ読まないと思います。
t3chb0t

16

デリゲートはアクション(動詞)を実行するものであるため、デリゲートには、そのアクションを実行するものと呼ぶ名前を付ける必要があります。Converter<TInput, TOutput>例にとってみましょう。動詞はConvertです。変換んが呼び出される事コンバータ、デリゲートの名前の由来。


6

これはいくつかのことに依存します。

デリゲートをイベントとして使用する場合は、常にEventHandlerサブタイプとして参照する必要があります。次に例を示します。

public delegate void ValueExtractingEventHandler(object sender,
    ValueExtractingEventArgs e);

それはイベント、そして(私はGoogleでの右のコピーを見つけるように見えることはありません)コーディングガイドラインMSではない場合は、明示的にお勧めに対してデリゲート名に「代理人」または「ハンドラ」、のような言葉を含む以外の特殊なケースでEventHandlerタイプ。

通常、デリゲートはアクションにちなんで名前を付ける必要があります。これは、ValueExtracting(値が抽出される前にデリゲートが発生した場合)またはValueExtracted(抽出後)のようになります。

Func<T1, T2, ..., TResult>デリゲートの構文は、より一般的になっているが、あなたはそれに入る4つの以上のパラメータを持っていない限り、あなたはすべてのあなた自身を宣言する必要はありません-ちょうど既存のものを使用します。

object ExtractObject(object source, Func<object, object> extractor);

この構文は、デリゲートがクロージャとして使用されている場合に最適です。デリゲート自体にはあまり興味深い名前はありませんが、引数は動作主名詞(抽出者、プロバイダー、評価者、セレクターなど)です。

ほとんどのデリゲートの使用法は上記のカテゴリのいずれかに該当するため、使用されているものを適切に選択してください。


3

私はただのいずれかを使用主な理由は、それについて考えたことがないEventHandler<T>Func<T>またはAction<T>過負荷を、私自身を定義する気はありません。私はおそらくあなたがリストしたものからValueExtractorを選ぶでしょう。これにより、オブジェクトのように聞こえ、呼び出すと、そのオブジェクトを使用してアクションを実行します。例えば:

ValueExtractor extractor += Blah;
var value = extractor(data);

さらに、組み込みのデリゲートのほとんどは、名詞のように名前が付けられています。疑わしい場合は、.NETフレームワークに従ってください。


0

ValueExtractionを使用します。
理由は考えたことがありませんが、操作を保存しているので名詞である必要があるためだと思います。厳密には、これは操作ではありません。


0

に基づいてEnumerable.Sum、デリゲートをaとして渡しFunc<object, object>、パラメーターに名前を付けますselector

void Foo(Func<object, object> selector) ...

あなたがそれのためにあなた自身の代議員を作らなければならないならば、それがそれがすることValueExtractorの最も説明的な名前であるので、私は一緒に行きます。


これらのジェネリックデリゲート(ActionおよびFunc)は、95%のケースで問題ありません。ただし、それらが非常に不十分な場合もあります。つまり、デリゲートが複雑な署名を持ち、多くの人に渡される場合です。基本的に、各引数が何をするかは明らかであるはずですが、そうでない場合は、名前付きデリゲートを作成することをお勧めします。
マテイZábský
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.