問題1:このような階層がある場合、コントローラーとビューの間でデータを転送するにはどうすればよいですか?親から子にデータを渡していくと、多くの重複が発生し、1人の子を変更すると、すべての親に変更が必要になります。ビューがdbからのデータに直接アクセスすることを望まず、データがコントローラーのみを介してビューに転送されることを望みます。
階層を無視して、関連するコントローラーにビューを登録することで、より直線的なアプローチをとるのはどうですか?Observer
データは、またはListener
パターンを介して変更がトリガーされるモデルを介して取得できます。
これにより、重複が発生することはありません。すべてが1つのモデルまたは一連のモデルに集中化されます。1つまたは複数のコントローラーは、ユーザーアクションまたは外部イベントが発生した後、登録されたビューのリストに対して通知を実行できます。
また、あなたが言うように、ビューは間違いなくデータソースにアクセスするべきではありません。ここには少なくとも1つの抽象化レイヤーが必要です。コントローラーがメディエーターパターンを使用している場合、私が行うことは、追加のデータレイヤーのインターフェイスにリクエストを転送することでこれを処理することです。
さらに考えてみると、ビューで登録してもらうのはいい考えではないと思います。だから私はこれを別にしておくでしょう。手作業でビューを初期化するか、必要なビューを反復処理する方法を見つけます。おそらく、このステップを自動化する一種のファクトリを通してあなたの意見を得るでしょう。
問題2:そのような階層でビューからコントローラーにイベントを伝播する方法は?PropertyChangeListenerの使用を考えています。コントローラがアクションを実行する必要がある場合、ビューはPropertyChangeイベントを起動します。コントローラはこれらのイベントをリッスンし、何らかのアクションを実行します。しかし、階層に対してこれを行うと、コードが重複します。
ここでも、線形アプローチを採用できます。ビューが登録されると、コントローラーはそのビューにリスナーを追加できます。または、ディスパッチメカニズムを介して処理できるセマンティックスタイルメッセージ(例:doAction( "Save"))をビューに送信させることもできます。パラメータを転送する方法を決定する必要があります。
PropertyChangeListenersが必要ですか?つまり、そのような粒度が必要ですか?
役立つアイデアが3つあります。
パネルごとにコントローラーを使用しますが、このようにすると、コントローラーがたくさんなります。ビューとコントローラー間の通信を提供するMediatorデザインパターンを使用します。ビューからすべてのプロパティ変更イベントをリッスンし、関心のあるコントローラーに通知するCentral Reciever&Notifierを使用します。しかし、これは私の2番目の問題を解決するだけです:
これは漠然とHMVCのように聞こえます。このアプローチでは、サブシステムごとに3つのmodel-view-controllerがあります。これは興味深いアイデアですが、面倒な場合があり、階層がどのように機能するのか、調整/従属がどのように達成されるのかが明確ではありません。
おそらく、アプリのモジュール/サブシステムごとに4番目のニュートラルクラスを設定して、ビュー、モデル、コントローラーのいずれかが欠落しているか正しくない場合に例外をスローしてプラグインすることができます。
または、中央通知機能のこの考え方に従って、中央コントローラーを他の機能固有のコントローラーまたはより基本的なアクションへのルーティングメカニズムとして機能させることができます。メッセージがこれらにどのように再ルーティングされるかはあなた次第です。集中化によりこのクラスの設計が不可欠になるため、スレッド化に注意してください。
何をするにしても、物事をできるだけシンプルにするようにしてください。モデルとコントローラーを上げた状態で、大騒ぎせずにテストビューを表示できるはずです。