Page
ページレンダラーへの一連の指示を表すクラスがあるとします。そしてRenderer
、画面上にページをレンダリングする方法を知っているクラスがあるとします。次の2つの異なる方法でコードを構成できます。
/*
* 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
ために必要なものを受け取ります。これは、2番目のコード例に似ています。
そのため、レンダラーがページスニペットを受け取ったとしても、レンダラー内では、スニペット自体が実行されます。つまり、両方のアプローチが機能しているということです。OOの使用を1つだけに制限できるのか、他の1つだけに制限できるのかわかりません。一方を他方でマスクする場合でも、両方が必要になる場合があります。