web-dev-qa-db-ja.com

パッケージ構造の抽象クラス

多くのインプリメンターを持つ抽象クラスがあります。もちろん、抽象クラスをJavaパッケージ構造に配置する場所はたくさんあります。抽象クラスが実装者と同じパッケージにあるべきか、それとも「抽象パッケージ」にあるべきですか?パッケージか、それとも他の場所ですか?なぜそこに配置するのか説明してください-この特定のケースで何をすべきかだけではなく、設計についての議論を探しています。

6
Michael K

他のクラスと同様に、そのコンテンツから最も属しているパッケージに入れます。ほとんどの場合-毎回ではない-は、クラスの実装と同じパッケージに配置することを意味します。この抽象クラスを使用して、他のクラスと同じパッケージに抽象クラスを配置することがあります。これは他のクラスのAPIの一部です。その場合、クラスの実装は別の場所になる可能性があります。抽象クラスやその他の例外クラスなどに、追加のパッケージを使用することはありません。

なんでそうなの?実装の詳細に使用するのではなく、ソフトウェアのコンテンツを分類するためのシステムを構築するときに、パッケージ構造を使用することを好みます。抽象クラスは、APIを壊すことなく、後で有効な非抽象クラスになる可能性があります。ただし、パッケージを移動する必要がある場合は、古いコードが再度破損します。不必要だと思います。

9
Mnementh

私はちょうど同じことについて疑問に思っていました(ただし、インターフェイスクラスについて)。このディスカッションに投稿を追加しましょう。

Javaソフトウェアを使用して制御するデバイスを置くcom.cie.devicesパッケージがあります。今こそ、デバイスの階層の構築を開始するのに十分なデバイスがあるときです。タイプAデバイス用のTypeAインターフェイスを実装クラスと一緒にcom.cie.devices.typeaに配置する必要があるかどうか考えていました。そうしないことに対する私の主な主張は、com.cie.devicesにインターフェイスを配置することで、そのパッケージ内のインターフェイスを調べることで、すべての種類のデバイスをすばやく簡単に識別できるようになることでした。そうすることについての私の主な議論は、すべてのタイプA関連クラスをまとめることです。

結局、私はすべて同じタイプの関連デバイスを同じパッケージに入れます(つまり、com.cie.devices.typeaのすべてのタイプA)。1)com.cie.devicesのサブパッケージを見ると、すべてのタイプのデバイスがすぐにわかります。 2)com.cie.devicesパッケージを整頓します。これにはおそらくクラス階層の下位レベルにプッシュするのに十分な友達がいないいくつかの孤独なクラスがまだ含まれています。

以上です。これは、別の理由がある別のケースです。

0
Joanis