문제

종종 프로그래머는 다른 코드를 생성하는 코드를 작성합니다.

(기술 용어는입니다 메타 프로 그램, 그러나 단순히 크로스 컴필라보다 더 일반적입니다. HTML 또는 모든 XSLT 파일을 생성하는 모든 PHP 웹 페이지에 대해 생각해보십시오.)

내가 도전하는 한 가지 영역은 둘 다 손으로 작성된 소스 파일과 컴퓨터로 생성 된 객체 파일은 디버깅을 돕기 위해 분명히 들여 쓰기되었습니다. 두 가지 목표는 종종 경쟁하는 것 같습니다.

PHP/HTML 조합에서 특히 어려운 일이 있습니다. 나는 그 이유라고 생각합니다.

  • 소스 파일에 생성 PHP보다 HTML 코드가 더 많습니다.
  • HTML 파일은 SQL 문보다 길고 더 나은 압입이 필요합니다.
  • HTML에는 공간에 민감한 기능이 있습니다 (예 : 태그간에)
  • 결과는 SQL 문보다 공개적으로 보이는 HTML이므로 합리적인 작업을 수행 해야하는 압력이 더 많습니다.

이것을 해결하기 위해 어떤 기술을 사용합니까?


편집 : 나는 예쁜 HTML 코드를 생성하는 것을 귀찮게하지 않는 적어도 세 가지 주장이 있다는 것을 인정합니다.

  • 생성 코드의 복잡성이 증가합니다.
  • 브라우저 렌더링에 차이가 없습니다. 개발자는 FireBug 또는 유사한 것을 사용하여 멋지게 볼 수 있습니다.
  • 사소한 성능 히트 - 공백 문자의 다운로드 시간 증가.

나는 때때로 들여 쓰기 (특히 SQL)에 대한 생각없이 코드를 생성했습니다.

그러나 다른 방식으로 추진하는 몇 가지 주장이 있습니다.

  • 실제로는 그게 나옵니다 하다 생성 된 코드를 자주 읽습니다 - 액세스하기위한 추가 단계가있는 것은 불편합니다.
  • HTML에는 때때로 물린 공간 감도 문제가 있습니다.

예를 들어 코드를 고려하십시오.

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

다음 코드보다 명확합니다.

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

그러나 HTML에 포함 된 공백으로 인해 렌더링이 다릅니다.

도움이 되었습니까?

해결책

보다 일반적인 경우 C ++ 데이터베이스 인터페이스 코드를 생성하는 XSLT 코드를 작성했습니다. 처음에는 XSLT에서 코드를 올바르게 출력하려고 시도했지만 빠르게 수정할 수 없었습니다. 내 해결책은 XSLT 출력의 서식을 완전히 무시한 다음 결과적으로 매우 긴 코드 라인을 실행하는 것이 었습니다. GNU의 계약. 이로 인해 디버깅에 적합한 합리적인 형식의 C ++ 소스 파일이 생성되었습니다.

HTML 및 PHP와 같은 결합 된 소스를 다룰 때 문제가 훨씬 더 가혹한 것을 상상할 수 있습니다.

다른 팁

AST를 생성 한 다음 내부를 통과하고 올바르게 형식화 된 소스 코드를 방출하십시오.

생성 된 코드가 생성 된 코드를 지배 할 때 사용하는 기술은 계약 매개 변수를 전달하는 것입니다.

예를 들어, 파이썬에서 더 많은 파이썬을 생성합니다.

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로 뿌리는 데 거의 유용하지 않습니다.

명확하게하기 위해 편집 : 나는 질문 과이 답을 썼습니다. 나는 내가 사용하고 때로는 유용한 하나의 기술로 답을 시드하고 싶었지만이 기술은 일반적인 PHP 코딩에 실패하기 때문에 다른 아이디어를 찾고 있습니다.

나는 세대 동안 들여 쓰기를 무시하는 것이 가장 좋습니다. 게시물이 모든 코드를 출력 한 일반적인 '코드 형식'엔진을 작성했습니다. 이런 식으로, 나는 제기 규칙과 코드 구문 규칙을 생성기에서 별도로 정의 할 수 있습니다. 이 분리에는 분명한 이점이 있습니다.

나는 이상한 생각의 대답에 동의합니다.

때로는 문제를 반전시켜 문제를 해결하는 것이 가장 좋습니다. 많은 텍스트를 생성한다면 텍스트를 작은 비트의 지능형 세대 코드로 템플릿으로 작성하는 것이 더 쉬운 지 고려하십시오. 또는 문제를 조립하는 일련의 작은 템플릿으로 나누고 각 템플릿 전체를 들여 보내십시오.

PHP에서 웹 사이트를 만들면서 HTML과 기능 별 PHP 문제가 혼합되어 개요를 제한하고 디버깅이 더 어려워집니다. 이 경우 믹스를 피하는 솔루션은 템플릿 구동 컨텐츠를 사용하는 것입니다. Smarty를 참조하십시오 예를 들어. 더 나은 의도를 제외하고, 콘텐츠 템플릿은 예를 들어 더 빠른 패치와 같은 다른 것들에 유용합니다. 고객이 레이아웃을 변경 해야하는 경우 기능적 PHP 코드를 방해하지 않고 해당 특정 레이아웃 문제를 신속하게 찾아 고정 할 수 있습니다 (및 다른 방법).

구체적으로 HTML 생성 - 왜 중요한가?

당신은 매개 변수를 들여 쓰기 매개 변수 주변을 지나가고, 당신이 얼마나 깊게 중첩되어 있는지 알아 내려고 노력하고 있습니다. 일반적인 시간 낭비가 아니라 (최종 렌더링 된 출력에는 차이가 없기 때문에), 다른 HTML 마크 업을 추가하고 DIV 등에 랩 페이지를 추가 할 때이 모든 것을 어떻게 유지합니까?

어쨌든 설치하십시오 개똥 벌레 (그리고 IE 개발자 도구 모음 나중에 테스트하려면) 둘 다 중첩 형식으로 HTML을 표시하며 페이지 요소를 클릭하여 마크 업을 직접 볼 수 있습니다. 원시 소스 HTML 출력을 보는 것보다 더 효율적입니다.

i PHP/HTML 상황 각 코드 조각을 소스 코드에 지속적으로 들여 보내려고합니다. 이것은 코드를 실제로 중요한 곳에서 읽을 수있게하고 대개 읽을 수있는 HTML 출력을 생성하는 부작용이 있습니다. 다른 사람들이 말했듯이 Firebug는 나머지를 처리합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top