Page
페이지 렌더러에 대한 명령 세트를 나타내는 클래스 가 있다고 가정 하십시오. 그리고 Renderer
화면에 페이지를 렌더링하는 방법을 알고 있는 클래스 가 있다고 가정 합니다. 두 가지 다른 방식으로 코드를 구성 할 수 있습니다.
/*
* 1) Page Uses Renderer internally,
* or receives it explicitly
*/
$page->renderMe();
$page->renderMe($renderer);
/*
* 2) Page is passed to Renderer
*/
$renderer->renderPage($page);
각 접근법의 장단점은 무엇입니까? 언제 더 좋을까요? 다른 쪽은 언제 나을까요?
배경
조금 더 많은 배경을 추가하려면 동일한 코드에서 두 가지 방법을 모두 사용하고 있습니다. 이라는 타사 PDF 라이브러리를 사용하고 TCPDF
있습니다. 내 코드에서 어딘가에 나는 이 일에 PDF 렌더링에 대해 다음을 가지고 :
$pdf = new TCPDF();
$html = "some text";
$pdf->writeHTML($html);
페이지 표현을 만들고 싶다고 가정 해보십시오. 다음과 같이 PDF 페이지 스 니펫을 렌더링하는 지침이 포함 된 템플릿을 만들 수 있습니다.
/*
* A representation of the PDF page snippet:
* a template directing how to render a specific PDF page snippet
*/
class PageSnippet
{
function runTemplate(TCPDF $pdf, array $data = null): void
{
$pdf->writeHTML($data['html']);
}
}
/* To be used like so */
$pdf = new TCPDF();
$data['html'] = "some text";
$snippet = new PageSnippet();
$snippet->runTemplate($pdf, $data);
1) 첫 번째 코드 예제에서와 같이 $snippet
스스로 실행됩니다 . 또한 알고하고 잘 알고 있어야 $pdf
하고, 어떤으로 $data
그것을위한 작업.
그러나 PdfRenderer
다음과 같이 클래스를 만들 수 있습니다 .
class PdfRenderer
{
/**@var TCPDF */
protected $pdf;
function __construct(TCPDF $pdf)
{
$this->pdf = $pdf;
}
function runTemplate(PageSnippet $template, array $data = null): void
{
$template->runTemplate($this->pdf, $data);
}
}
그런 다음 내 코드는 다음과 같습니다.
$renderer = new PdfRenderer(new TCPDF());
$renderer->runTemplate(new PageSnippet(), array('html' => 'some text'));
2) 여기에 $renderer
수령인이 근무 PageSnippet
하는 $data
데 필요한 모든 물품이 수령 됩니다. 이것은 두 번째 코드 예제와 비슷합니다.
따라서 렌더러가 페이지 스 니펫을 수신하더라도 렌더러 내에서 스 니펫은 여전히 실행됩니다 . 즉, 두 가지 접근 방식이 모두 유효합니다. OO 사용을 하나만 또는 다른 하나만으로 제한 할 수 있는지 잘 모르겠습니다. 서로 마스킹하더라도 두 가지가 필요할 수 있습니다.