Einrückung in einer mehrsprachigen Datei [geschlossen]

8

Gibt es in Dateien, die mehrere Sprachen enthalten (z. B. Vorlagendateien), bewährte Methoden zum Einrücken?

Ich benutze meistens Folgendes:

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

Einzug für jeden neuen Block, unabhängig von der Sprache. Dies hat jedoch einige Nachteile. In komplexeren Dateien kann die Einrückung einer der beiden Sprachen unterbrochen werden:

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

Ich habe auch gesehen, dass dies verwendet:

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

Dh. nur eine Sprache einrücken. Dies hat den Vorteil, immer konsistent zu sein, aber in komplexeren Dateien können einige Implementierungsdetails fast vollständig ausgeblendet werden, z. B. wenn ein Block bedingt ist.

Das Ziel hier ist offensichtlich die Maximierung der Lesbarkeit.

Celos
quelle
1
+1: interessante Frage. Ich werde sehen, ob ich meine (erfahrungsbasierte) Meinung später heute aufschreiben kann.
Sjoerd Job Postmus
@SjoerdJobPostmus Nein, das ist es nicht. Der Codierungsstandard sollte angeben, welche Identifikation verwendet werden soll.
BЈовић
Ja, so ist es. Es muss beantwortet werden, bevor Codierungsstandards definiert werden.
Florian F
1
@ BЈовић, was ist, wenn es keinen Codierungsstandard gibt? Was ist, wenn Sie derjenige sind, der den Codierungsstandard erstellt? Jemand muss darüber nachdenken und eine Lösung finden. In jedem Fall ist die Frage, ob es "interessant" ist, völlig subjektiv.
1
Die Frage bezieht sich auf Best Practices. Was machen erfahrene Leute in dieser Angelegenheit? Was sind die Vor- und Nachteile der verschiedenen Optionen? Es ist in der Tat subjektiv, es gibt kein Richtig und Falsch, die Leute folgen ihrem Geschmack, aber gute Ideen verbreiten sich wahrscheinlich.
Florian F

Antworten:

11

Meiner Meinung nach besteht das Hauptprinzip für eine gute Codierung darin , die Vermischung von Code zu minimieren.

Zweisprachige Dateien sind von Natur aus ein Chaos. Ihre Priorität sollte darin bestehen, das Ausmaß der Verflechtung der beiden Sprachen zu minimieren.

Beispielsweise sollte in einer Vorlagendatei die von der Vorlagensprache implementierte Logik auf ein Minimum beschränkt werden. Verschieben Sie die Logik nach Möglichkeit an eine andere Stelle und geben Sie einfach einen Wert in der Vorlagendatei an.

Sogar so etwas wie dein Beispiel:

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

Könnte besser umgesetzt werden als

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

mit dem zu verwendenden Attribut an anderer Stelle berechnet. In diesem Fall würde ich die Lesbarkeit der Hauptsprache der Datei als Treiber für die Einrückungsstrategie verwenden. Ich würde die Template-Sprache nicht einrücken, und jeder Template-Code, der komplex genug ist, um ein Einrücken zu benötigen, ist wahrscheinlich schlecht gestaltet.


quelle
5

Dies ist einer der Hauptgründe für die Vermeidung von Systemen, die zwei Sprachen so miteinander mischen. Es kann sehr schwierig werden zu überprüfen, wie sich der Kontrollfluss der äußeren Sprache auf die Blockstruktur der inneren Sprache auswirkt, und wenn Sie dies nicht sehen können, treten Fehler auf.

Ich ziehe es vor, sie getrennt zu halten und beim Generieren von Ausgaben in einer anderen strukturierten Sprache immer ein Vorlagensystem zu verwenden, das die Strukturierung der Sprache berücksichtigt und keine Kontrollflussblöcke für allgemeine Aufgaben benötigt.

Jules
quelle
3

(Wie versprochen, meine erfahrungsbasierte Meinung.)

