2009-10-05 22 views

答えて

36

;)

対応するインターフェイスを持つすべてのあなたのクラスをシャドウする必要はありません。

さらに多くの実装を後で行う場合でも、必要になったときにいつでもインタフェースを抽出できます。

+3

+100もし可能であれば、どこでも未使用のインターフェイスを作成することは生産的ではありません。あなたがそれを必要とするならば、それはリファクタリングするのは簡単ではありません。 – slf

+1

合意。 1つの実装を持つ内部クラスは、インタフェースを必要としません。インタフェース*は外部APIの一部を構成する場合は面白いかもしれません - あなたが予測しなかった方法でインタフェースを使用している人は、実装を拡張する必要はありません... –

+1

テストはどうですか?つまり、EasyMockはインターフェイス用のモックを作成するだけです。 – folone

5

具体的な実装が1つしかないのであれば、インタフェースが必要ですか?私はあなたがいけないと思います

+2

正解ですが、それは質問ですが回答ではありません。 –

+2

@Jason:よい質問はしばしば最良の答えです(少年は質問としてそれを書こうと思っていました;-)) –

13

これは粒度の質問です。不要なインターフェイスでコードを混乱させることはできませんが、レイヤ間の境界では便利です。

いつかこのインターフェイスに依存するクラスをテストしようとする場合があります。あなたはそれを嘲笑することができていいですね。

私はいつもインターフェイスを作成して削除しています。いくつかは努力する価値がなく、本当に必要なものもありました。私の直感は大抵正しいですが、リファクタリングが必要です。

+0

最近、私たちはMockito(または同様のテストフレームワーク)を使ってクラスをモックアウトします。あなたが手作業でスタブクラスを作成しなければならない時代のインターフェースを作成し、(Mockitoを使うのではなく)単体テストに依存関係を注入して依存関係を模擬するこの習慣はありましたか?それが事実なら、それは私には大変意味があります。 – Atif

0

==インターフェースを作るために多くの費用がかかりません有名な最後の言葉

を「しか一つの実装を持っているつもり」と、それから、具体的なクラスを派生。それを行うプロセスは、あなたのデザインを再考させ、しばしばより良い最終製品につながります。そして、あなたがそれをやったなら、頻繁に起こるように、あなたがその言葉を食べていることが分かったら、それについて心配する必要はありません。あなたはすでに設定されています。それ以外の場合は、リファクタリングの山があり、それは苦痛になるでしょう。

明確にするために編集しました:私は、このクラスが比較的広く広がっていくと仮定して作業しています。 1つまたは2つの他のクラスが単一のパッケージで使用する小さなユーティリティクラスの場合は、それを心配しないでください。それが複数の他のクラスによって複数のパッケージで使用されるクラスであれば、以前の回答が適用されます。あなたの質問へ

+2

あなたの助言に従えば、無意味なインターフェイスと工場が巨大になり、苦痛になるでしょう。 「インターフェイスへのプログラミング」のためだけにあなたのクラス数を3倍にすることはメンテナンスに貴重です。 –

+0

@Michael Borgwardt:そうですね、私は、おそらくクラススケールの仮説を仮定していることに気付いていました。 *すべての*小さなクラスのインターフェースは悪いです。しかし、より重要なもののためのインターフェイスは広がっていくだろう - たとえあなたが1つの実装しかないと思うとしても。それは面白いことでもないことが証明されていることはとても面白いです。リファクタリングは必ずしも容易ではありません。 –

1

二やや矛盾の答え:

  1. あなたが構築するすべての単一の具象クラスからインターフェースを抽出する必要はありません、と
  2. ほとんどのJavaプログラマーは、彼らのように多くのインターフェイスを構築していませんすべきだ。

