Kod üretimi için Girintileme

8 Cevap php

Genellikle, programcılar diğer bir kod üretir kod yazmak.

(Teknik terim metaprogramming, ama bu sadece çapraz derleyiciler daha yaygındır; HTML ya da her XSLT dosyası oluşturur her PHP web sayfası düşünün.)

Ben zor bulmak bir alan olduğunu both elle yazılmış kaynak dosyasını sağlamak için teknikler ile geliyor ve bilgisayar tarafından oluşturulan nesne dosyası açıkça hata ayıklama yardımcı olmak için girintili. Iki gol sık sık rakip gibi görünüyor.

Ben PHP / HTML birlikte bu özellikle zor buluyorum. Ben olduğunu düşünüyorum çünkü:

  • üreten PHP daha kaynak dosyada HTML kodu bazen daha var
  • HTML dosyaları SQL ifadeleri, diyelim ki, daha uzun olma eğilimindedir ve daha iyi girintilenmiş gerekir
  • HTML (örneğin etiketleri arasında) uzay-duyarlı özelliklere sahip
  • Sonuç daha halka SQL deyimlerinden daha görünür HTML, yani makul bir iş yapmak için daha fazla baskı var.

Bu adrese hangi teknikleri kullanıyorsunuz?


Edit: I accept that there are at least three arguments to not bothering to generate pretty HTML code:

  • Üreten kod karmaşıklığı artar.
  • Tarayıcı tarafından render için hiç fark etmez; geliştiriciler güzel görüntülüyebilmek için kundakçı veya benzer kullanabilirsiniz.
  • Minor performans bulunanlar - boşluk karakterleri indirme süresini arttı.

Ben kesinlikle, bazen girinti (özellikle SQL) düşünce olmadan kod yarattı.

Ancak, başka bir şekilde iterek bir kaç argüman vardır:

  • Ben do sık üretilen kod okumak, pratikte bulmak - sakıncalı olduğunu erişmek için ekstra adımlar sahip.
  • HTML zaman zaman ısırık bazı uzay-duyarlılık sorunları var.

Örneğin, kod göz önünde bulundurun:

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

Aşağıdaki kod daha nettir:

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

Ancak, aynı zamanda, çünkü HTML dahil boşluklarla farklı render vardır.

8 Cevap

Daha genel bir durumda, ben C + + veritabanı arayüzü kod üretir XSLT kod yazdım. Ilk başta ben XSLT'den çıktı düzgün girintili kod çalışsa da, bu hızla savunulamaz oldu. Benim çözüm tamamen XSLT çıktı biçimlendirme görmezden, ve sonra GNU indent ile kod çıkan çok uzun bir çizgi çalıştırmak oldu. Bu hata ayıklama için uygun bir makul biçimlendirilmiş bir C + + kaynak dosyası üretti.

Ben HTML ve PHP gibi kombine kaynağı ile uğraşırken sorun çok daha dikenli alır hayal edebiliyorum.

Bir AST oluşturmak sonra, O'na bunu hareket ve düzgün biçimlendirilmiş kaynak kodunu yayarlar.

Ben üreten kod oluşturulan kod üzerinde egemen olduğu zaman kullandığınız bir teknik etrafında bir girinti parametre geçmektir.

örneğin, Python, daha Python üreten.

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

Alternatif olarak, benim ruh bağlı olarak:

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

block, ayrı bir girintili satırda ise condition, aynı hat üzerinde uygun metin kısa bir parça olduğunu varsayımını unutmayın. Bu kod alt kalemler girintili gerekir mi emin olamaz, bu yöntem düşmeye başlar.

Ayrıca, bu teknik, HTML içine PHP, nispeten küçük miktarlarda yağmurlama için yaklaşık olarak kullanışlı değildir.

[Düzenleme netleştirmek için: Ben bu sorunun cevabı da soru yazdı ve. Ben kullanırım bir teknikle cevapları tohum istedim ve bazen yararlıdır, ancak bu tekniğin tipik PHP kodlama için beni başarısız, bu yüzden bu gibi diğer fikirler arıyorum.]

I üretimi sırasında girinti göz ardı en iyi olduğunu bulduk. Ben tüm kod çıktısı işlenmiş post-motor genel bir 'biçimlendirme kodu' yazdım. Bu şekilde, ben jeneratörden ayrı kuralları ve kod yazım kuralları girintilenmiş tanımlayabilirsiniz. Bu ayrılık için açık faydaları vardır.

Ben oddthinking cevabı katılıyorum.

Bazen onu ters çevirerek sorunu çözmek için en iyisidir. Kendinizi metin bir sürü üreten bulursanız, en kolay akıllı nesil küçük kod parçaları ile bir şablon olarak metin yazmak eğer düşünün. Yoksa aşağı monte, ve daha sonra bir bütün olarak her şablon girinti küçük şablonları bir dizi içine sorun yıkmak eğer.

PHP web siteleri yapmak, ben HTML ve sorunlu işlevi belirli PHP karıştırma bulmak, bu bakış sınırlar ve hata ayıklama zorlaştırır. see Smarty, örneğin şablon tahrik içerik kullanarak bu durumda karıştırma önlemek için bir çözüm. Daha intendation dışında, içeriğin şablon, örneğin hızlı yama gibi, diğer şeyler için yararlıdır. Bir müşteri düzeninde bir değişiklik gerektiriyorsa, bu belirli düzen sorunu hızla fonksiyonel PHP kodu veri üreten (ve tersi) ile rahatsız olmadan bulundu ve sabit olabilir.

Özellikle HTML nesil - neden önemli?

Parametreleri indenting etrafında geçen zaman çok bir halt harcama ve Kenara zaman genel bir atık olmaktan. Vb nasıl derinden iç içe anlamaya çalışıyoruz (son render çıktısında hiçbir fark yoktur çünkü), Bir div vb diğer HTML biçimlendirme ve şal sayfalar eklemek gibi nasıl tüm bu şeyleri korumak?

Neyse, Firebug (ve IE developer toolbar daha sonra IE test için) kurmak ve her ikisi de size iç içe geçmiş biçimde HTML göstermek ve sadece doğrudan biçimlendirme görüntülemek için sayfa öğesinin üzerine tıklayabilirsiniz - WAY ham kaynak HTML çıktısına bakarak daha verimli.

Ben sürekli kaynak kodunda girintili her kod parçasını tutmaya çalışın ben PHP / HTML durum. Bu gerçekten önemli ve usually okunabilir HTML çıktı üreten bir yan etkisi vardır okunabilir kodunu tutar. Diğerleri söylediler, kundakçı gerisini halleder.