Wenn Sie dies verhindern können: Mischen Sie nach Möglichkeit keine Sprachen.

Nach Ihrem Beispiel scheinen Sie sich hauptsächlich zu fragen, wie dies in einer mit HTML gemischten Vorlagensprache geschehen soll, die ich behandeln werde. (Ein anderer Fall wäre das Erstellen von SQL mit einer anderen Programmiersprache, für die völlig andere Regeln erforderlich wären.)

Als Beispiel werde ich behandeln, dass Django (aber PHP, Twig usw.) meistens gleich funktioniert. Django hat logische Blöcke in den Vorlagen (öffnen {% tag %}, schließen {% endtag %}). HTML hat logische Blöcke (öffnen <tag>, schließen </tag>). Hier folge ich meistens dieser Regel: Inkrementieren nach einem offenen Tag, Dekrementieren nach einem schließenden Tag. Eine andere Regel, die ich behalte: Stellen Sie sicher, dass der Inhalt eines Django-Blocks gut formatiertes HTML ist.

Nach Ihrem Beispiel ist dies meiner Meinung nach sehr falsch:

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

Warum? Weil der Inhalt von IFkein gut formatierter HTML-Code ist. Wie soll es aussehen als?

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

(Da Ihre Vorlagensprache keine nette analysierbare Syntax hat, benötigen wir die neuen Zeilen. In Django würde ich schreiben)

<div>
    <div {% if foo %}someattribute{% else %}otherattribute{% endif %}>
        <p>Content</p>
    </div>
</div>

Stellen Sie sich als zusätzlichen Vorteil vor, dass das <div>7 Attribute hat, von denen eines aufgrund einer bestimmten Bedingung festgelegt wird. Oder schlimmer: Was ist, wenn es 3 Attribute hat, von denen jedes von einer Bedingung abhängt? Das würde 8 verschiedene Tags ergeben.

Wenn Sie die "Regel" beachten, um den Inhalt aller Blöcke in diesem Bereich gut zu formatieren, müssen Sie sich keine Sorgen machen, dass der Einzug einer der beiden Sprachen unterbrochen wird.

Ein weiterer Punkt, den ich behandeln möchte (wenn auch etwas außerhalb des Themas): Wenn sich die öffnenden und schließenden Tags in unterschiedlichen Zeilen befinden, sollten sie das einzige Tag in dieser Zeile sein.

Falsch:

<ul>
    <li>This is something <a href="http://programmers.stackexchange.com">Usefull</a>
    </i>
</ul>

Stattdessen lieber

<ul>
    <li>This is something <a href="http://programmers.stackexchange.com">Usefull</a></li>
</ul>

oder

<ul>
    <li>
        This is something <a href="http://programmers.stackexchange.com">Usefull</a>
    </li>
</ul>

(Warnung: Erweiterte Verwendung): Manchmal haben Sie mehrere Wrapping-Tags. Sie können (müssen) dies als ein Tag betrachten:

<ul>
    <li><div id="something"><span class="like this">
        Something like this
    </span></div></li>
</ul>

Mischen Sie dabei jedoch vorzugsweise keine Sprachen (Host / Gast). Und am besten nicht mit forLoops. Und mach das nicht mit.

TL; DR für Ihre spezielle Frage.

  • Sie haben eine 'Host'-Sprache (z. B. Django-Vorlage) und eine' Gast'-Sprache (z. B. HTML). Stellen Sie sicher, dass die Host-Sprachblöcke immer korrekt formatierte Gastsprachenblöcke enthalten.
  • Das Öffnen jedes Blocks sollte die Einrückung erhöhen, das Schließen jedes Blocks sollte mit der Öffnung übereinstimmen.

Und die allgemeine Anmerkung, die ich (wie immer) hinzufügen sollte: Verwenden Sie Ihr eigenes Urteilsvermögen. Wissen, wann man abweicht.

Sjoerd Job Postmus
quelle