がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

テンプレートエンジン「conv」クラスへの言及 番外編

なんとなく以前から予想はしていたのですが、やはりこーゆー風に感じる方がいたので、ちと状況説明をいくつか。
端的に状況を書くと

  • forループがNGって言ってるけど、結局$$$による複置換ってforループと一緒だよね?

っていう内容です。
端的に回答を書くと「いらないものを徹底的に排除しているか否か」という差異があると思っています。


以下、説明のために、ちぃとあちこちからサンプルを拾ってみます。


{foreach item=row from=$list}
{$row.id} {$row.name} {$row.sex}
{/foreach}
うちの複置換に似てるとは思うのですが。「item=row from=$list」が冗長には感じませんか?
っつか、間違えて「item=list from=$row」とかやったらどうなるんだろう?*1
まぁ実際そのサイトさん
http://smarty.karakuriya.biz/cat33/000362.html
にも

row は、PHPの変数名 list と同じ名前でもいいようです。

{foreach item=list from=$list}
{$list.id} {$list.name} {$list.sex}
{/foreach}

こうして統一しておくと、わかりやすいと思います。

って書いてあるのですが。…統一するなら一回表記でいいじゃんって思うのは私だけでしょうか?
例えば、せめても


{foreach name}
{/foreach}
で片付くならよいのですが。
この辺が「冗長だなぁ」と思うあたりです。


まぁ、元々「機能が多いと使いにくい」と感じる人間なので、
http://634.ayumu-baby.com/smarty/foreach.html
にあるような

{foreach}
{foreachelse}
{/foreach}

を利用すると、解析時に配列の要素に応じた繰り返し処理を行うことが出来る。

書式

{foreach from=[配列] key=[キー] item=[アイテム] name=[このループブロックの名前]}
// 処理
{foreachelse}
// 処理
{/foreach}

foreachの繰り返し処理では、fromに割り当てられた配列の要素数分だけ自動的に繰り返し処理が実行される。繰り返しのたびに、keyに指定したテンプレート変数に配列へのアクセスキーが、itemに指定したテンプレート変数に配列の中身がそれぞれ割り当てられる。nameには、このループの名前を指定することが出来る。foreachはネストが可能なので、対象ブロックを区別することができる。
{foreachelse}を記述している場合、配列の要素が空の場合にこちらのブロックの処理が実行される。

ってな機能は「無駄に豊富すぎ」としか思えないです。
ついでにsectionとかってのもありますし。…面倒すぎてあんまり差異を調べてません(苦笑


なので、このあたりの「いらん機能」全部削っていくと、多分convと似たような感じになるのではないかと。つまるところ「"連想配列の配列"を渡してループさせる」だけなので。
っつか、うちのconvの場合は厳密には「どうしても必要な機能を最低限実装した結果」ではあるのですが。
なので、for文相当(もしくは while文相当)の機能は、Webが「一定回数のループ出力をしたい」っていう要求がある以上、当然実装するです。
ただ、その繰り返しの中で「テンプレートで制御する必要がない情報を可能な限り"書けない"ように」しているです。


ちなみに、これは「出したり出さなかったりの制御」でも一緒です。if相当の機能ですね。
例えば。


{if $smarty.get.data == "OK"}
OKです
{elseif $smarty.get.data == "NG"}
NGです
{else}
よくわかりません。
{/if}
の場合。例えば、どこかのタイミングでプログラムが「"OK"と"NG"の代わりにtrueとfalseを使い出した」時点でNGになります。テンプレート修正って話になるのですが、それは結局のところ「テンプレートとロジックが分離できていない」だけです。
必要なのは「OKな感じだった」と「NGな感じだった」と「それ以外」という"意味"であって、OKやNGという文字列ではないはずです。
この辺はいわゆる「依存性を低くする」意味合いが強いですね。


こんな感じでconv…に限らず、全体の実装をやっているです。
何かご意見ご感想その他あったら、是非コメントをお願いいたします。

*1:表示されないだけなんでしょうけど。多分。