DODAIブログ – 05.O/Vマッピング


DODAI

執筆:M.K

O/Vマッピング

ドダイの中心的な機能はO/RマッピングではあるがO/Vマッピングも重要な機能である。O/Vマッピングなんて言葉を勝手に作って恐縮であるがそれくらい強調したい機能なのだ。

さて動的にDBから取ってきたデータを表示するにはどうするか?ASP.NETの標準的な方法は次のようなものだ。

<asp:Label id="hoge" Text="<%# HogeObject.hogeProperty %>" runat="server"/>

これは非常に強力なASP.NETの利点の一つだ。コードビハインドで対応付けられたページクラスのプロパティにアクセスできるのである。O/Rマッピングされたオブジェクトを通してDBのカラム名が使える。

すばらしい。しかし値の表示だけですむことはあまりなく、あっても表形式だろう(その場合にはもちろんDataGridが活躍する)。ビジネスアプリなら値は編集できなければならないことが多い。その場合はどうなるか?

<asp:TextBox id="hoge" runat="server" Text="<%# HogeObject.hogeProperty %>" />

これだけではだめだ。OKボタンを押されたときのハンドラで値を保存するように書かなければならない。

protected void buttonConfirm_Click(object sender, System.EventArgs e)
{
  HogeObject.hogeProperty = hoge.Text;
}

さて冷静になって今やったことを見直してみよう。これはまさにObjectとViewを相互にマッピングしているのである。Object⇔RDBも原始時代には手作業でマッピングを行っていた。そしてインピーダンスミスマッチが発見されてO/Rマッピング手法が研究されてきたはずだ。同じようにObject⇔Viewもマッピングしようではないか。

ドダイではO/Vマッピングを次のように行う

<dd:DTextBox id="auto_hogeProperty" runat="server" />
 
 protected void Page_Load(object sender, System.EventArgs e)
 {
   WebUtil.AutoFormToObject(this, HogeObject, "auto_");
 }
 protected void buttonConfirm_Click(object sender, System.EventArgs e)
 {
   WebUtil.AutoObjectToForm(this, HogeObject, "auto_");
 }

2つのメソッドAutoFormToObjectとAutoObjectToFormが肝だ。Objectのプロパティ名とViewのコントロールIDを利用して同じ名前のものを結びつけるのである。
またASP.NETのサーバーコントロールでなくドダイの独自のコントロールを使用する。独自といってもベースクラスはASP.NETであるからオリジナルが持っている機能はすべて使用できる。一番の違いはViewモードとEditモードを認識することである。このコントロールはViewモードではLabelと同じように振舞うのでEditとViewで違うコントロールを使用する必要はないのである。

つまりドダイではView画面と編集画面に同じソースを使用する(使用できる)。また【View画面】⇔【編集画面】⇔【確認画面】などという複雑な遷移を行う場合にも同じソースが利用できる。わざわざ同じようなことを2度、3度と書く必要はないのである。

またプロパティ名は一箇所(コントロールのID)にしか記述しない、リフレクションが勝手に判断してくれるからだ。最初の方法では3箇所くらい記述していたし、プロパティが20個になればそれだけ単調な繰り返し作業が増えるのである。改めて言おう、同じことを2度書く必要はないのである。

書く手間が減るだけではない。HogeObject.hogeProperty = hoge.Text; のところで右辺と左辺の対応がある。HogeとHageがあってHogeObject.hogeProperty = hage.Text;などとやってしまうと見つけづらいバグになってしまう。余計なコードを書かないことは手間を減らすだけでなく品質まで同時に高めるのである。

ところで皆さんはコントロールのID(もちろん変数名でもある)に命名規則を使っているだろうか? VS.NETでサクサクつくっているとTextBox1だのという無意味な名前になってしまう。わざわざ命名規則のためにだけコントロールのIDを変更しているのならそれはムダというものであろう。命名規則を使っていないのならご愁傷様だ。

ドダイではコントロールのIDは必ずそれと結びつくデータオブジェクトのプロパティ名になる。これは命名規則ではなく強制されているのでプログラマの不注意のバグはなく信用できる。結果としてテスト工数も削減できるのである。

ところでこうやってドダイを説明すると「気持ち悪い」といわれることがある。ID名で勝手に結びつけるのは気に入らないという論法である。そんな場合には私は少しうつむいてこういうことにしている。
「いいジャン。NAMAE Oriented Programmingなんだから」