2008-09-21 13 views
10

オーバーインターフェイスが可能ですか?ここでシステムを設計するときは、インターフェイスから始め、インターフェイスと一緒に単位テストを徐々に書いて、うまくいくパターンが得られるようにします。具体的なクラスを作成し、これらに対してユニットテストを設定します。.NET - あなたはインターフェイスを越えてできますか?そしてインターフェイスを使用しない場合は

今、私はインターフェイスを愛する人です。私はコードを制御するときに、元来、渡している/返されていたプリミティブやインターフェイスを終了することになります。これまではこれが理想的であることがわかりました。システムは一般的に依存システムに影響を与えません。

私は明らかにインタフェースを使用する理由を売る必要はありませんが、インタフェースがすべてのものであるのかどうか疑問に思っています。

interface ISomethingProvider 
{ 
    ISomething Provide(ISomethingOptions options); 
} 

が、これは本当にトップを超えている:私は次のようにもっと何かを話している

interface IStringCollection : ICollection<string> 
{ 
} 

:私はないのようなクレイジーなもののように空白のインターフェイスについて話していますか?私の推論は、どんなタイプでもある時点でインターフェースから得ることができるということです。私が持っていた唯一の本当の問題は、クラスを設計するより良い方法だと思ったことです。インタラクションと「ハック」が続いています。これはtimebombある場合

さは約あなたのフィードバックを大好きだ、とあなたはいない対インタフェースすることを決定したとき..

をPS-これは本当にインターフェースを作成する方法についてはあまりありません。

答えて

1

はこれを参照してください。私はときにのみインタフェースを好む傾向にある:あなたは、彼らがコーディングを開始する前に何をすべき者に同意するチームのメンバーが必要

  1. - インターフェースを、その後は正確に
  2. あなたが実際に問題を解決するためのインタフェースを必要とするときに境界線を文書化、お互い
  3. を拡張しないので、少なくとも2つの実装は、あなたは2
1

私はインタフェースが自分のものにcoworkすることが特に他の人のために、設計を複雑にすることを見つける場合期待しています。私が間違ってはいけない、インターフェイスはたくさんのものにとって素晴らしいですが、主に2つ以上のクラスが共通のインターフェイスを共有するようにしたい場合です。

あなたは突然のインターフェイスを必要とする状況に自分自身を見つける場合は、ReSharperのようなツールとリファクタリングは簡単です:)

4

何か他のものと同じように - 節度し、必要に応じて使用します。 あなたはそれを必要としますか? "と尋ねてください。

5

インターフェイスは動作の契約を表します。ビヘイビアパターンに従っていくつかのオブジェクトセットに対処する必要がある場合は、単にオブジェクトの構造を記述するだけでなく、インターフェイスも便利です。ビヘイビア関連のオブジェクトを作成するファクトリの使用やライブラリの一部のビヘイビア契約の確立など、それらを使用する正当な理由が必要だと思います。インターフェイスを無意味に使用すると、ライブラリを読み込み/理解/維持するのが困難になることがあります。

1

これは.NETだけではなく、同じ問題がJavaで頻繁に発生します。

完全に明白な要件でない限り、私はインターフェイスを使用せず、必要が明らかになったときにリファクタリングすることに投票します。

実用的なアプローチでは、の可能性があり、アーキテクチャの宇宙飛行船に巻き込まれないように、もっとも簡単なことをで行うと言います。

5

簡単に言えば、プロジェクトをオーバーインターフェースすることができます。状況が抽象基本クラスとインタフェースを実際に要求するときには、両者は似ていますが、両方ともSee Hereを使用することには明確な利点があります。一般的に私は、抽象基本クラスを実際に使用する必要があるときに、人々がインタフェースを使用することに気付きました。オブジェクト指向の観点から、インタフェースは、異なるクラスにまたがる可能性のある共通の動作をリストするために使用されるべきである。たとえば、Move()というメソッドを持つIMoveインターフェイスがあるとします。今、あなたは飛行機、車、人、昆虫のクラスを持っていると想像してください。飛行機と自動車は、抽象的な車両クラスから継承することができますが、IMoveを使用する必要があり、InsectとPersonも使用されますが、それらはすべて異なる動きを実装します。私は自分自身が含まれていることに気付きました。人々は、基本クラスによって実際に処理されるべきときにクラスを一緒に「グループ化」するためにInterfacesを使用する傾向があります。

+1

あなたが本質的に2つのクラスのインターフェイスを実装する同じメソッドを書いているのであれば、抽象基本クラスが必要です。 –

1

私はテスト目的であまりにも多くのインターフェイスを使用しない傾向があります。むしろ私が必要としていたものを最終的に行使する他のオブジェクトやテストを構築した時点で、ビルドとテストをしている間にプライベートバリューを公開したり、クラスやテンポラルメソッドを開封したりします。あなたの変更を棚上げするために尻に痛みを感じますが、何かを変更するのを忘れたときにテストがあなたに伝えます。

3

インターフェイスがオーバーする可能性があります。私が働くルールは、アプリケーションにインターフェイスがある場合、それを実装するクラスが少なくとも2つ必要です(または、近いうちに実装クラスを追加することを期待しています)。

テスト用の模擬オブジェクトを作成する必要がある場合は、模擬クラスと実クラスが共通のインターフェースを実装することが、インターフェースを使用する正当な理由です。

アプリケーション内のすべてのインターフェイスを自動的に使用することはお勧めしません。特に、通常は、必要に応じて単一のクラスを簡単にインターフェイスにリファクタリングすることができます。私が見たり、誰かが私はインターフェイスを理解していない人を見つけた知っているこの

インタフェースが動作

のための契約を記述言うのを聞くたび

+1

現代のリファクタリングツールの美しさは、インタフェースを使用して、将来の使用に柔軟性を持たせる必要がないことです。 –

2

インターフェイスできません。です。それは不可能です。インタフェースは、処方、強制、または何らかの形で動作を制限しません。

インターフェイスでは、インターフェイスの契約が記述されています。彼らには行動がありません。

あなたのインターフェイスのメソッドに与えた名前は、それを実装するすべての人に必要な動作を暗示することを望むかもしれませんが、そうする必要はありません。行動的な契約はなく、そこにも存在することはできません。

特定の種類の動作が必要な場合は、それを強制するためにクラスを使用する必要があります(テンプレートパターンなど)。これがすべての動作です。

インターフェイスはデザイン構成として定期的に悪用されています。その理由の1つは、この誤謬の広範な信念のためです。

+0

私は_documented_インターフェイスが動作の契約を記述できると主張します。必ずしも契約を強制することなく契約を記述することができます。開発者は依然として文書を遵守する責任があります。 –

関連する問題