ほとんどのシステム(「使い捨てコード」も)は、元のデザインが意図していたものをはるかに超えて進化し、変化しています。インタフェースは、結合を減らすことによって柔軟に成長するのに役立ちます。一般的には、ここでそのインターフェイスにコーディングされるべき兆候は以下のとおりです。

  1. あなたも別の具体的なクラスは、(のような、あなたのデータアクセスオブジェクトが疑われる場合、XMLが必要になる場合があります同じインターフェイスを必要とするかもしれないことを疑うください私が経験した何か)
  2. コードがWebサービス層の反対側に存在する必要があると思われますか?
  3. コードは外部のクライアントにサービスレイヤを形成していますか?

正直言って、これらの質問すべてに対して「いいえ」と答えることができれば、インターフェイスが過度に機能している可能性があります。そうかもしれない。しかし、予期せぬ結果がプログラミングのゲームの名前です。

0

質問は、「どのように確実にすることができますか?具体的な実装は1つしかないでしょうか?」

どのように完全に確認できますか?

これまで考えていたときは、すでにインターフェイスを作成していて、間違っているかもしれないという前提がなくなりました。

今日のコーディングツール(Resharperなど)では、クラスの横にインターフェイスを作成して維持するのに時間がかかりませんでしたが、今は余分な実装が必要であり、長い時間であり、全く楽しいことではありません - 私を信じてください。

1

プログラミングインターフェイスが何であるかは、パブリック関数を指定することによって決める必要があります。あなたがそれをうまくやっていなければ、クラスは使いにくいでしょう。

したがって、後で正式なインターフェイスを作成する必要がある場合は、その準備が整うようにする必要があります。

したがって、インターフェイスを設計する必要がありますが、インターフェイスとして記述して実装する必要はありません。 http://www.infoq.com/presentations/integration-tests-scam

はクラス持っている3つの理由があります:

0

これの多くは、InfoQの上で話をRainsbergerから取られ

  1. それはいくつかの値を保持することは、いくつかのエンティティを永続化に役立ちます
  2. それはサービスの大半は時間べき

いくつかのサービスを行い、 aveインターフェイス。境界を作成し、実装を隠し、すでに2番目のクライアントを持っています。そのサービスとやり取りするすべてのテスト。

基本的に単体テストでモックしたい場合は、インターフェイスが必要です。

2

YAGNI - あなたはゴナないですYAGNIのアプローチを提唱する人によると、現時点では必要ではないが、将来的にはあるかもしれないコードを書くための誘惑は、持っているWikipedia

からそれを必要とします

* The time spent is taken from adding, testing or improving necessary functionality. 
* The new features must be debugged, documented, and supported. 
* Any new feature imposes constraints on what can be done in the future, so an unnecessary feature now may prevent implementing a necessary feature later. 
* Until the feature is actually needed, it is difficult to fully define what it should do and to test it. If the new feature is not properly defined and tested, it may not work right, even if it eventually is needed. 
* It leads to code bloat; the software becomes larger and more complicated. 
* Unless there are specifications and some kind of revision control, the feature may not be known to programmers who could make use of it. 
* Adding the new feature may suggest other new features. If these new features are implemented as well, this may result in a snowball effect towards creeping featurism. 
1

私はコードを作成するためのテスト駆動型アプローチを使用します。これは、テストフィクスチャの一部としてモックやダミーの実装を提供したいインターフェイスを作成することにつながります。

私はテストに関連性​​がない限り、通常はインターフェイスをテストすることができないため、テストケースの依存関係を提供する際に必要な場合はインターフェイスを作成します。

また、リファクタリング、複製の削除、コードの読みやすさの向上のためにインターフェイスを作成することもあります。

後で必要があることがわかったら、インターフェイスを導入するためにコードをリファクタリングすることができます。

唯一の例外は、APIを変更するコストが高い第三者にリリースするためのAPIを設計していた場合です。この場合、将来必要となる可能性のある変更のタイプを予測し、今後互換性のない変更を最小限に抑えるためにAPIを作成する方法を検討する可能性があります。

1

まだ誰も言及していないことのうちの1つは、時には関連性の問題を避けるために必要であるということです。少数の依存関係を持つ共通のプロジェクトと、たくさんの依存関係を持つ別々のプロジェクトに実装されたインタフェースを持つことができます。

関連する問題