2009-07-08 16 views
3

可読性を向上させる以外の目的を果たさない拡張メソッドの使用に関する一般的な考え方は何ですか?可読性を高めるための拡張メソッドの使用

拡張メソッドを使用しなければ、私たちはこれで何も悪いことはありませんが、私はインスタンスを見つける

var descendents = GetDescendents(someControl); 

または

foreach (var descendent in GetDescendents(someControl)) {} 

で呼び出すことができ方法

IEnumerable<DependencyObject> GetDescendents(DependencyObject root) {} 

を持っているかもしれません私はこれを拡張メソッドにすることを検討するかもしれない。この署名i番目

public IEnumerable<DependencyObject> GetDescendents(this DependencyObject root) {} 

は、それが

var descendents = someControl.GetDescendents(); 

または

foreach (var descendent in someControl.GetDescendents()) {} 

と呼ばれることを可能だから私の質問は、あなたが、これは合理的なまたは拡張メソッドの乱用だと思うかどうかです。機能を違うと宣言するだけの問題だったら、私は躊躇しないだろう。拡張メソッドを使用すると別の静的クラスにコード化する必要があるという事実は、それが努力する価値があるのか​​どうか疑問に思います。私が上で使用している例は、かなり一般的なもので、いくつかの場所で使用される拡張メソッドとしてメリットがあるかもしれませんが、そうでない場合が多く、同じファイルに拡張子を含む静的クラスをコーディングしますそれを使用する単一のクラスです。

答えて

3

拡張メソッドの大きな利点は発見可能性だと思います。チームメンバの1人がユーティリティクラスのどこかにGetDescendentsメソッドを作成したことを誰かが気付かずにいると、決してそれを使用しません。しかし、そのメソッドがIntellisenseまたはObject Browserに表示され始めると、それらが偶然見つかる可能性があります。拡張メソッドをより広範に使用し始めると、私が言及したツールを使用して、価値を付加する拡張機能を探すようになります。

+0

私はこの側面について考えたことはありません。それは多くの意味があります。 –

2

ほとんどすべての拡張メソッドが、静的関数よりもクラスの内部で操作できないため、ほとんどの場合、このカテゴリに該当するわけではありません。とにかく、任意の拡張メソッドは、静的クラスでオブジェクトを表す追加のパラメータで書き直すことができます(間違いなく、拡張メソッドがとにかくあります)。

私にとって、それは完全にスタイルの問題です:あなたが提供した例では、おそらく拡張メソッドのために飛び乗るでしょう。私はここで重要な質問は、と思う私はクラスを再実装する場合、私はクラスの一部として書くだろう何かこの関数は、それは意味がありますか?「はい」の場合はそれに進み、そうでない場合は別の解決方法を検討してください。

1

可読性を向上させるためにのみ拡張メソッドが存在します。これは、最初の引数にthisキーワードを指定することで、問題のオブジェクトインスタンスでメソッドを呼び出すことができます。だから私はそれが完全に合理的だと思う。

関連する問題