16. 問題の原因
✤ テンプレート中にプレ テンプレートファイル
ゼンテーションロジッ <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
24. 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