Frage

Oft Programmierer schreiben Code, die anderen Code erzeugt.

(Der technische Begriff ist metaprogramming , aber es häufiger als nur Cross-Compiler ist;. denken über jede PHP-Web-Seite, die HTML oder jede XSLT-Datei erzeugt)

Ein Bereich, finde ich herausfordernd ist mit Techniken kommen, um sicherzustellen, dass beide die eigenhändigen Quelldatei und die Computer-generierte Objektdatei eindeutig helfen Debuggen eingekerbt. Die beiden Ziele scheinen oft zu konkurrieren.

Das finde ich besonders anspruchsvoll in der PHP / HTML-Kombination. Ich denke, das liegt daran, dass:

  • gibt es manchmal mehr von dem HTML-Code in der Quelldatei als die Erzeugung von PHP
  • HTML-Dateien sind in der Regel länger als beispielsweise SQL-Anweisungen sein, und müssen besser Einrücken
  • HTML bietet Platz empfindlichen Funktionen (zum Beispiel zwischen Tags)
  • ist das Ergebnis mehr öffentlich sichtbar HTML als SQL-Anweisungen, so gibt es mehr Druck, um einen angemessenen Job zu tun.

Welche Techniken verwenden Sie diese Adresse?


Edit: Ich akzeptiere, dass es mindestens drei Argumente nicht recht HTML-Code zu generieren stört:

  • Komplexität Code zu erzeugen, erhöht wird.
  • macht keinen Unterschied von Browser zu machen; Entwickler können Firebug oder ähnliches verwenden es schön zu sehen.
  • Minor Leistungseinbußen -. Erhöht Downloadzeit für Leerzeichen

Ich habe sicherlich erzeugt manchmal Code ohne Gedanken an das Einrücken (insbesondere SQL).

Es gibt jedoch ein paar Argumente in die andere Richtung drängen:

  • Ich finde, in der Praxis, dass I tun häufig generierten Code gelesen -. Mit zusätzlichen Schritten aus, um es unbequem ist,
  • HTML hat einige platz Empfindlichkeit Probleme, die gelegentlich beißen.

Betrachten wir zum Beispiel den Code:

<div class="foo">
    <?php
        $fooHeader();
        $fooBody();
        $fooFooter();
    ?>
</div>

Es ist klarer als der folgende Code:

<div class="foo"><?php
        $fooHeader();
        $fooBody();
        $fooFooter();
?></div>

Es ist jedoch auch unterschiedlichen Rendering wegen der Leerzeichen im HTML enthalten.

War es hilfreich?

Lösung

Im allgemeineren Fall habe ich XSLT-Code geschrieben, die ++ Code-Datenbank-Schnittstelle C erzeugt. Obwohl auf den ersten versuchte ich aus dem XSLT korrekt gegliederten Code-Ausgabe, wurde dies schnell unhaltbar. Meine Lösung war vollständig in der XSLT-Ausgabe Formatierung zu ignorieren, und führen Sie dann die resultierende sehr lange Codezeile durch GNU indent . Dies führte zu einer einigermaßen formatiert C ++ Quelldatei für das Debuggen.

Ich kann mir vorstellen, das Problem viel mehr stachelig bekommt, wenn sie mit kombinierten Quelle wie HTML und PHP zu tun.

Andere Tipps

Erstellen eines AST dann Inorder durchqueren und den Quellcode zu emittieren, die richtig formatiert ist.

Eine Technik, die ich verwende, wenn die Erzeugungs Code über den generierten Code dominiert ist um einen Gedankenstrich Parameter zu übergeben.

z. B. in Python, generiert mehr Python.

def generateWhileLoop(condition, block, indentPrefix = ""):
    print indentPrefix + "while " + condition + ":"
    generateBlock(block, indentPrefix + "    ")

Alternativ, je nach Laune:

def generateWhileLoop(condition, block, indentLevel = 0):
    print " " * (indentLevel * spacesPerIndent) + "while " + condition + ":"
    generateBlock(block, indentLevel + 1)

die Annahme, beachten Sie, dass condition ein kurzes Stück Text, der auf der gleichen Linie passt, während block auf einer separaten eingekerbten Linie ist. Wenn dieser Code nicht sicher sein kann, ob die Unterelemente müssen eingerückt werden, ist diese Methode beginnt zu fallen.

Auch ist diese Technik nicht annähernd so nützlich für relativ kleine Mengen von PHP in HTML Beregnung.

[Bearbeiten klarstellen: Ich schrieb die Frage und auch diese Antwort. Ich wollte die Antworten mit einer Technik impfen, die ich verwenden kann und ist manchmal nützlich, aber diese Technik nicht mich für typische PHP-Programmierung, so dass ich bin auf der Suche nach anderen Ideen wie es.]

Ich habe festgestellt, dass bei der Erzeugung Einrücken ignoriert am besten ist. Ich habe eine allgemeine ‚Code-Formatierung‘ Engine geschrieben, die den gesamten Code ausgegeben verarbeitet Post. Auf diese Weise kann ich vom Generator separat Einrücken Regeln und Code Syntaxregeln definieren. Es gibt klare Vorteile für diese Trennung.

Ich stimme mit oddthinking Antwort.

Manchmal ist es am besten, um das Problem zu lösen, indem sie umgekehrt wird. Wenn Sie sich selbst zu erzeugen eine ganze Menge Text finden, prüfen, ob es einfacher, den Text als Vorlage mit kleinen Stückchen von intelligenter Generation, Code zu schreiben. Oder wenn Sie das Problem nicht brechen sie in eine Reihe von kleinen Vorlagen, die Sie zusammenstellen und dann einrücken jede Vorlage als Ganzes.

Erstellung von Webseiten in PHP, finde ich das Mischen von HTML und funktionsspezifische PHP problematisch, schränkt sie die Übersicht und macht das Debuggen schwieriger. Eine Lösung zu vermeiden, in diesem Fall Mischen Vorlage getrieben Inhalt verwenden, Smarty zum Beispiel zu sehen. Außer besser intendation, Templating von Inhalten ist nützlich für andere Dinge, wie zum Beispiel schnellen Patchen. Wenn ein Kunde eine Änderung im Layout erfordert, kann dieses spezielle Layout Problem schnell gefunden und behoben werden, ohne mit dem funktionellen PHP-Code stört die Daten (und umgekehrt) zu erzeugen.

Speziell auf HTML-Generierung - warum ist es wichtig?

Sie verbringen eine verdammt viel Zeit um Einrücken Parameter übergeben, und zu versuchen, herauszufinden, wie tief verschachtelt Sie etc sind .. Abgesehen von einer allgemeinen Zeitverschwendung zu sein (da es keinen Unterschied in der endgültigen gemacht ist Ausgabe), wie halten Sie all diese Dinge, wie Sie andere HTML-Markup und Wrap-Seiten in einem div etc?

hinzufügen

Wie auch immer, installieren Firebug (und IE developer Toolbar für IE Prüfung danach) und beide zeigen Sie die HTML im verschachtelten Format und Sie können auf der Seite Elemente klicken Sie einfach direkt die Markierung zu sehen - WEGE effizienter als bei roher Quelle HTML-Ausgabe an.

ich die PHP / HTML Situation Ich versuche jedes Codefragment konsequent in dem Quellcode eingerückt zu halten. Dies hält der Code lesbar, wo es wirklich darauf ankommt und in der Regel hat den Nebeneffekt von HTML-Ausgabe erzeugen, die lesbar ist. Wie andere gesagt haben, nimmt firebug erledigt den Rest.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top