重複の可能性:
拡張メソッドと静的ユーティリティクラス
.NETのオブジェクトに基づいてアクションを実行する一般的な関数のAPIを構築しています。例えば;文字列をチェックしてメールアドレスかどうかを確認する関数を作成しました。
私はどちらかを持つことができます:
static bool IsEmailAddress(string text)
{
return IsMail(text);
}
または、次のように使用される拡張メソッドを作成できます。
string text = "[email protected]";
if (text.IsEmailAddress())
{
}
どちらがより適しているか、またはこれは汎用ライブラリであるため、技術的に両方の方法で実装し、開発者がどちらが最適かを判断できるようにできると思いますか?
拡張メソッドを作成すると、ユーザーがそのタイプを使用すると、インテリセンス中に自動的に表示されます。開発者が参照するメソッドのリストに多くのノイズを追加しないように注意する必要があります(特に再利用可能なフレームワークを作成する場合)。たとえば、これらのメソッドが特定のコンテキストでのみ使用できる場合は、「通常の」静的メソッドを使用する方がよいでしょう。特に、string
などの一般的な型の拡張メソッドを実装する場合。
たとえば、ToXml(this string)
拡張メソッドまたはToInt(this string)
拡張メソッドを考えてみましょう。これらの拡張メソッドがあると非常に便利に思えますが、テキストをXMLに変換することは、アプリケーション全体で行うことではなく、XmlHelper.ToXml(someString)
を行うのと同じくらい簡単です。
さらに悪いことは1つだけです。それは、object
に拡張メソッドを追加することです。
再利用可能なフレームワークを作成している場合、 Krzysztof Cwalinaによる本Framework-Design-Guidelines は絶対に読む必要があります。
問題は、どの.NETFrameworkをターゲットにするかです。 3.5未満の場合、拡張メソッドは使用できません。そうでなければ、なぜあなたは新しいクラスを作成するのでしょうか?
あなたのコードは洗練されていて、フレームワークの封印されたクラスで拡張メソッドを定義できるので、私は拡張メソッドを好みます。
拡張メソッドは自動的に静的クラスの一部になります。これは、コンシューマーが必要に応じて、拡張メソッドを使用するか、クラスから静的メソッドを呼び出すことができることを意味します。私はできる限り拡張メソッドを使用していますが、適切な名前空間に配置されていれば簡単に見つけることができます。
拡張メソッドを使用すると、開発者は、ヘルパークラスが存在するという事実は言うまでもなく、ヘルパークラスが何と呼ばれ、どこに配置されているかを正確に知ることができません。名前空間をusing
句に配置する必要があることに注意してください。おそらく、アプリケーションの一般的な最上位の名前空間に配置します。