2016-06-16 8 views
0

簡単な質問:マイクロソフト自身が発行したガイドラインや、タイプおよびインタフェース契約に関するタスクの宣言に関する共通の慣行がありますか?タイプ/インタフェース契約に関するガイドライン - ガイドライン

これまでのところ、私が見た多くの異なるアプローチ:

同期および非同期TAPを使用して(ほとんどの.NET型):

void DoSomething(); 
Task DoSomethingAsync(); 

TAPのみ:

Task DoSomething(); // notice, no 'Async' member naming 

スプリット契約:

interface IDoSomething { 

} 

interface IDoSomethingSync : IDoSomething { 
    void DoSomething(); 
} 

interface IDoSomethingAsync: IDoSomething { 
    Task DoSomething(); 
} 

...または最後に、仕事をせずに契約を結び、消費者に任せてください。

これを公式に宣言する方法はありますか?しばらくの間、私は最初の例に固執しました。これは.NETフレームワークの中で最も一般的な例です。しかし、そこにさえ、従来の理由から一貫していないことがあります。

+1

このような質問は、オフサイトのリソースや意見ベースの検索のいずれかとは言い難いものです。また、何度も前に尋ねられます - 私は重複が十分な閉鎖の理由だと思うが、質問がなぜそれ自身で閉じられるべきなのかを自由にコメントする。 –

+0

@AlexeiLevenkov質問を投稿する前に検索しましたが、役に立たないものはありませんでした。また、私は特にガイドライン(マイクロソフト社の方が望ましい)を求めているので、オプションベースではないので、見つけられなかったり、見つからなかったりすることはありません。 OPが一般的なインターフェイスデザインのガイドラインではなく、命名規則を尋ねているため、リンク/マークされた質問は重複しているとは思わない。 – artganify

+0

artganifyは、この質問はガイダンスの検索であり、http://stackoverflow.com/questions/24766651/interface-naming-convention-for-method-returning-task-re- opened(多分長くはない)の複製ではないと主張しています。 –

答えて

3

まず、TAP命名規則は常にAsyncで終了します。主にTaskタイプのこのルールにはいくつかの例外があります。

最初に質問する必要があるのは、I/Oを含む操作ですか? (または、インターフェイスの場合は、これはの操作ですか?は非同期実装ですか?はいの場合、メソッドには非同期の署名が必要です。

下位互換性の理由からそれらを必要としない限り、通常、同期シグネチャを照合する必要はありません。ほとんどのデスクトップ.N​​ET APIには、同期バージョンと非同期バージョンの両方が含まれています。は下位互換性のためにです。新しいタイプ(UWP、.NET Coreなど)では非同期(I/O操作の場合)しかありません。

スティーブン・トゥブは、古典的なブログ記事Should I expose synchronous wrappers for asynchronous methods?Should I expose asynchronous wrappers for synchronous methods?を書いています。スポイラー警告:両方の答えは「いいえ」です。

+0

非常に興味深い記事は、両方とも非同期に同期をラップする場合には非常に意味があり、逆も同様です。私にとってまだ不明な唯一のことは、インターフェースに関して言いました:「これは非同期の実装を持つ可能性が高い操作ですか?」確かに分かりますか?たとえば、ドメイン関連のリポジトリではインフラストラクチャの実装から機能を公開してはいけません。また、インメモリリポジトリ(テスト目的では)はリソース集中型のIOを必要としません。操作が非同期で実行されている可能性があることを隠す方がよいでしょうか? – artganify

+0

@artganify:これは 'IDisposable'と同じ設計上の問題です。実装のうちのどれかを処分する必要があるかどうかをインターフェースがどのように知ることができるのか?処分と非同期の両方を、理想的な世界の実装の詳細として扱うことができます。 C#/ .NETでは不可能です。 –

+0

私はそれについて考えなかった、面白い。しかし、それは、インスタンスのICollectionが "IsReadOnly"を持つのと同じ方法で、実装に処分が必要かどうかを消費者に知らせるプロパティを公開することで解決することもできます。 – artganify

関連する問題