30

私は現在 3 つの Vaadin アプリケーションに取り組んでおり、何かが恋しいと感じています。以前は Spring MVC を使用していましたが、アーキテクチャが明確で分離されていて、サービスをコントローラーに注入し、コントローラーを UI に結合しないなどでした。

Vaadin では話は別です。Vaadin の専門家がいる場合は、いくつか質問させてください。

質問1:

  • サービス (ま​​たは DAO) を UI コンポーネントに直接注入しても問題ありませんか?
  • : 電子メール アプリケーション (リンク付きの VerticalLayout に基づく ContactWidget) で連絡先を表示するコンポーネントは、連絡先を表示する必要があります。この UI 要素に contactRepository を直接注入しても問題ありませんか?

質問2:

  • 多くの UI コンポーネントが何らかのグローバル データにアクセスするか、メイン アプリケーション クラスでグローバル メソッドを呼び出す必要があるため、メイン アプリケーションへの参照が大量の UI コンポーネントに渡されます。
  • : Popup コンポーネントには、アプリケーションのメイン ウィンドウの子である必要がある、新しいウィンドウを開くボタンがあります。したがって、ポップアップ コンポーネントにはメイン アプリケーションへの参照が必要です。

質問 3:

  • UI コンポーネント間の依存関係は非常に大きくなる可能性があります。おそらくここで行うことはあまりありませんが、このウィンドウがそのポップアップに依存するこのリストに依存しているように感じられないことがあります...

コードがSpaghettiになる前に、Vaadin を使用した優れた設計についてできるだけ多くのことを学びたいので、提案、経験、ベスト プラクティスをいただければ幸いです。

4

2 に答える 2

15

MVVM パターン (別名Fowler の PresentationModel )を使用することは非常に幸運でした。彼のドキュメントは少し古いですが、良い出発点です。

あなたがそれを読んだ後、私の答えはより理にかなっているかもしれません

  1. いいえ。ViewModel にサービスを挿入します。ViewModel は Facade になります (必要に応じて、アダプター、デコレーター、キャッシュ、およびその他のパタ​​ーンをカプセル化できます)

  2. ここに質問はありませんでしたが、あなたが説明しているものと同様の状況があります。Guava の EventBus を使用して、分離されたコンポーネント間の通信を行います。このようにして、新しいウィンドウをポップアップする必要がある場合は、次のことができ eventBus.post(new NewWindowRequest(theComponent)) ます。 メイン アプリケーションを同じイベントにサブスクライブしてから、ウィンドウをポップアップすることができます。

  3. MVVM と EventBus の慎重な使用が役に立ちます。また、Vaadin の BeanItem と ObjectProperty は、Vaadin の組み込みオブザーバー/データ バインディング パターンの一部であるため、変更を伝達するために使用できます。

私は最近、 MVC vs MVP vs MVVM に関するプレゼンテーションを行いました。サンプル コードは、MVC から MVVM への移行を理解するのに役立ちます。JavaScript で書かれていますが、ほとんどの人が従うことができるほど簡単です。フィードバックをお待ちしております。

于 2012-10-07T18:28:21.820 に答える
9

Vaadin は優れたソフトウェアであり、スパゲッティ コードで終わるべきではありません。とにかく、すべてはあなた次第です。

答え 1

いいえ、そうではありません。使用されているフレームワークに関係なく、密結合は良くありません。あなたの例(ContactWidget)は、リストのカスタム実装について説明しています。追加情報の有無にかかわらず、表としてレンダリングできます。より複雑で柔軟なテーブルの例を使用します (高度なテーブル コンポーネントと適切なデータ バインディングを備えたアプリケーション全体を構築できます)。

Vaadin は、よく知られた MVC パターンに従って高度なデータ モデルを定義します。ネストされた 3 つのレイヤーがあります: コンテナー、アイテム、プロパティ (プロパティ ビューアーとエディターも定義されています)。Vaadin の本は、スプレッドシート アプリケーションとの類似性を示唆しています。したがって、コンテナ、アイテム、およびプロパティは、テーブル、行、およびセルに対応します。想像しやすい、理解しやすい。最後に、ItemContainer はその性質を明らかにし、これが優れた柔軟な Vaadin ベースのアーキテクチャの重要な契約であることを理解するでしょう。他のすべての詳細を取得するには、Vaadin の本を参照することをお勧めします。

さらに理解を深めるために、PagedTable アドオンの背後にあるコンテナーの実装を確認することもできます。また、ArrayContainer https://vaadin.com/directory#addon/array-containerから始めてください。これにより、多くのことが簡素化されます。

答え 2

メイン アプリケーション参照を渡すことは、良い解決策ではないようです。Application インスタンスがセッションを表すことに気付きましたが、ある種の SessionContext コントラクトを定義する方がはるかに優れています (アプリケーションで実装できます)。静的メソッドを定義して、関連する SessionContext インスタンスへの透過的なアクセスを提供できます。内部では、ThreadLocal 変数http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.htmlを使用できます。このようにして、すべての寄生パラメータの通過を取り除くことができます。

答え 3

細心の注意を払って階層を設計してください。自分で再描画をトリガーしないでください。代わりにRefresherを使用してください。アーキテクチャ全体に注目してください。

最後に、Vaadin は使いやすいので、メイン コードベースを変更する前に、気軽に小さな PoC やデモを行ってください。

提案されたように、MVVM https://vaadin.com/directory#addon/bambi-mvvmを試すこともできます

于 2012-10-07T21:01:28.940 に答える