(約束通り、私の経験に基づく意見。)
まず第一に、それを防ぐことができる場合は、可能な限り、言語を混在させないでください。
あなたの例にあるように、HTMLと混合されたテンプレート言語でそれをどのように行うべきかについてほとんど疑問に思っているようですが、これについては後で説明します。(別のケースは、完全に異なるルールを必要とする別のプログラミング言語を使用してSQLを構築することです)。
例として、Django(ただし、PHP、Twigなど)がほとんど同じように動作することを取り上げます。Djangoはテンプレートに論理ブロックを持っています(open {% tag %}
、close {% endtag %}
)。HTMLには論理ブロックがあります(開く<tag>
、閉じる</tag>
)。ここでは主にこのルールに従います。開始タグの後にインクリメントし、終了タグの後にデクリメントします。私が守っているもう1つのルール:Djangoブロックのコンテンツが適切にフォーマットされたHTMLであることを確認してください。
あなたの例に従って、私の意見ではこれは非常に間違っています:
<div>
IF FOO
<div someattribute>
ELSE
<div otherattribute>
END FOO
<p>content</p>
</div>
</div>
どうして?のコンテンツがIF
適切にフォーマットされたHTMLではないためです。それはどのように見えるべきですか?
<div>
<div
IF FOO
someattribute
ELSE
otherattribute
END FOO
>
<p>Content</p>
</div>
</div>
(テンプレート言語には構文解析可能な構文がないため、改行が必要です。Djangoでは、このように記述します)
<div>
<div {% if foo %}someattribute{% else %}otherattribute{% endif %}>
<p>Content</p>
</div>
</div>
追加の利点として、に<div>
7つの属性があり、そのうちの1つが特定の条件に基づいて決定されることを想像してください。またはさらに悪いことに、3つの属性があり、それぞれが条件に依存している場合はどうでしょうか。それは8つの異なるタグを与えるでしょう。
すべてのブロックのコンテンツをそのスコープ内で適切にフォーマットするための「ルール」を念頭に置いて、どちらの言語のインデントを壊すことを心配する必要はありません。
私がカバーしたいもう1つのポイント(少し外れたトピックですが):開始タグと終了タグが異なる行にある場合、それらはその行の唯一のタグでなければなりません。
違う:
<ul>
<li>This is something <a href="http://programmers.stackexchange.com">Usefull</a>
</i>
</ul>
代わりに、好む
<ul>
<li>This is something <a href="http://programmers.stackexchange.com">Usefull</a></li>
</ul>
または
<ul>
<li>
This is something <a href="http://programmers.stackexchange.com">Usefull</a>
</li>
</ul>
(警告:高度な使用法):複数の折り返しタグがある場合、これを1つのタグと見なすことができます(必須ではありません)。
<ul>
<li><div id="something"><span class="like this">
Something like this
</span></div></li>
</ul>
ただし、これを行う場合は、言語(ホスト/ゲスト)を混在させないでください。そして、できればfor
ループでこれを行わないでください。そして、これをで行わないでください。
特定の質問のTL; DR。
- 「ホスト」(Djangoテンプレートなど)と「ゲスト」言語(HTMLなど)があります。ホスト言語ブロックに常に正しい形式のゲスト言語ブロックが含まれていることを確認してください。
- 各ブロックを開くとインデントが増加し、各ブロックを閉じると開口部と並ぶはずです。
そして、私が(いつものように)追加すべき一般的な注意:あなた自身の判断を使用してください。いつ逸脱すべきかを知る。