多言語ファイルのインデント[終了]


8

複数の言語を含むファイル(テンプレートファイルなど)で、インデントに関するベストプラクティスはありますか?

私は主にこれを使用します:

<div>
    IF FOO
        <div>
            <p>contents>
        </div>
    END FOO
</div>

言語に関係なく、新しいブロックごとにインデントします。ただし、これにはいくつかの欠点があります。より複雑なファイルでは、どちらかの言語のインデントを壊す可能性があります:

<div>
    IF FOO
        <div someattribute>
    ELSE
        <div otherattribute>
    END FOO
        <p>content</p>
    </div>
</div>

私はこれが使用されるのを見たこともあります:

<div>
    IF FOO
    <div>
       <p>contents>
    </div>
    END FOO
</div>

つまり。1つの言語のみインデントします。これには常に一貫性があるという利点がありますが、より複雑なファイルでは、ブロックが条件付きであることなど、一部の実装の詳細をほぼ完全に隠すことができます。

ここでの目標は、明らかに読みやすさを最大化することです。


1
+1:興味深い質問。今日は(経験ベースの)意見を書けるかどうか見ていきます。
Sjoerd Job Postmus

@SjoerdJobPostmusいいえ、そうではありません。コーディング標準は、使用するIDを通知する必要があります。
BЈовић

はい、そうです。それについてのコーディング標準を定義する前に回答する必要があります。
Florian F

1
@BЈовић、コーディング標準がない場合はどうなりますか?あなたがコーディング標準を作成している場合はどうなりますか? 誰かがこれについて考え、解決策を決定する必要があります。いずれにせよ、それが「興味深い」かどうかの問題は完全に主観的です。

1
問題は、ベストプラクティスについてです。この問題で経験豊富な人々は何をしますか?さまざまなオプションの長所と短所は何ですか?それは確かに主観的であり、善悪はありません、人々は彼らの好みに従いますが、良いアイデアが広がる可能性があります。
Florian F

回答:


11

私の意見では、適切なコーディングの主な原則は、コードの混在を最小限に抑えることです。

2言語のファイルは本質的に扱いにくいものです。あなたの優先事項は、2つの言語が絡み合う範囲を最小限に抑えることです。

たとえば、テンプレートファイルでは、テンプレート言語によって実装されるロジックを最小限に抑える必要があります。可能な限り、ロジックを別の場所に移動し、テンプレートファイルに値を提示してください。

あなたの例のようなものでも:

<div>
    IF FOO
        <div someattribute>
    ELSE
        <div otherattribute>
    END FOO
        <p>content</p>
    </div> 
</div>

よりよく実装することができます

<div>
    <div [FOO_ATTRIBUTE]>
        <p>content</p>
    </div> 
</div>

使用する属性を別の場所で計算します。この場合は、ファイルの主要言語の読みやすさをインデント戦略の推進力にします。テンプレート言語をインデントするつもりはありません。インデントを必要とするほど複雑なテンプレートコードは、おそらく不適切に設計されています。


5

これは、このように2つの言語が混在するシステムを回避する主な理由の1つです。外側の言語の制御フローが内側の言語のブロック構造にどのように影響するかを確認することは本当に困難になる可能性があり、それを確認できない場合はバグが発生します。

私はそれらを分離しておくことを好み、別の構造化言語で出力を生成するときは常に言語の構造を尊重し、一般的なタスクの制御フローブロックを必要としないテンプレートシステムを使用します。


3

(約束通り、私の経験に基づく意見。)

まず第一に、それを防ぐことができる場合は、可能な限り、言語を混在させないでください。

あなたの例にあるように、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など)があります。ホスト言語ブロックに常に正しい形式のゲスト言語ブロックが含まれていることを確認してください。
  • 各ブロックを開くとインデントが増加し、各ブロックを閉じると開口部と並ぶはずです。

そして、私が(いつものように)追加すべき一般的な注意:あなた自身の判断を使用してください。いつ逸脱すべきかを知る。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.