BeansbindingとDTO

Beansbindingをいろいろと触っている。
このライブラリィだが、下記の.NETのデータバインドのように、

GUIControl <-> |               |   |            |
GUIControl <-> | BindingSource |<->| DataSource |
GUIControl <-> |               |   |            |

間にBindingSourceを仲介してデータソース・オブジェクトとGUIコントロールがバインドを共有するのとは違い

JavaBeans  <-> [ Binding ] <-> JavaBeans
JComponent <-> [ Binding ] <-> JComponent
JComponent <-> [ Binding ] <-> JavaBeans <-> [ Binding ] <-> JComponent
JComponent <-> [ Binding ] <-> JComponent <-> [ Binding ] <-> JavaBeans

これらのように、オブジェクト間のバインド(関係)を別個に作りデータの同期を実現できる。

データバインドの用途の最たるものは、GUIとロジック間でデータを交換する処理を省力することだ。GUIとロジックの間で直接データをやりとりすることは勿論できるが、テスタビリティ、互いの依存を極小とするために間にDTOと呼ばれる箱詰め専用のオブジェクトを挟む設計をすることが多い。私も箱詰めの処理が自動化できるのであれば、DTO有りを選ぶ。

このような設計でアプリケーションを組むとして、プラットホームを.NETとした場合、通常ははDTOをデータソースとして用意する。

GUIControl <-> |               |   |            |
GUIControl <-> | BindingSource |<->| DataSource |
GUIControl <-> |               |   |            |
               |    (DTO)      |
Biz Logic  <-> |               |

こうすれば、ロジックはGUIやデータソースに依存せずにデータを取得できるし、データを更新することでGUIを自動的に更新できる。(拙作の.NET WindowForms向けフレームワークではこの設計且つ、箱詰め処理を自動化して全面的に採用している)

さて、Beansbindingで同様のことを行おうとすると、DTOをJavabeansとして設計することは間違い無いが、既に書いているようにバインド関係を生成するのに制限が無いため、バインドするGUI(JComponent)が複数ある場合、以下のように複数のパターンでバインド関係を構成することができるはずである。(LogicはいずれのケースでもDTOを参照することとする)

JTable <-> [Binding] <-> DTO(ObservableList+JavaBeans) | <-> [Binding] <-> JTextField 
                                                       | <-> Biz Logic   
  • ケース2 (DTOGUIが並列でバインドされる)
JTable |<-> [Binding] <-> JTextField 
       |<-> [Binding] <-> DTO(ObservableList+JavaBeans) <-> Biz Logic 

さながら乾電池と豆電球の結線図のごとしだが、実際の処理も結線方法同様に長所と短所があることが想像される。がしかし、現在はそこまで掴んでおらず、どちらのバインド方法を選ぶか迷っているところだ。うーん。
(ちなみにNetBeans 6のウィザードで生成されるSwingデスクトップ/データベースアプリケーションは、ケース2のバインド方法が選択されている)