2010-12-02 8 views
2

私は自分の会社でやった別のJavaプロジェクトを見てきました。このプロジェクトでは、開発者はドメインエンティティ(数百もあります)のインターフェイスを作成しました。いくつかのケースでは、抽象化は機能していると思うが、他のケースでは現時点では必要性がないように見える。すべてのJavaドメインクラスでインターフェイスを実装する必要がありますか?

インスタンスが渡されるたびに、それらは常に参照され、インターフェイス経由でアクセスされます。

これはあまりにも多くの将来の校正から肥大していますか?またはこの健全なエンジニアリングプラクティスですか?

+0

dup of http://stackoverflow.com/questions/152077/programming-against-interfaces-do-you-write-interfaces-for-all-your-domain-class? –

+0

私は遭遇した見知らぬ状況:ドメインオブジェクトのためのインターフェースですが、サービスのためのインターフェースはありません。これらのサービスを抽象化して自分のコードに挿入する完全なPITAにしました。そして彼らはすべて、ドメインオブジェクトのためにそれぞれ1つずつ実装しました。 !?!?!?! –

答えて

3

インターフェイスは実装なしで必要な動作を指定します。これにより、クライアントに影響を与えずに実装をスワップできます。これらは、アスペクト指向プログラミングやプロキシ生成のような技術に特に役立ちます。

しかし、実装が変更されない場合、私はインターフェイスの正当性を見ません。

ほとんどのモデルオブジェクトは、そのカテゴリに分類されます。実装上の違いがない場合は、インタフェースを使用しないでください。

インターフェイスはサービスや永続クラスにとっては優れていますが、モデルオブジェクトを抽象化するのに使用されることはありませんでした。

+0

パーシスタンスクラスでDAOを意味しますか? – HDave

+0

はい、そうです。 – duffymo

3

主に、インターフェイスは明らかに共通の特性を持つ異種のクラスを統合するための設計ツールです。

しかし、上記のようなインターフェイスは、単体テストの作成にも役立ちます。 easymockのようなツールは、インターフェイスでうまく動作します。

個人的に私はサービスのためのインターフェースを持っていますが、必ずしもドメインオブジェクトではなく、ドメインオブジェクトがどのように「リッチ」であるかに依存します。たとえば、ファイルシステムを大量に使用したり、サービス/ DAOレイヤーと密接に関連している場合は、おそらくユニットテストを簡単にするためにインターフェイスを作成することになります。

+0

実際これを言い直しましょう。私は疲れていると私はテストのための何かのようなインターフェイスを参照しているように聞こえる... –

+1

ドメインオブジェクトではなく、サービスのための+1 –

+0

@マーティンalgestenのテストは、IMHO他の間でインターフェイスを持つための良い理由です。 – stacker

1

私は彼らが複雑さで誇示したかったと思います。いくつかの実装がある場合、または拡張ポイントであることを示す場合にのみインタフェースを用意してください。

+0

彼らは、追加の実装が後で提供され、インターフェイスが作成された場合、ドメインオブジェクトを使用するサービスメソッドを変更する必要があると主張します。 – HDave

+1

それでは、なぜインタフェースを変更しなければならないのか、質問してください.--)(ちょっと私の経験) – stacker

0

いいえ。ドメインごとにインターフェイスが作成されているとしたら、何がポイントですか?インターフェイスは、複数のクラスをまとめてグループ化し、共通の動作を表す場合にのみ実際に役立ちます。

抽象化が過大評価されることがあり、簡単に過度に行うことができます。

1

インターフェイスを使用すると、同じ機能の複数の独立した実装を持つことができ、実装の詳細を取り除くことができます。

クラスに直接参照した場合に使用するように誘惑されるかもしれない実装の中にパブリッククラスがあるかもしれません。インターフェイスだけを使用することにより、呼び出しコードが許可されているものについてはトレスパスしないことが保証されます。

インターフェイスを扱う際には、あらゆる種類の高度な操作が可能です。デバッグを追加する必要があります。それぞれのメソッドに対してロギングを行い、ラップされたインスタンスを呼び出すラッパーを作成します。

リストがオンになります。インターフェイスへのコードあなたのコードはそれに適しています。

+1

"インターフェイスへのコード"は、インターフェイスの実装が複数ある場合にのみ意味があります。インタフェースと実装の間に1対1の関係がある場合、実際には意味をなさず単純にメンテナンスオーバーヘッドが増加します。 –

+0

私はクラスが外部コードによって使用されると考えていました。質問を読んだ後、私はこれが実装で内部的にも使用されていることがわかります。私はそれが過ぎていることに同意する。テストのために必要なときにのみ内部コードで行います(これはありますか?)かモックです。できるだけシンプルにしてください。 –

2

経験則:抽象化のための抽象化を導入しないでください。何とかあなたのプロジェクトを可能にする場合にのみそれを行います。単体テストを簡単にしたり、アップグレードを容易にしたり、依存関係注入などを可能にしたりする場合は、プロジェクトをもっと複雑にしないでください。

ドメインオブジェクトの場合、それらがPOJOの場合、実際にはインターフェイスを作成するメリットはありません。彼らがPOJOでないなら、私は彼らが実際にドメインオブジェクトではないかもしれないと主張します...しかし、私はそれが別の議論であると思います。

関連する問題