2012-04-13 13 views
1

私はインターフェースを持っています。新しい要件のために、インタフェースは今実装できる単一のメソッドを持っています。インターフェイスに実装を追加するために拡張メソッドを使用していますかAnti-OOP?

public static string ToEntityConnectionString(this IEnvironmentProvider provider) 
//Converts a standard connection string to EntityFramework compatible string 

インターフェイスを抽象クラスに変換できますが、現在はこのクラスを継承クラスとして制限しています。ただし、このインタフェースは現在Dependency Injectionだけで使用されています。

私は、エクステンションメソッドを使用してインターフェイスに機能を追加できると考えました。それは本当に良いと思われる。インターフェイスへの実装の追加?そんなことをするのは悪い習慣と考えられますか?もしそうなら、なぜですか?状況を考慮して、代わりに何を使用すべきか?

+0

拡張メソッドは本当に魔法です。あらゆる種類の継承構造などを悪用することができます。なぜなら、それらは単に静的メソッドであるからです。それはシンタックス・シュガーとIntelliSenseを組み合わせたもので、想像以上のものにこだわることができます。 – Yuck

+1

申し訳ありませんが、新しいメソッドをインターフェースに追加するのはなぜオプションではないのか分かりません。それを私に説明してもらえますか? – Dejas

+0

インスタンスの内部状態にアクセスするメソッドが必要ない限り、拡張メソッドは非常に便利です。 –

答えて

6

インターフェイスに拡張メソッドがある場合、そのインターフェイスに実装を追加するものと考えるべきではありません。これは、インターフェイスを取る静的ヘルパーメソッドであり、インターフェイスの公開されたメンバーに基づいてすべての作業を行います。これは、オブジェクト指向設計においてかなり多くのことを見るものです。 OOの原則に反するものではありません。 '拡張機能'の部分は見た目がきれいになり、検索/入力が簡単になります。あなたが実際に拡張メソッドをインターフェースの一部として考えるようになったら、本当にそうではないので、より大きな問題があるでしょう。

+0

+1まさに私が思っていたことですが、単語形式で! – Khan

+0

おそらく私はintellisenseの罠に巻き込まれているでしょう。ドット演算子は私に拡張メソッドを与えるので、メソッドとしてメンバーとして考える必要があります。 UMLでアプリケーションをモデル化した場合、私は 'IEnvironmentProvider'ダイアグラムからその拡張を除外すべきだと思います。 –

+0

UML図では、拡張メソッドは定義されている[静的]クラスにあり、拡張されているものではありません。 – Servy

1

私は、クラスのユーザーがコピー貼り付けコードを使って簡単に行うことができる簡単なヘルパーメソッドとして拡張メソッドを参照しています。非公開の属性にアクセスすることなく機能を実行できるのであれば、それをインターフェースに追加することを正当化する新しいものがあります。

関連する問題