TeedaExtensionにおけるidの自由な変更について(http://d.hatena.ne.jp/hajime106/20070113#p3)


Teedaは基本的な作りはJSFなので、JSFの方式に従っているのが現状です。
TeedaExtensionでは、JSFを極力見せないようにしていますが、その裏側では当然JSF標準のものを使っているところもあります。
JSFにおいてidが非常に重要な要素であるのは間違いありませんし、自由に変更は最もしづらい要素だと思います。
(またidに使える文字も、英数字と-(ハイフン)、_(アンスコ)とかなり限定されています。)


で、Foreachの話です。確かに今のForeachで生成されたHTMLではidが重複するためにvalidにならないです。
これはテンプレートに書かれたまま、素直にidはidとして出力しているためです。
Foreachはポリシーとして、子どものコンポーネントに何があるかまったく知りません。
内部的に持っているid(clientId)とPageクラスをみて、Itemsの中に何個入っていそうかを推測して、画面に描画しています。
このような作りの大きなメリットは子どものコンポーネントが親に制約を受けることがない事です。
親も子どもに何がいるか知らないし、子どももForeachの中なのかどうかを意識する必要が無いのです。
HTMLとしてvalidなことか、コンポーネントの自由度を取るか・JSFに従うは人それぞれだとは思います。
(出来れば両方取りたいし、その方法も模索しておきたいとは思いますが。)
現状は子どものコンポーネントの自由度のメリットとJSFに従うという選択肢を取っています。


なので、ご質問への回答は、
* Teeda Extensionを使った開発では、forEach部分においてHTML要素のidの重複は少なくとも今は発生する。
* JSFである以上、idの自由な変更は簡単には回避できない。


しかしやりようがあるのは昨日思いつきはしました。
(細かい実装の話を言えば、ForEachのRendererで子どものComponentIdLookupStrategyを一時的に置き換えることで
実現できます。ただしForEachのRendererから、各子どものコンポーネントのRendererへのバイパスが必要。)
idがテンプレートに記述されたときと、画面に描画されたときで変わってしまうことで
何かしらのデメリットはありそうですが。。。


それと id:itoasuka さんが id:itoasuka:20070102 でHTMLテンプレートについて HTML要素を使うのではなく、
HTMLコメントを利用するのが良いのではないかといった提案をされています。これを読んでおもしろいなと思いました。 
HTMLのテンプレートの利点はそのままですし、デザイナの作成したHTMLにdivやspanタグを挿入したら表示が崩れたと
いったこともないでしょうし、idの重複も解決できそうな?

この方法についてshotさんがどのようなご意見をお持ちなのかとても興味があります。
よろしければご意見を聞かせてください。どうぞよろしくお願いします。

はい。id:itoasukaさんの方法は自分も興味深く見させていただきました。
たしかにHTMLコメントを使った方法では、表示の崩れなどの問題も少ないでしょう。
しかし、それは開発者から従来のHTML/XHTMLエディタでの補完による生産性を若干犠牲にしてしまいます。


イメージしてみましょう。

<html>
<body>
<!-- forEach(0..10) { -->
<span id="hoge">dummy</span>
<!-- } -->
</body>
</html>


自分のお粗末なイメージですいませんがおそらく大体こんな感じになるはずです。
シンプルな例を書いている上では問題にならないと思いますが、補完が効かないのは結構なデメリットです。
ちょっとした構文のミスなどはエディタがチェックしてくれればすぐにわかる話ですが、無いとあれ?ってなるのですよねえ。


またタグなどの閉じ忘れなどがおきやすいという問題もあります。forEachの開始の部分と、閉じる部分はXHTML/HTML上は
何の関連性もありません。これは自分のような超おっちょこちょいな人間には少し問題になるかもしれません。


更にもう少し踏み込んでみたいと思います。
コメントを使う手法の問題点を2点あげましたが、その問題の本質は何でしょうか。
それは良質なIDEのエディタがあるかないかです。WTPのHTMLエディタやAmaterasプロジェクトのHTMLエディタのような
素晴らしいエディタが準備できれば、上記の問題はそんなに問題ではなくなります。
やっぱりフレームワークでもテンプレートエンジンでも同じですが、それ単体だけでは生産性はそんなに高くならないというのが、
自分の今の持論です。良いIDEとそのプラグインによる手厚いサポートがやっぱり必要なんですよね。
書く手間を減らす・間違ってからの修正までの時間を局所化する・間違いそうなところを先にチェックしてあげる、
こういうところの積み重ねが生産性の改善に響くのではないでしょうか。