問題の原因
✤ テンプレート中にプレ テンプレートファイル
ゼンテーションロジッ <table>
クを埋め込んでいるこ <% i = 0 %>
<% @arr.eachx do |x| %>
とこそが、諸悪の根源
<% i += i %>
<% c = i.odd ? %>
<% 'odd':'even' %>
pure HTML テンプ <tr class="<%=c%>">
レートが望ましい <td><%= x %></td>
</tr>
<% end %>
</table>
copyright(c) 2010 kuwata-lab.com all rights reserved.
16
17.
pure HTML テンプレートの利点
✤ HTMLデザインが崩れない(表示確認できる)
デザイナ
for
✤ テンプレート言語を学習しなくてよい
✤ HTML Validator でチェックできる
✤ 好きなエディタ (Dreamweaverなど) が使える
同時編集による衝突を避けやすい
プログラマ
for
✤
✤ 空白除去による圧縮(転送量削減)がしやすい
✤ ケータイ用などに自動変換しやすい
copyright(c) 2010 kuwata-lab.com all rights reserved.
17
18.
Matzも悩んだ問題
✤ じゃあプレゼンテーションロジックは
どこに書けばいいの?
Matz日記 (2004-08-24)
http://www.rubyist.net/ matz/20040824.html#p01
(要約)
ViewそのものにLogicが必要な場合、
HTMLテンプレートでは記述できないし、
どこに所属すべきだろうか?
copyright(c) 2010 kuwata-lab.com all rights reserved.
18
19.
ここまでのまとめ
✤ テンプレート中にプレゼンテーションロ
ジックを埋め込むと、問題が多い
✤ pure HTMLテンプレートが望ましい
✤ プレゼンテーションロジックはどこに?
copyright(c) 2010 kuwata-lab.com all rights reserved.
19
A. テンプレートファイル中に記述 (3)
例: Kid テンプレートファイル (Python)
<table>
<tr py:for="i, item in enumerate(items)"
class="${i % 2 and 'even' or 'odd'}">
<td py:content="item">dummy</td>
</tr>
</table>
•文書構造と属性を使うことで、
HTMLデザインを崩さないよう配慮
•ロジックをテンプレートファイル中に
埋め込んでいるという点では同じ
copyright(c) 2010 kuwata-lab.com all rights reserved.
24
25.
A. テンプレートファイル中に記述 (4)
プレゼンテーション層(=テンプレート)が
利
✤
ビジネス層から分離されている
点 ✤ 使い方がわかりやすく、実装も簡単
pure HTML でない(ことが多い)
欠
✤
✤ 同時編集による衝突が発生しやすい
点 ✤ デザイナがプレゼンテーションロジックを
誤って変更する可能性がある
copyright(c) 2010 kuwata-lab.com all rights reserved.
25
26.
プレゼンテーションロジックをどこに?
A. テンプレートファイル中 (eRuby,JSP, Kid)
プレゼンテーションロジック
ビジネスロジック&データ
+プレゼンテーションデータ
B. メインプログラム中 (Amrita2, XMLC, HTML::Template)
プレゼンテーションロジック
プレゼンテーションデータ
+ビジネスロジック&データ
C. 独立した別ファイル中 (Kwartz, Tapestry, Mayaa)
プレゼンテーションロジック
ビジネスロジック&データ
プレゼンテーションデータ
テンプレート メインプログラム
copyright(c) 2010 kuwata-lab.com all rights reserved.
26
27.
B. メインプログラム中に記述 (1)
例: Amrita2 テンプレートファイル (Ruby)
<table>
<tr id="list" class="odd">
<td id="item">dummy</td>
</tr>
</table>
•書き換えたい場所に「目印」を書くだけ
(Amrita2ならid属性をつけるだけ)
•テンプレートが pure HTML (ロジック
を埋め込まないため)
copyright(c) 2010 kuwata-lab.com all rights reserved.
27
28.
B. メインプログラム中に記述 (2)
例: Amrita2 メインプログラム (Ruby)
## 表示したいビジネスデータ
list = [ 'A', 'B', 'C' ] •ビジネスデータをプレゼ
## プレゼンテーションロジック ンテーションロジックで
list2 = []; odd = false 加工する必要がある
for x in list
cls = (odd = !odd) ? 'odd' : 'even'
item2 = a(:class=>cls) { {:item=>x} }
list2 << item2
end
context = { :list=>list2 }
## テンプレートを読み込んで表示
tmpl = Amrita2::TemplateFile.new('ex1.html')
tmpl.expand(html='', context)
print html
copyright(c) 2010 kuwata-lab.com all rights reserved.
28
29.
B. メインプログラム中に記述 (3)
テンプレートには目印を埋め込むだけ
利
✤
pure HTML テンプレートを実現 (しやすい)
点
✤
✤ 同じファイルを編集しないので衝突しない
✤ デザイナによるロジックの誤変更がない
ビジネス層とプレゼンテーション層が分離で
欠
✤
きてない(*注)
点 ✤ 使い方にクセがある(ロジックをデータで表
現する必要があるため)
(*注) 工夫次第で回避可能(該当箇所を別クラスにする等)
copyright(c) 2010 kuwata-lab.com all rights reserved.
29
30.
プレゼンテーションロジックをどこに?
A. テンプレートファイル中 (eRuby,JSP, Kid)
プレゼンテーションロジック
ビジネスロジック&データ
+プレゼンテーションデータ
B. メインプログラム中 (Amrita2, XMLC, HTML::Template)
プレゼンテーションロジック
プレゼンテーションデータ
+ビジネスロジック&データ
C. 独立した別ファイル中 (Kwartz, Tapestry, Mayaa)
プレゼンテーションロジック
ビジネスロジック&データ
プレゼンテーションデータ
テンプレート メインプログラム
copyright(c) 2010 kuwata-lab.com all rights reserved.
30
31.
C. 独立した別ファイル中に記述 (1)
例: Kwartz プレゼンテーションデータファイル (Ruby)
<table>
<tr id="mark:list" class="odd">
<td id="mark:item">dummy</td>
</tr>
</table>
•書き換えたい場所に「目印」を書くだけ
(Kwartzならid属性をつけるだけ)
copyright(c) 2010 kuwata-lab.com all rights reserved.
31
32.
C. 独立した別ファイル中に記述 (2)
例: Kwartz プレゼンテーションロジックファイル (Ruby)
#item { ## id="mark:item" は
value: x; ## x の値を表示する
}
#list { ## id="mark:list" は
logic: { ## 要素全体をループする
for x in @list
_elem
end
} •あたかもCSSのようにプレゼンテー
} ションロジックを記述する
•プレゼンテーションロジックがメイ
ンプログラム中に現れない!
copyright(c) 2010 kuwata-lab.com all rights reserved.
32
33.
CSS
(Visual Design)
HTML
(Document
Structure)
Kwartz JavaScript
(Presentation (Client-side
Logic) Logic)
copyright(c) 2010 kuwata-lab.com all rights reserved.
33
34.
C. 独立した別ファイル中に記述 (3)
✤ ビジネス層とプレゼンテーション層がきれい
利 に分離
点 ✤ プレゼンテーションデータ(HTML)とプレ
ゼンテーションロジックもきれいに分離
✤ pure HTML テンプレートを実現
✤ 編集するファイルが別なので衝突しない
✤ デザイナによるロジックの誤変更がない
欠 ✤ ファイル数が増える
点 copyright(c) 2010 kuwata-lab.com all rights reserved.
34
35.
大事なことと本当に大事なこと
✤ 大事なこと
✤ テンプレートが pure HTML であること
✤ 本当に大事なこと
✤ プレゼンテーションロジックを分離・独立させること
✤ (pure HTML はその副産物にすぎない)
copyright(c) 2010 kuwata-lab.com all rights reserved.
35
36.
よくある間違い(1)
(誤) ✤ テンプレートがpure HTMLなので、
プレゼンテーション層を分離できてい
ます!
✤ pure HTMLであることと、各層が分
(正)
離できることは、別個のお話
✤ 恐らく、HTMLファイル中にロジックが現れ
ないことを「プレゼンテーション層の分離」
と勘違いしている
copyright(c) 2010 kuwata-lab.com all rights reserved.
36
応用例(4)
より複雑なプレゼンテーションロジック
#list {
attrs: "class" cls; # 属性値を出力
logic: {
odd = false プレゼンテーションロジックが
for x in @list HTMLから分離されている
odd = !odd
cls = odd ? 'odd' : 'even'
_elem
end プレゼンテーションロジックを変更
}
してもHTMLは変更する必要がない
}
copyright(c) 2010 kuwata-lab.com all rights reserved.
49
50.
ここまでのまとめ
✤ Kwartzテンプレートエンジン
✤ プレゼンテーションロジックをプレゼンテーション
データ(=HTML)から分離
✤ pure HTML テンプレートを実現
✤ プレゼンテーションロジックを変更してもHTMLを変
更する必要がない
copyright(c) 2010 kuwata-lab.com all rights reserved.
50