14

次のようなコードがあります。

public class ActivityHelper
{
    public void SetDate(IList<Activity> anActivityList)
    {
        foreach(Activity current in anActivityList)
        {
            current.Date = DateTime.Now;
        }
    }
    //More methods, properties, fields, etc...
}

これは、拡張メソッドに簡単に変換できます。例えば:

public static void SetDate(this IList<Activity> aList)
{
    foreach(Activity current in anActivityList)
    {
        current.Date = DateTime.Now;
    }
}

元の関数は、ActivityHelper クラスのインスタンス固有のデータやメソッドを使用していないため、間違った場所にあるように見えます。これは、拡張メソッドを作成する適切な時期ですか? 拡張メソッドを作成する正しいシナリオは何ですか?

4

5 に答える 5

12

Brad Adams は、拡張メソッドの設計ガイドラインについて次のように書いています。

次のシナリオのいずれかで拡張メソッドを使用することを検討してください。

  • インターフェースのすべての実装に関連するヘルパー機能を提供するため (その機能がコア インターフェースの観点から記述できる場合)。これは、具体的な実装をインターフェイスに割り当てることができないためです。たとえば、LINQ to Objects 演算子は、すべての IEnumerable 型の拡張メソッドとして実装されます。したがって、IEnumerable<> の実装は自動的に LINQ 対応になります。

  • インスタンス メソッドが何らかの型への依存関係を導入するが、そのような依存関係が依存関係管理規則に違反する場合。たとえば、String から System.Uri への依存関係はおそらく望ましくないため、System.Uri を返す String.ToUri() インスタンス メソッドは、依存関係管理の観点からは間違った設計になります。System.Uri を返す静的拡張メソッド Uri.ToUri(this string str) は、はるかに優れた設計になります。

于 2011-02-01T00:26:07.587 に答える
6

メソッドを拡張メソッドにする説得力のある理由がある場合にのみ、拡張メソッドが適切であると思います。

型が制御できないものであり、メソッドが型に不可欠であると思われる場合、またはメソッドを型に直接配置しないというやむを得ない理由がある場合 (不要な依存関係を作成するなど) は、拡張メソッド適切かもしれません。

個人的には、API のユーザーがアクティビティのコレクションを操作するときに「ActivityHelper」クラスを使用することを期待している場合は、おそらくこのための拡張メソッドを作成しません。標準の非拡張メソッドは、簡単に理解して発見できるため、実際にはより単純な API になります。拡張メソッドは、使用の観点からはトリッキーです。実際に存在する場所以外の場所に存在するように「見える」メソッドを呼び出しています。これにより構文が簡素化されますが、保守性と検出性が低下します。

于 2011-02-01T00:27:34.713 に答える
4

私の経験では、拡張メソッドは次の場合に最適に機能します。

  • 副作用がない (私のチームが作成した副作用のある拡張メソッドのほとんどは、効果よりも多くの問題を引き起こしたため、削除することになりました)
  • 拡張している型のすべての可能なインスタンスまたは値に適用される機能を提供します。(再び私のチームの例を引用しstring.NormalizeUrl()ますが、すべての文字列が URL であるとは限らないため、適切ではありません)
于 2011-02-01T00:30:10.420 に答える
0

私は通常、スムーズな流れのコードを書くのに役立つ拡張メソッドを作成します。一般に、作成するメソッドによって異なります。

メソッドが既にフレームワークに含まれている必要があり、一般的すぎると思われる場合は、そのための拡張メソッドを作成してもかまいません。

ただし、拡張するクラスが常に拡張メソッドで処理できる状態になることを最初に分析する必要があります。

ガイドラインについては、ブラッドの記事をご覧ください

http://blogs.msdn.com/b/brada/archive/2009/01/12/framework-design-guidelines-extension-methods.aspx

于 2011-02-01T00:28:58.940 に答える
0

本質的に、拡張メソッドは、ヘルパー メソッドにより流暢なスタイルの構文を提供します。これは、インターフェイスの型またはすべての実装に一見機能を追加する機能に変換されます。

ただし、void問題のメソッドが何も返さない場合、ステートメントを作成できるこの流暢なスタイルの構文の有用性が無効になると感じているため、returntype を使用して拡張メソッドを宣言することは一般的に避けています。

ただし、IntelliSense でメソッドを取得すると便利だと思います... :-)

于 2011-02-01T00:45:07.917 に答える