勉強日記

チラ裏

PoEAA ch14 Two Step View

martinfowler.com


Two Step View

Turns domain data into HTML in two steps:
first by forming some kind of logical page,
then rendering logical page into HTML.

  • ページが多数あるWebアプリケーションにおいて、一貫した見た目と構造にしたい
    • さもないとユーザが混乱する
  • Template ViewやTransform Viewでは実現が難しい
    • プレゼンテーションロジックが各ビューに散らばるから
      • 【補】どちらかといえばTransform Viewのほうがまだ共通化しやすい
  • 1箇所直せば全ページに変更が範囲されるようにしたい
  • データからHTMLへの変換を2段に分割することでこれを実現する
    • 1段目: 論理的なプレゼンテーションに変換
    • 2段目: 実際のフォーマットに変換
  • 2段目を修正すれば前ページに見た目の変更が反映される

How It Works

  • Logical Screen
    • 1段目の変換で出力されるプレゼンテーション指向な中間形式
    • 次のようなメンバをもつかも
      • ヘッダ
      • フッタ
      • テーブル
      • 選択UI
      • etc.
  • 1段目の変換: ドメイン指向のモデルからプレゼンテーション指向のデータ構造への変換
  • 2段目の変換: プレゼンテーション指向のデータ構造からHTMLへの変換
    • データ構造の各要素について認知しており、HTMLへのレンダリング方法を知っている
    • 出力結果は当然、Logical Screenから導出可能なものでなければならない
  • 実装方法はさまざま
  • 一番簡単なのはXSLT
    • 1段目: ドメイン指向のXMLからプレゼンテーション指向のXMLに変換
    • 2段目: プレゼンテーション指向のXMLからHTMLに変換
  • 別の方法: クラスを使う
  • 上記いずれの方法もTransform Viewベース
  • Template Viewでもできる
    • 中間形式ではカスタムタグを用いる
  • HTML用のWYSIWYGエディタは使えない

When to Use It

  • 変換を2段に分けることがキモ
    • サイト全体への変更を容易にする
    • 複数の見た目を容易するのにも役立つ
      • 比較的レアケースだが増加しつつある(書籍執筆当時)
      • e.g. 顧客ごとに変えるとか
    • ロジックの重複をなくし、数を減らす
      • Two Step Viewを採用しない場合、ページ数 x 見た目の種類の変換ロジックが必要
      • Two Step Viewを採用すれば、ページ数(1st stage) + 見た目(2nd stage)ですむ
      • 【所感】Gang of FourのBridge Patternに似てますね
  • プレゼンテーション指向の中間データ構造をどれだけうまく作れるかがキモ
  • デザインに凝ったWebサイトではうまくいかないことも
    • ページ1つ1つが異なりすぎて共通点を見いだせない
  • 弱点
    • HTML関連ツールが使えない・デザイナとプログラマが分業できない
      • Template Viewと比較しての弱点
    • 慣れないと実装が難しい
      • モジュールの呼び出しのレイヤーが増える
      • ひとたび慣れさえすれば、定形コードの繰り返しを減らしてくれるのだが
  • 別々のデバイス向けに複数の2nd stageを用意する、ということも可
    • ブラウザ用とPDA用とか
    • 【補】HTML用とCSV用、とかもこの類かな?

Example: Two Stage XSLT (XSLT)

  • 前述の説明どおりのやつ

Example: JSP and Custom Tags (Java)

  • 1段目の変換ではJSPでカスタムタグを書き出す
  • 2段目の変換でカスタムタグをHTMLにレンダリングする
  • 著者いわく、現場で見たことはないらしい
  • XSLTと比較してのメリデメ
    • メリ
      • 「全ページ同じ見た目」の強制力はXSLTと比較して低い
    • デメ
      • デザインに凝ったページで微調整が効く