5

私がインターフェースを持っているとしましょう:

package org.my.dicom.CEchoSCU;

public interface CEchoSCU {
    // stuff here...
}

インターフェイスの実装も行います。

public class SimpleCEchoSCU implements CEchoSCU {
    // stuff here...
}

私の質問は、どのパッケージに実装を格納する必要があるかということです。他の開発者が実装をインターフェースと同じパッケージ (org.my.dicomこの場合は ) に配置したり、別のパッケージ (通常は のようなものorg.my.dicom.impl) を使用する場合を見てきました。個人的な好み以外に、どちらかを優先する理由はありますか?

4

6 に答える 6

6

クラスは、特にインターフェースを実装します。クラスが実装する1つのインターフェースを反映するパッケージではなく、クラスの残りの部分が行う/含むものに関連するパッケージにクラスを貼り付けます。たとえば、Printable を実装するクラスが 200 ある場合、それらすべてをパッケージ com.mycompany.impl.printable に入れることはできません。printable を実装する Airplane クラスは、他の飛行機のものと一緒にパッケージ化されます。Boat クラスは、他のボート用品と一緒にパッケージ化されます。Printable を実装する Car クラスは、他の車関連のものと一緒にパッケージ化されます。

すべての SimpleCEchoSCU (およびその他の将来のクラス) が CEchoSCU を実装する場合は、CEchoSCU を抽象基本クラスにして、別の実装を派生させることを検討する必要があります。いずれにせよ (インターフェイスまたは抽象基本クラス) は完全に関連しているので、それらを同じパッケージに入れます。

于 2012-10-19T14:27:36.520 に答える
6

implementationクラスとinterface. 本来あるべき場所にアクセスできる限り、どのパッケージにも含めることができます。

related classesしかし、もちろん、すべてを 1 つpackageにまとめ、classを1つにしたいと思うでしょう。not relatedset of classesdifferent package

ほとんどの場合、私interfacesアプローチは次のとおりです。そうすれば、自分のインターフェイスを他の人に譲りたい場合、すべてのインターフェイスを含むパッケージを直接譲渡できます。different packageimplementing classesdifferent package

ただし、それは要件と、コードで従う設計手法に完全に依存します。

したがって、パッケージ名の一般的な選択は次のとおりです。

  • com.someName.api -> インターフェース用
  • com.someName.impl-> クラスの実装用。

apiそうすれば、と を簡単に分離できますimplementation

于 2012-10-19T14:18:46.787 に答える
2

私は通常、次のようなルールに従います。

  • 共通の実装を提供したい場合は、それらを同じパッケージに入れます (例: List と ArrayList)。
  • 再利用可能な実装があるが、たとえば異なるテクノロジまたは異なるビジネス機能の場合は、それらを個別のパッケージに入れます
  • 他の人が直接インスタンス化すべきではないプライベートな実装がある場合は、それらを *.impl または *.internal パッケージに入れます。これは、OSGi バンドルでは非常に一般的です。
于 2012-10-19T14:49:00.933 に答える
1

私は実装をそのような名前のパッケージに入れることを好みます:

path.to.package.of.interface.impl

ただし、これは普遍的な慣習ではなく、ソフトウェアを開発する組織に固有のものだと思います。

于 2012-10-19T14:17:38.720 に答える
1

原則として、パッケージは好みと組織の問題です。一部の場所では、ビルドスクリプトを使用してAPIインターフェイスを除外します。たとえば、実装とは別のパッケージに含まれている場合は、APIインターフェイスを簡単に除外できます。本当に重要なのは、一貫性を保つことで、人々が何を期待できるかを理解できるようにすることだと思います(制限を課すツールやスクリプトを使用している場合を除く)。

于 2012-10-19T14:17:42.043 に答える
1

実装クラスを任意のパッケージに配置しても問題はありません。これにより、コンパイル エラーは発生しません。ただし、impl クラスをどこに配置するかは、プロジェクト コードの設定によって異なります。ほとんどの場合、実装クラスはインターフェースと同じパッケージに含まれます。

ただし、インターフェイスはさまざまな種類のクラスで実装できるため、その場合、実装クラスとインターフェイスは異なるパッケージになります。

例は、または!Bounceableによって実装できるインターフェイスです。BallJellyCar

于 2012-10-19T14:23:13.277 に答える