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.
Antworten:
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:
Könnte besser umgesetzt werden als
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
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.
quelle
(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:
Warum? Weil der Inhalt von
IF
kein gut formatierter HTML-Code ist. Wie soll es aussehen als?(Da Ihre Vorlagensprache keine nette analysierbare Syntax hat, benötigen wir die neuen Zeilen. In Django würde ich schreiben)
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:
Stattdessen lieber
oder
(Warnung: Erweiterte Verwendung): Manchmal haben Sie mehrere Wrapping-Tags. Sie können (müssen) dies als ein Tag betrachten:
Mischen Sie dabei jedoch vorzugsweise keine Sprachen (Host / Gast). Und am besten nicht mit
for
Loops. Und mach das nicht mit.TL; DR für Ihre spezielle Frage.
Und die allgemeine Anmerkung, die ich (wie immer) hinzufügen sollte: Verwenden Sie Ihr eigenes Urteilsvermögen. Wissen, wann man abweicht.
quelle