2

拡張メソッドについて初めて学んだとき、私はこれを読みました

一般に、拡張メソッドは控えめに実装し、必要な場合にのみ実装することをお勧めします。既存の型を拡張する必要があるクライアント コードは、可能な限り、既存の型から派生した新しい型を作成して拡張する必要があります。

ただし、さまざまな製品コード ベースで拡張メソッドが非常に自由に使用されているのを何度も見てきました。

確かに、私の経験は大多数を代表するものではありませんが、ガイドラインに変化があるのか​​、別の設計哲学があるのか​​ 、それともガイドラインを無視してそう思わせるほどのコードをたまたま目にしたのか知りたいですか?

:私は議論を引き起こしようとしているわけではありません(これはすぐにこの質問の終了につながります)-私は正直にこれについてしばらく疑問に思っており、答えを得るための私の最高のチャンスはSOにあると感じています.

4

4 に答える 4

2

ポリモーフィズムは、コンパイル時にバインドされるため、拡張メソッドでは機能しません。

ParentClass parentClass = new ParentClass();
ParentClass derivedClass = new DerivedClass();

これらのクラスの両方にExtensionMethod()と呼ばれる拡張メソッドがある場合(仮想/オーバーライドされたメソッドを模倣しようとする拡張メソッドをはっきりと見ました)、これらの呼び出しは両方とも親クラスの拡張メソッドを呼び出します。

 parentClass.ExtensionMethod();
 derivedClass.ExtensionMethod();

派生した拡張メソッドを実際に使用するには、次を呼び出す必要があります。

 ((DerivedClass)derivedClass).ExtensionMethod();
于 2012-05-23T17:35:27.220 に答える
2

このハイライトはすべて、理論と実践の通常の違いだと思います。理論上は控えめに使用する必要がありますが、実際には使用しません。理論的には、プログラミングだけでなく、生活全般で実際にはしない多くのことを行う必要があります。

于 2012-05-23T16:33:24.050 に答える
1

拡張メソッドの使用には賛否両論があると思います。

長所: 拡張メソッドは、ビジター パターン (GoF) と見なすことができます。つまり、コードを変更せずにいくつかの機能を拡張できるというパターンを利用しています。

短所:利点にもかかわらず、MSDNが拡張メソッドの使用を控えめにしているのは、IMO、拡張メソッドがある時点で問題を引き起こす可能性があることです。まず、拡張メソッドのオブジェクトが拡張とは異なる名前空間を持っている場合、それがどこにあるかを知る必要があります。拡張機能のいくつかの重要な機能を使用できない場合があります。さらに、拡張機能を悪用したコードをたくさん見ました。拡張は Type に基づいているため、その Type のオブジェクトは実際には拡張を必要としない場合がありますが、コーディング時には多くの拡張メソッドが表示されるはずです。


[アップデート]

IMO、拡張メソッドに関する悪用

  1. object のような拡張メソッドに非常に一般的な型を使用します。オブジェクト型の拡張メソッドがたくさんあり、その拡張が少数の型にのみ焦点を当てている場合、すべてのオブジェクトがメソッドにリンクされているため、私たちを悩ませます。
  2. ドット演算子によるリンク切れまたは誤解: 例を示します。以下のようなコードがあり、Read メソッドと Write メソッドを順番に呼び出す必要があります。ただし、逆の順序でメソッドを呼び出すことができます。

    public static string Read(this string message)
    {
        //do something
        return message;
    }
    
    public static string Write(this string message)
    {
        //do something
        return message;
    }
    
    public static void Method()
    {
        "message".Read().Write();
        "message".Write().Read(); // this is problem!
    }
    
于 2012-05-23T17:17:12.990 に答える
1

クラスの拡張は良いアプローチですが、多くの場合、サード パーティのライブラリを使用するコードでは使用できません (これは、教育/サンプル コードとは異なり、製品コードの一般的なケースです)。したがって、意味がある場合は新しいクラスを派生させますが、コードを読みやすくする場合は、拡張メソッドを自由に使用してください。

多くの拡張メソッドがある理由は複数あります。

  • 多くの場合、クラスを拡張して、製品コードをより読みやすくするメソッドを追加することはできません。つまり、String のような値型や、Stream のような階層内のいくつかの基本クラスです。
  • 拡張メソッドは、インターフェイスを汚染することなくインターフェイスにメソッドを追加するための貴重な方法です。LINQ は、より読みやすいコードを生成する良い例です。
  • 一部のフレームワークでは、特定のケースで拡張メソッドを使用することを推奨しています。つまり、MVC の場合、拡張機能を HtmlHelper に追加することをお勧めします。
于 2012-05-23T17:03:52.483 に答える