web-dev-qa-db-ja.com

インターフェイスはどこに配置すればよいですか?

DBと通信するためのインターフェースがあります(実際にはデータベースではありませんが、これは具体的な例を示すためです)。

interface DbInterface{
    Result sendQuery(Query q);
}

そして、特定のコンポーネントを個々のプロジェクトに分離することで、再利用性を向上させようとしています。

  • App1、データベースへのアクセスを必要とするアプリケーション
  • App2、データベースへのアクセスを必要とするアプリケーション
  • DB1、DbInterfaceの具体的な実装(SQLとしましょう)
  • DB2、DbInterfaceの具体的な実装(たとえば、NoSqlデータベースを使用する)

通常、このようなアーキテクチャをどのように設計し、DbInterfaceをどこに配置する必要がありますか?

  • アプリケーションの1つで?しかし、それは他の3つのコンポーネントすべてがインターフェースにアクセスするためにそのプロジェクトに依存していることを意味します-正しく聞こえません
  • dB実装の1つで?同じ-正しく聞こえません。
  • 両方のDB実装で?コードの重複。
  • 別のプロジェクトで、そのインターフェイスのみが含まれますか? 1つのインターフェースのみの依存関係を含めることは悪用されているようです。

参考までに、これはJava + mavenですが、問題はかなり一般的だと思います。

5
assylias

私は個人的に別のプロジェクトに行きます。私が取り組んだほとんどすべてのプロジェクトには、他のすべての人が参照するある種の「共通の」プロジェクト/ライブラリがあります。

単一のインターフェースだけではやり過ぎかもしれませんが、将来的には同様のケースが発生する可能性があり、その場合はすでにそれらを配置するための専用の場所があります。

あなたのアプリケーションの詳細はわかりませんが、共通のプロジェクトに参加できる両方のプロジェクトに役立つ可能性のあるヘルパークラスなどはありませんか?

6
razethestray

このシナリオでは、個別のプロジェクトが最適です。今では単一のインターフェースしか含まれていませんが、成長する可能性があります。通常、このタイプのプロジェクトは「API」のようなものと呼ばれます。このようなプロジェクトにロジックを含めることができない理由はありませんが(たとえば、異なるAPIインターフェイスにファサードを提供したい場合)、実装固有のものであってはなりません。

とにかくインターフェースにコーディングする必要があるため、ほとんどのアプリケーションはこのAPIプロジェクトにのみ依存する必要があります。ある種の特定の実装に結びついているプロジェクトだけが、実際にAPI実装について知る必要があります。 DIを広く使用する最新のアプリケーションでは、実装は通常、実行時の問題にすぎません。

Javaレルム。 [〜#〜] jpa [〜#〜] および Apache Commons Logging (またはその他のロギング)に例がたくさんあります。 API)は、おそらくすでに使用しているカップルです。

あなたのコメント「1つのインターフェースのみの依存関係を含めることは悪用されているようです」。初めて遭遇したときにこれが少し厄介に感じることはわかりますが、実装を含める必要がある場合と同じように、プロジェクトに不要な依存関係を含める方が虐待的であると主張します。インターフェイスのみ。

3
smp7d