Taku Amano

IncludeBlockの仕様

0

こんにちは、MTタグ「IncludeBlock」の仕様についての話題です。

本来であればMTOSのメーリングリストに投げるような話題かもしれないのですが、ちょっと議論の余地もありそうな話題で、また私が英語での議論に対応できそうにないため、ここで話をさせてください。
※開発者向けの話題です。


IncludeBlockは以下のコミットで、IncludeBlockの内容が構築される最初ではなく、contents が評価されるときになりました。
http://code.sixapart.com/trac/movabletype/changeset/3220

この変更がうれしい結果となるケースとしては、
・IncludeBlockで指定したテンプレートの中でcontentsが使われなかった場合
となるのだと思うのですが、他にもあるのでしょうか。

むしろうれしくないケースとして、
・IncludeBlockの内側でテンプレートのエラーが発生した場合にエラー表示が分かりづらくなる
という点があるのではないかと考えています。
※エラーについては後述します。


またメリット/デメリットという意味とは別に動作としても異なり、
この変更によって、以下のマニュアルにあるような使い方ができなくなる場合があります。
※module="banner"の中でcontentsを評価していない場合
http://www.movabletype.jp/documentation/appendices/tags/includeblock.html

評価する時の環境によって内容が変わる(ダイナミックスコープ的な)動作としては、
SetVarTemplateがあり、SetVarTemplateではユーザーはそれを期待して使うと思うのですが、
IncludeBlockを使おうというケースではユーザーは、
変数を変更したらcontentsの内容も変わる、
というSetVarTemplateのような動作を期待して使うことは少なく、
むしろ上記の movabletype.jp のマニュアルの例のような使い方ができることを期待して使うのではないかと考えています。

いかがでしょうか。


またIncludeBlockには上記のコミット以前より、
「IncludeBlock内で発生したエラーは無視されてしまう」
という若干不便な点がありました。

この点については、
コミット前であれば「slurp」からの返りが「undef」でないか、
コミット後であれば「_hdlr_get_var」の中での実行結果が「undef」でないか、
それぞれをチェックしなければならないのではないかと考えています。
ただ後者については影響する範囲がどこまでであるかという問題があると思いますが。


以上のような背景があり、私としては以下のような仕様が適切ではないかと考えています。
・IncludeBlockの内容が構築されるときにcontentsの内容が作られる (以前の動作)
・IncludeBlock内でエラーが発生した場合は方向される (「slurp」からの返りをチェックする)


以上です。
よろしければご意見を頂けるとありがたいです。
よろしくお願いします。

返信(4)

| 返信する
  • 失礼いたしました、一番最後の、
    「エラーが発生した場合は方向される」
    は、
    「エラーが発生した場合は報告される」
    です。

  • こんにちは。非常に鋭いご指摘ありがとうございます。この部分、現在の仕様への変更については、主にパフォーマンスのボトルネックを防ぐのが意図となっています。ただ、この実装については、確かに挙動として最も望ましいというわけではないのも事実です。
    IncludeBlock の利用例として、評価用のsetvar タグを利用するのは、今回の変更で理解が難しくなった部分もあり、ひとまずタグリファレンスのほうは、もうすこし分かりやすい事例に変更させていただきました。
    実装については、ダイナミックパブリッシングもあわせて、望ましい挙動を将来のバージョンにむけて検討したいと思います。

  • Jun Kanekoさん、返信ありがとうございます。

    主にパフォーマンスのボトルネックを防ぐのが意図とのこと、理解できました。確かに以前の実装だと、IncludeBlockの中身が大きかったり、IncludeBlockが多段で入れ子になっている場合にはパフォーマンスにも影響を与えそうですね。

    また仕様について検討していただけるとの件もありがたいです。個人的には、評価されるコンテストはそれはそれとして、エラーが発生した場合にそれが報告されるとありがたいと考えています。(パース時のエラーは報告されると思うのですが、実行時のエラーが報告されないので。)

    それではまた、このような仕様に関することも時々投稿させて頂きたいと思います。
    よろしくお願いいたします。

  • いや、MT5は、良くできています。

返信する