PACをなるべく簡単に実装したい

ここで、自分的にPACのそれぞれの役割をまとめてみる。

Presentation

  • UI
  • ユーザーの入力を(必要であれば)Controlに渡す

Control

  • 他エージェントと連携するのに必要な機能を司る、つまり、
    • 外部から参照する自エージェントの状態保持
    • 上位エージェントへのメッセージング
  • 自エージェント内でのPresentationとModelの仲介

Abstraction

  • エージェント内の主な機能のロジックとデータを司る


ここから、各部分間の関係について実装面から考えてみる。

P(Presentation)-A(Abstraction)

AのデータをPに反映させるのが唯一求められること。こういうのはよくObserverパターンが用いられる。
ASではデータバインド機構があるのでそれを使わない手はない。

しかしPACでは、PとAの間のやり取りは認められてない。だがせっかくバインド機構があるのに手間はかけたくない。
ということでPACから外れて、やっぱり上のようにする。


こうなると本当はPACよりHMVCというので紹介されたパターンになる。
http://www.javaworld.com/jw-07-2000/jw-0721-hmvc.html
HMVCはHierarchical-MVC(階層MVC)のことで、MVCをPAC化したようなものになっている。

この記事は詳しく書かれていてタメになると思う。

A-C(Control)

AのデータはバインディングでPへ渡すとしたので、AからCへはMVCのM-Cと同じく基本的に何もすることはない。ただし他エージェントとのやりとりはCでするため、例えばAでの処理の終了が外部の動きにも関係する場合は、処理終了をCに知らせる必要があるだろう。これは(P-Cと同じく)イベントの送出で実装した方が依存しなくていいだろう。

CからAは、Cで何かイベントを感知した時(Pからのイベントや外部からの呼び出し)に、Aを操作できればいい。これは普通にCからA(のインスタンス)のメソッドを呼ぶことでいいだろう。

P-C

PからCへはユーザーからの入力を伝達する。(そして必要に応じて外部やAに伝達される。Pから-Aに直接ユーザー入力を教えてもいいが、外部エージェントに関係する入力もあるだろうから、Cを経由するルールにする)

CからPはMVCのVCと同じく何もすることなし。だが、PACではCが全ての起点になるため、実際にはControlオブジェクトからPresentationインスタンスを生成しないといけない(Abstractionインスタンスも同様)。

よって、なるべく依存性をなくす形を取るために、Controlオブジェクト内にPresentationインスタンスを持つのは仕方ないとして(DIとかFactory用に余計なクラスを作らない)、Presentationからはイベントを送出してControlはそれをキャッチすることにする。