エクステンションメソッドは実際には興味深いですが、クラス外に「クラスメンバー」を作成するというアイデアに100%気を配りません。拡張メソッドの使用が良い方法ですか?
私はできるだけこのプラクティスを避けることを好みますが、時には拡張メソッドを使用する方が良いかもしれません。
この機能の使用方法としては、どのような状況が考えられますか?
エクステンションメソッドは実際には興味深いですが、クラス外に「クラスメンバー」を作成するというアイデアに100%気を配りません。拡張メソッドの使用が良い方法ですか?
私はできるだけこのプラクティスを避けることを好みますが、時には拡張メソッドを使用する方が良いかもしれません。
この機能の使用方法としては、どのような状況が考えられますか?
私は、拡張メソッドの最適な場所は、既存のAPIの引数に既定値を提供したり、メソッド呼び出しの繰り返しチェーンを隠すことによって、既存のAPIをより簡単できれいにする "ヘルパー"メソッドまたは "ショートカット"
ソースコードにアクセスできないクラスを「拡張」できるという一般的な考え方とは異なり、できません。プライベートメソッドとオブジェクトにアクセスすることはできません。パブリックAPIを磨き、好みに合わせて曲げるだけです(推奨しません)。
クラスが拡張可能でなく、ソースコードを制御できない場合。または、拡張可能な場合でも、自分のタイプではなく既存のタイプを使用できるようにすることをお勧めします。拡張機能がクラスの性格を変えず、単に機能不足(IMO)しか提供しない場合、私は後者を行うだけです。
エクステンションメソッドは、所有していない(ソースなし)、フレームワーク内にある、または何らかの理由で継承したくないクラスに機能を追加するのに最適です。
私はそれらが好きですが、あなたは正しいです。彼らは賢明に使われるべきです。
これらはインターフェイス(既存のメソッドのみをインターフェイスで使用する「複合」ビヘイビアを追加できます)に適しています.LINQ to Objectsはこれの主要な例です。
これらは、使用されているタイプに影響を与えずに流暢なインターフェイスを作成するのにも役立ちます。私のお気に入りの例では、ユニットテストのために、おそらく生産のコードには不適切な、しかし便利です:基本的にどこでも
DateTime birthday = 19.June(1976) + 8.Hours();
あなたがしたくないか、型自体に動作を追加することはできませんが、それが簡単に作りたいですを使用するタイプ、拡張メソッドを検討する価値があります。特定の型を扱う静的メソッドをたくさん書いている場合は、拡張メソッドがこれらのメソッドの呼び出しをより良く見せてくれるのではないかと考えてください。
私の意見では、拡張メソッドはコードの可読性を高め、メンテナンス性を高めるのに便利です。元のクラスにアクセスできないエンティティ、または元のクラスの「単一責任原則」が破棄されているエンティティに最適なようです。後者の例はDSLです。 DSLモデルは拡張されて拡張され、T4テンプレートを簡単にするために使用されますが、モデルに特に関連しない限り、モデルは追加されません。
理想的な使い方は、多くの場所で実装されるインターフェイスがある場合です。そのため、実装者に大きな負担をかけることは望ましくありませんが、呼び出し元のインターフェイス視点も同様です。
したがって、「ヘルパー」を拡張メソッドのセットに入れて、インターフェイス自体をすばらしくしなやかにします。
interface IZoomable
{
double ZoomLevel { get; set; }
}
public static void SetDefaultZoom(this IZoomable z)
{
z.ZoomLevel = 100;
}