インターフェイスに対するプログラミング:すべてのドメインクラスのインターフェイスを作成しますか?

StackOverflow https://stackoverflow.com/questions/152077

  •  02-07-2019
  •  | 
  •  

質問

同意しますが、インターフェースに対するプログラミングは良い習慣です。 Javaのほとんどの場合、「インターフェース」この意味では、言語構成インターフェースを意味するため、インターフェースと実装クラスを記述し、ほとんどの場合、実装クラスの代わりにインターフェースを使用します。

これは、ドメインモデルを作成するための良い習慣であるかどうかと思います。したがって、たとえば、ドメインクラスCustomerがあり、各顧客がOrdersのリストを持っている場合、ICustomerおよびIOrderインターフェイスも通常作成します。また、顧客には注文の代わりにIOrdersのリストがありますか?または、ドメインによって実際に駆動される場合にのみ、ドメインモデルでインターフェイスを使用しますか?少なくとも2種類の注文がありますか?言い換えれば、ドメインモデルの技術的なニーズのみのために、または実際のドメインに関して本当に適切な場合にのみ、インターフェイスを使用しますか?

役に立ちましたか?

解決

インターフェイスの作成"ちょうどの理由" KISS原則への違反は言うまでもなく、時間とエネルギーの無駄だと私は思います。

それらは、派手なヘッダーファイルとしてだけでなく、関連するクラスの一般的な動作を表すのに実際に役立つときにそれらを記述します。

他のヒント

システムを過剰に設計しないでください。いくつかの種類のOrderがあることがわかっており、必要に応じてリファクタリングするよりもOrderのインターフェイスを宣言する方が適切だと思う場合。ドメインモデルの場合、特定のインターフェイスが開発期間中に大きく変化する可能性が高いため、インターフェイスを早期に記述することはほとんど役立ちません。

インターフェイスは、単体テストと一般的な依存関係管理のためにコンポーネントを分離する優れた方法です。そうは言っても、私はしばしば抽象クラスを好むので、インターフェースがもたらす重複の一部を強制するのではなく、少なくとも一般的な動作の一部がそこでオフロードされます。最新のIDEを使用すると、インターフェイスをすばやく簡単に生成できるため、あまり機能しません:-)

いいえ、疎結合を維持するためにドメインオブジェクトのインターフェイスのみを使用します。私にとって、インターフェイスを使用して独自のコードを開発する主な目的は、ユニットテストを行うときにモックを簡単に作成できることです。ドメインオブジェクトは、サービスレイヤーまたはDAOレイヤークラスと同じ依存関係を持たないため、モックの意味はわかりません。

これは確かに、ドメインオブジェクトでインターフェイスを使用することから逸脱することを意味するものではありません。必要に応じて使用します。たとえば、最近、ユーザーがコメントを残すことができるパーマリンクページにさまざまな種類のドメインオブジェクトが対応するwebappに取り組んでいます。したがって、これらの各ドメインオブジェクトは、「コメント可能」を実装しています。インタフェース。コメントベースのコードはすべて、ドメインオブジェクトではなく、コメント可能なインターフェイスにプログラムされます。

無駄のない俊敏性を維持することをお勧めします。必要になるまで何もせず、必要なときにIDEにリファクタリングを行わせます。

IDEA / Eclipseでは、必要に応じて具体的なクラスをインターフェイスに変えるのは非常に簡単です。

次に、 Spring またはガイド「新規」を使用しているコードの場所に挿入するインターフェイスの実装が多数ある場合

実際、この質問は、「インターフェイスに対するプログラミング」に関するよくある誤解の例です。

おわかりのように、これは非常に良い原則ですが、 は多くの人がそれが意味すると思うものではありません!

"実装ではなく、インターフェースへのプログラム" (GoFブックより)とは、すべてのインターフェイスを個別に作成するために邪魔にならないことを意味します。 ArrayList オブジェクトがある場合は、変数/フィールド/パラメーター/戻り値の型を List 型として宣言します。クライアントコードはインターフェイスタイプのみを処理します。

