2012-01-11 12 views
5

私は近代的なJavaコンパイラとバーチャルマシンに慣れていないので、コンパイル中や実行時に、パッケージ依存関係のゴードの結び目が拡大するにつれて、技術的な問題が大きなJavaプロジェクト(5000以上のクラス)に遭遇するのは不思議です。大規模なJavaプロジェクトで、複雑なパッケージ依存関係が発生しないようにする技術的な理由はありますか?

大規模なプロジェクトでは、大規模なプロジェクトでは、非循環のライブラリ(またはパッケージ)依存グラフから離れてしまうと、技術的なトラブル(すべての保守性に関する懸念を脇に)になります。

ソースツリーのほとんどが(オブジェクトのアーカイブは一般的にC++のプロジェクト内のパッケージと相関)あまりにも多くのオブジェクトのアーカイブが含まれている場合は、あまりにもすることができますリンク

  • が含まれている場合

    • コンパイルがメモリ不足になる可能性がいくつかの例

    この問題は、インラインテンプレートのインスタンス化でかなり悪化します。現代のワークステーションには、ビルドのどちらのフェーズでも、大規模なクラスの大部分をプルするプロジェクトをコンパイルしてリンクする機能がありません。

    私が尋ねたJava開発者は、循環的なパッケージ依存性を避ける理由は技術的な制限ではないと考えています(他の動機が適用されます)。いずれかがあります?

  • +0

    Javaの技術的な制限にかかわらず、循環パッケージの依存関係はモノリスにつながる可能性があります。それらを避けることは役に立ちます。 –

    +0

    @ AndyThomas-Cramer - Javaの "パッケージ依存関係"とは何ですか?私はそのようなことは考えていない(コンパイラに関する限り)。 –

    +0

    @TedHopp - 下のあなたの同様のコメントに対する回答を参照してください。 –

    答えて

    4
    1. Javaコンパイラ(javac)は、同時にすべてのクラスをコンパイルするのではなく、一つ一つ、動的にコンパイルされていないか、古い.classファイルを発見しません。

    2. をリンクするはありません。代わりに、.classファイルはすべて、一度コンパイルされるとjarファイルにまとめられます。これは基本的にZIP圧縮であり、このステップは必要でもありません。

    3. Javaコンパイラは、単純な言語構文とセマンティクスのために適度に単純です。メタプログラミング、型推論などはあまりありません。例えば、Scalaコンパイラは、言語自体がはるかに複雑であるため、はるかに遅くなります。

    大規模な、もつれたプロジェクトをコンパイルする技術的な制限はありません。明らかにビルド時間が長くなり、10分を超えると痛みになりますが、それは実際問題ではありません。

    本物の問題は、絡み合った円形の相互参照で、ソースコードの保守性があります。主に、コードをリファクタリングすることははるかに難しいです。プロジェクトが特定のサイズに達すると(5000+クラスはおそらく約50万のLOCです)、開発者はそれを分割して分割しようとします。ライブラリ、モジュール、レイヤーを抽出します。依存関係が非常に強い場合、このプロセスは不可能に近づきます。

    +1

    .classファイルを持たないA.javaとB.javaがあるとします。クラスAがコンパイルするB.classの存在に依存し、クラスBがコンパイルするA.classの存在に依存する場合、コンパイラは.classファイルを単純に生成することができないので、それらを同時にコンパイルします順次)。コンパイラの戦略の1つは、.classファイルを段階的に生成することです.Bをコンパイルするのに十分なA.classを行い、次にA.classを終了して終了します。私の本では、それはまだ一緒にコンパイルしています。 –

    +0

    トマシュはそれを一言で言います。これはコンパイラの問題ではなく、良いモジュール性の問題です。 1つのメソッドに数千行のコードを入れたり、クラス内に何千ものメソッドを入れたりすることはありません。人間開発者がコードを理解しやすくするためにモジュール化します。クラスレベルで停止するにはスケーラビリティがありません。より高いレベルのモジュールが必要です。瓶、豆、バンドルなどはこの目的を果たしますが、これらのパッケージには念頭に置かれたクラス以上のものが含まれていれば、その間に何かが必要であり、パッケージはあなたがJavaで持っているものです。モジュール構造は非周期的でなければなりません。 –

    1

    Javaにパッケージ依存関係はありません。クラス(およびインターフェイス)の依存関係のみが存在します。 Javaでパッケージをインポートするときは、コンパイラに名前の解決方法を伝えるだけです(使用するすべてのクラスまたは静的インポート名を完全修飾する必要はありません)。

    何千ものクラス間の循環依存関係はおそらく、コンパイラを無意味にするでしょう。

    +0

    これは非常に強い声明です。実際には、Javaパッケージ間の依存関係や、それらを表示するツールが存在します。コンパイラはパッケージの依存関係を無視すると言うことができます。 –

    +0

    @ AndyThomas-Cramer - Javaパッケージ間の依存関係は何ですか?それを作るのは何ですか?それにはどのような影響がありますか?パッケージ階層に関しては、Java言語に関する限り意味値はありません。厳密にはコード管理ツールです。 –

    +0

    依存関係は、メソッド、クラス、パッケージ、jarファイルの中の複数の粒度で存在します。コンパイラに関連するものとそうでないものがあります。 「この依存関係は言語/コンパイラに関しては効果がありません」と言っていることと、「パッケージの依存関係は実際にはありません」との違いがあります。 –

    関連する問題