web-dev-qa-db-ja.com

Vaadin:デザインパターン

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

今Vaadinではそれは別の話です。したがって、Vaadinのスペシャリストがいる場合は、いくつか質問させてください。

質問1:

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

質問2:

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

質問3:

  • UIコンポーネント間の依存関係は、かなり乱暴になる可能性があります。おそらくここでは何もすることはありませんが、このウィンドウがポップアップに依存するこのリストに依存しているように感じられない場合があります...あなたは考えを理解します、それは私と密接に結びついているように見えます

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

30
Xorty

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

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

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

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

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

私は最近 MVC対MVP対MVVMに関するプレゼンテーション を行いました。サンプルコードは、MVCからMVVMへの移行を理解するのに役立つ場合があります。 JavaScriptで書かれていますが、ほとんどの人がフォローできると私は信じています。ご意見をお待ちしております。

15
Dusty J

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

回答1

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

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

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

回答2

メインアプリケーションの参照を渡すことは、良い解決策ではないようです。アプリケーションインスタンスがセッションを表していることに気づきましたが、ある種の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

9
Renat Gilmanov