1

Javaである種のMVCを実装しようとしています。実際にはMVPのほうが多いですが、これは私の問題にはあまり関係ありません.

次の状況: Netbeans で作成された GUI があります (より優れた GUI エディターのため)。これは頻繁に更新および変更されます。

私の主なプロジェクトは Eclipse の方が維持しやすいので、Netbeans プロジェクトを別のプロジェクトとして Eclipse にインポートすることにしました。ここではApp、コントローラーとモデル パッケージを含むプロジェクト " GUI" と、ビュー パッケージを含むプロジェクト " " を使用しています。問題は、私がフォローしているパターンには、ビューとコントローラーの間に循環的な依存関係があることです。ビューが変更されるたびに、コントローラーはモデルから取得するデータを決定し、ビューに変更を加えることを通知されます。

Appのビルド パスに追加するGUIと、「プロジェクト 'GUI' のビルド パスでサイクルが検出されました」というエラー メッセージが表示されます。そうです、このサイクルはすでに私のデザインに組み込まれています。

現在、起動時に次の方法でコントローラーにビューを登録します(これは実際のコードではありません。短縮しようとしています)

package view;
import controller.*;
class viewA{
   ...
   public viewA() {
       controllerA.register(this);
   }
   ...  
}

package controller;
import view.*;
class controllerA implements SomeListener{
   ...
   protected viewA[] registeredViews;
   public static register(viewA interestedView){
       arrayPush(registeredViews,interestedView);
       interestedView.addSomeListener(this)    
   }
   ...
}

コントローラーへの参照を渡し、リスナーをこのビューに登録することで、接続が確立されていることがわかります。問題は、のビルドパスにGUIプロジェクトAppがない場合、インポートを解決できないことです。のビルドパスにない場合も同じAppですGUI

このプロジェクト構造を維持し、MVC アーキテクチャにもこだわりたいと思います。どうすれば回避できますか?あなたの提案は何ですか?

4

4 に答える 4

7

リスナーは通常の方法とは逆になります。通常、コントローラーが主導権を握ります。ビュー オブジェクトを作成し、ビュー イベントのリスナーとして自身を登録します。

さらに、リスナー タイプは、View プロジェクトで定義されたインターフェイスである必要があります。次に、コントローラーはそのインターフェイスを実装し、ビューは具体的なコントローラー クラスについて知る必要はありません。サイクルが解決されました。もちろん、これは「逆」セットアップでも実行できます。

于 2009-04-21T22:50:57.527 に答える
4

クラス間の循環依存は、それ自体は問題ではありません (その機能です)。ただし、設計を確認し、依存関係を正当化する必要があります。

Eclipse プロジェクトは、おそらく少し使いすぎです。残念ながら、Eclipse は多くの (10 以上の) プロジェクトを持つことを実際には処理できません。また、othervise の優れた部分コンパイラーは遅くなり、コンパイル プロセスのバグが増えるようです。

私が関わってきたいくつかの開発プロジェクトでは、プロジェクトの数をマージして減らすことで、ビルド時間が短縮され、ビルドの問題が少なくなりました。

社内アプリケーションでは、大小を問わず、コードに取り組んでいる全員がすべてのコードにアクセスできる可能性が高い場合、プロジェクト間でコードを分割しても実際にはほとんど意味がありません。

依存関係を追跡することが心配な場合は、パッケージ間の依存関係のルールを適用することができます。

大規模なアプリケーションの「モジュール」ごとに「ビジネス層」プロジェクト、「データ」層プロジェクト、および gui プロジェクトを持つことは非常に一般的です。人工的な「インターフェースプロジェクト」など

依存関係を削除するために多大な時間を費やす前に、依存関係が実際に本物であり、代わりにプロジェクトをマージする必要があるかどうかを検討してください。

「モジュール」や「レイヤー」などの抽象的な概念は、必ずしも一致するプロジェクトやフォルダー (またはその他のもの) を用意する必要があるという意味ではないことに注意してください。Eclipse プロジェクトは、作業するファイルのグループであり、多かれ少なかれ実際には何もありません。

the-mythical-business-layerについて読みたいと思うかもしれません。

于 2009-04-22T06:17:16.173 に答える
2

まず、実際のクラスではなくインターフェイスを使用して、コントローラーとビューを相互に表現したい場合があります。

この種の問題はかなり一般的であり、残念ながら、プロジェクトは Eclipse でサイクルを作成するべきではないため、本当に良い解決策があるとは思いません (Netbeans で許可されているのでしょうか? 驚くべきことです)。

できることのほとんどは、互いに独立して開発し、システムの各部分が依存する共有インターフェイスを持つ共通のプロジェクトを使用することです。これは、一部のデザインで機能する可能性があります。次に、両方の部分を認識し、実際の初期化を行う別のドライバー プロジェクトを作成できます。

本当にそれを避けたい場合は、Spring のような依存性注入を使用する必要があるかもしれません。

于 2009-04-21T22:35:02.637 に答える
1

プロジェクト自体に依存させるのではなく、2 つのプロジェクトの一方の .jar ファイルをもう一方のプロジェクトに追加することもできます。必要に応じてjarを更新することを忘れないでください。

于 2011-12-08T22:59:47.843 に答える