5

多くの場合、プログラマーは他のコードを生成するコードを記述します。

(専門用語はメタプログラミングですが、単なるクロスコンパイラよりも一般的です。HTMLを生成するすべてのPHP WebページまたはすべてのXSLTファイルについて考えてください。)

私が難しいと思う領域の1つは、手書きのソースファイルとコンピューターで生成されたオブジェクトファイルの両方がデバッグを支援するために明確にインデントされていることを確認する手法を考え出すことです。2つの目標はしばしば競合しているように見えます。

これは、PHP/HTMLの組み合わせでは特に難しいと思います。私はそれが理由だと思います:

  • ソースファイルには、生成するPHPよりも多くのHTMLコードが含まれている場合があります
  • HTMLファイルは、たとえばSQLステートメントよりも長くなる傾向があり、より適切なインデントが必要です。
  • HTMLにはスペースに依存する機能があります(タグ間など)
  • 結果はSQLステートメントよりも公に見えるHTMLであるため、合理的な仕事をするためのプレッシャーが大きくなります。

これに対処するためにどのようなテクニックを使用していますか?


編集:私は、きれいなHTMLコードを生成することを気にしないために少なくとも3つの引数があることを受け入れます:

  • コード生成の複雑さが増します。
  • ブラウザによるレンダリングに違いはありません。開発者はFirebugなどを使用して見事に表示できます。
  • パフォーマンスへの軽微な影響-空白文字のダウンロード時間が長くなりました。

私は確かに、インデント(特にSQL)を考慮せずにコードを生成することがあります。

ただし、反対の方向に進むいくつかの議論があります。

  • 実際には、生成されたコードを頻繁に読み取ることがあります。それにアクセスするための追加の手順があると不便です。
  • HTMLには、スペースに敏感な問題がいくつかあり、ときどき噛み付きます。

たとえば、次のコードについて考えてみます。

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

次のコードよりも明確です。

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

ただし、HTMLに空白が含まれているため、レンダリングも異なります。

4

8 に答える 8

4

より一般的なケースとして、C++ データベース インターフェイス コードを生成する XSLT コードを作成しました。最初は XSLT から正しくインデントされたコードを出力しようとしましたが、これはすぐに受け入れられなくなりました。私の解決策は、XSLT 出力の書式設定を完全に無視し、結果の非常に長いコード行をGNU indentで実行することでした。これにより、デバッグに適した適切にフォーマットされた C++ ソース ファイルが作成されました。

HTML と PHP などの組み合わせたソースを扱う場合、この問題はさらに厄介なものになると想像できます。

于 2008-10-20T01:08:16.127 に答える
3

生成されたコードが生成されたコードを支配するときに私が使用する手法は、インデントパラメーターを渡すことです。

たとえば、Pythonでは、より多くのPythonを生成します。

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

または、気分に応じて:

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

condition同じ行に収まる短いテキストでありblock、別のインデントされた行にあるという仮定に注意してください。このコードでサブアイテムをインデントする必要があるかどうかを確認できない場合、このメソッドは失敗し始めます。

また、この手法は、比較的少量のPHPをHTMLに振りかけるのにはほとんど役立ちません。

[明確にするために編集:私は質問とこの回答を書きました。私が使用している、時には役立つ1つの手法で答えをシードしたかったのですが、この手法では一般的なPHPコーディングに失敗するため、そのような他のアイデアを探しています。]

于 2008-10-20T01:04:20.533 に答える
3

AST を生成し、それを順番にトラバースして、適切にフォーマットされたソース コードを出力します。

于 2008-10-20T01:08:46.437 に答える
2

生成中にインデントを無視するのが最善であることがわかりました。出力されたすべてのコードを後処理する汎用の「コードフォーマット」エンジンを作成しました。このようにして、インデントルールとコード構文ルールをジェネレーターとは別に定義できます。この分離には明らかな利点があります。

于 2008-10-20T01:59:03.700 に答える
1

PHPでWebサイトを作成すると、HTMLと関数固有のPHPの混合に問題があり、概要が制限され、デバッグが困難になります。この場合の混合を回避するための解決策は、テンプレート駆動型コンテンツを使用することです。たとえば、 Smartyを参照してください。より良い意図を除いて、コンテンツのテンプレート化は、たとえば、より高速なパッチ適用などの他のことに役立ちます。顧客がレイアウトの変更を必要とする場合、データを生成する機能的なPHPコードに煩わされることなく(およびその逆)、その特定のレイアウトの問題をすばやく見つけて修正できます。

于 2008-10-20T01:21:22.167 に答える
1

私はoddthinkingの答えに同意します。

場合によっては、問題を反転して解決するのが最善の方法です。大量のテキストを生成していることに気付いた場合は、少量のインテリジェントな生成コードを使用してテキストをテンプレートとして作成する方が簡単かどうかを検討してください。または、問題を一連の小さなテンプレートに分解して組み立て、各テンプレート全体をインデントできる場合。

于 2008-10-20T01:11:33.390 に答える
0

特にHTML生成について-なぜそれが重要なのですか?

インデントパラメータを回して、自分がどれだけ深くネストされているかなどを把握しようとすると、かなりの時間を費やします。一般的な時間の無駄になることは別として(最終的にレンダリングされる出力に違いがないため)、他のHTMLマークアップを追加したり、divなどでページをラップしたりするときに、これらすべてをどのように維持しますか?

とにかく、Firebug(および後でIEをテストするためのIE開発者ツールバー)をインストールすると、両方ともネストされた形式でHTMLが表示され、ページ要素をクリックするだけでマークアップを直接表示できます-生のソースHTMLを表示するよりもはるかに効率的です出力。

于 2008-10-20T01:21:51.853 に答える
0

私はPHP/HTMLの状況で、各コードフラグメントをそのソースコードで一貫してインデントされた状態に保とうとしています。これにより、コードが本当に重要な場所で読み取り可能になり、通常、読み取り可能なHTML出力を生成するという副作用があります。他の人が言っているように、firebugが残りの面倒を見てくれます。

于 2008-10-20T12:34:53.883 に答える