web-dev-qa-db-ja.com

同じ名前のクラスを処理する方法(異なるパッケージ)

私と私のR&Dチームは、大規模なコードベースを維持しています。ビジネスロジックを複数のパッケージに分割しました。一部には同じ名前のクラスがあります。

ご想像のとおり、両方のクラスが同じJavaファイルで参照されている場合、名前は競合します。


例えば:

com.myapp.model (package)
 - Device (class)
 - ...

com.myapp.data (package)
 - Device (class)
 - ...

これらのケースを処理するためのベストプラクティスは何かについて議論があり、次のオプションが考えられました。

最初のオプション

  • クラスの名前を変更し、接頭辞を追加する

    ModelDevice
    DataDevice
    

2番目のオプション

  • 両方が参照されている場合の完全なパッケージ+クラス名の使用

    com.myapp.model.Device
    com.myapp.data.Device
    

コード管理とスケーラビリティの点で、何が正しいのですか?

現在、両方のアプローチを混合しており、矛盾が生じ始めています

9
Jossef Harush

パッケージ名を使用します。この種の問題がまさにJavaがパッケージの命名規則を使用している理由です。同じ会社の2つのチームであろうと、地球の反対側にある2つのチームであろうと、この種の問題を防ぎます。

16
Bryan Oakley

現在、1つのModelDeviceクラス(モデルパッケージ内のデバイス)があります。異なる分類のために別のそのようなModelDeviceがある場合はどうなりますか?問題は引き続き発生する可能性があり、オーバーヘッドも増加し続けます。

とりあえず、クラスの名前を変更すると役立つ場合がありますが、長期的には、業界標準であるパッケージ名にプレフィックスを付けることをお勧めします。

1
itsraghz

まだ言及されていない1つの側面を追加するだけです。

使用パターン、つまりJavaソースが一方または両方のクラスを参照するソース)を見てください。

IMHO、ほとんどの場合、ソースファイルは競合するクラスの1つだけを参照する必要があり、コンテキストから、それらがモデルとデータのどちらの世界を処理するかを明確にする必要があります。なんらかの理由で難しい場合は、ソースコードのパッケージ接頭辞付きのクラス名が一般的に嫌いなので、クラスの名前を変更します(読みやすさが低下します)。

両方の世界を扱うソースファイルがある場合、それらは2つの異なる世界のビュー間で変換する責任を持つクラスをブリッジしている可能性があります。

ただし、1つのソースで両方のデバイスクラスを表示することは、モデルとデータの世界のタスクを混合することにより、ソースが単一責任の原則に違反していることのヒントになる場合もあります。

0
Ralf Kleberhoff