" Effective Java"ジョシュアブロッホの本では、「項目52:インターフェースでオブジェクトを参照する」で原理がより明確に表現されています。太字で記載されています:

  

オブジェクトを参照するのは、クラスではなくクラスによって完全に適切です   適切なインターフェースが存在しない場合はインターフェース。

単体テストの場合、状況は使用するモッキングツールの機能に完全に依存します。独自のツール JMockit を使用すると、インターフェイスを使用するコードの単体テストを簡単に作成できます。テスト対象のコード内からインスタンス化された最終クラスを使用するコードについては、依存性注入。

だから、私にとっての答えは、常に既存のインターフェイスを使用しますが、そうする正当な理由がない場合は新しいインターフェイスを作成しないでください(そしてテスト容易性自体は1)。

(テストまたはアーキテクチャのいずれかのために)必要になる前にインターフェイスを記述することはやり過ぎです。

さらに、インターフェイスを手動で記述することは時間の無駄です。 Resharperのリファクタリング「メンバーをプル」を使用できます。数秒で特定のクラスから新しいインターフェースを作成できるようにします。 IDEと統合する他のリファクタリングツールにも同様の機能が必要です。

通常は、小規模なプロジェクトで意味のあるインターフェイスのみを使用します。しかし、私の最新の仕事には、ほぼすべてのドメインオブジェクトにインターフェイスがある大規模なプロジェクトがあります。おそらくやり過ぎで間違いなく迷惑ですが、依存性注入のためにSpringをテストして使用する方法では、それが必要になります。

ほとんどの場合、Wicket、Spring、Hibernateを使用してWebアプリケーションを作成し、Spring Beansのインターフェイスを使用します。サービスとDAO。これらのクラスの場合、インターフェイスはまったく理にかなっています。しかし、すべての単一のドメインクラスにインターフェースを使用しているため、これはやり過ぎだと思います。

モデルオブジェクトの具体的なタイプは1つだけになると確信している場合でも、インターフェイスを使用すると、モックとテストが多少簡単になります(しかし、最近では、モッククラスを自動的に生成するのに役立つフレームワークがあります。 Javaクラス-Mockito、JTestR、Spring、Groovy ...)

しかし、テスト中にそれらをモックすることはさらに重要であり、インターフェイスに対するプログラミングはカプセル化のようなものを考えるのに役立つので、私はサービスのためにインターフェイスをさらに頻繁に使用します。

ドメインクラスのインターフェイスの作成は、ユニットテストに使用している場合に意味があります。単体テストではMockオブジェクトを使用します。そのため、ドメインオブジェクトのインターフェイスがあり、ドメインオブジェクト自体の準備ができていないが、クライアントがモックオブジェクトの助けを借りてインターフェイスの使用をテストできます。

インターフェイスは、ドメインモデルのインターフェイスの複数の実装もテストします。だから、私はそれが常にやり過ぎだとは思わない。

インターフェイスに対するプログラミングの主な理由は、テスト容易性だと思います。したがって、ドメインオブジェクトの場合-POJOまたはPOC#Oに固執するだけです)。つまり、クラスが特定のフレームワークを追加しないようにして、ビルドとランタイムの依存関係が異なることを防ぎます。 ただし、DAOのインターフェイスを作成することは良い考えです。

テスト(モック)およびAOPのようなものを支援するという理由だけで、すべてからインターフェイスを抽出します。 Eclipseはこれを自動的に行うことができます:リファクタリング->インターフェースの抽出。

また、クラスを後で変更する必要がある場合は、リファクタリング->プルアップ...を使用して、必要なメソッドをインターフェイスにプルアップできます。

*ドメインオブジェクトのプロキシを作成するために必要だからです。

これは、特に生成されたドメインオブジェクトとDAOオブジェクトに関して、私が遭遇したもう1つのことです。インターフェースの多くは、あまりにも具体的です。多くのドメインオブジェクトにIDとステータスフィールドがあるとします。共通のインターフェイスを共有しないのはなぜですか。これにより、フラストレーション、不必要にフラットな(継承に関する)ドメインモデルが発生しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top