Page
Sayfa oluşturucuya yönelik bir dizi talimatı temsil eden bir sınıf olduğunu varsayalım . Ve Renderer
bir sayfanın ekranda nasıl oluşturulacağını bilen bir sınıf olduğunu varsayalım . Kodu iki farklı şekilde yapılandırmak mümkündür:
/*
* 1) Page Uses Renderer internally,
* or receives it explicitly
*/
$page->renderMe();
$page->renderMe($renderer);
/*
* 2) Page is passed to Renderer
*/
$renderer->renderPage($page);
Her yaklaşımın artıları ve eksileri nelerdir? Ne zaman daha iyi olacak? Diğeri ne zaman daha iyi olacak?
ARKA FON
Biraz daha arka plan eklemek için - kendimi aynı kodda her iki yaklaşımı kullanarak buluyorum. Adlı üçüncü taraf PDF kitaplığı kullanıyorum TCPDF
. Kodumda bir yerde PDF oluşturma çalışması için aşağıdakilere sahip olmak zorunda:
$pdf = new TCPDF();
$html = "some text";
$pdf->writeHTML($html);
Sayfanın bir temsilini oluşturmak istediğimi varsayalım. Bir PDF sayfası snippet'ini oluşturmak için talimatları tutan bir şablon oluşturabilirim:
/*
* 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) Burada, ilk kod örneğimde olduğu gibi, $snippet
kendini çalıştıran uyarı . Ayrıca çalışabilmesi için $pdf
ve her şeyi bilmeli ve bunlara aşina olmalıdır $data
.
Ancak, PdfRenderer
böyle bir sınıf oluşturabilirim :
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);
}
}
ve sonra kodum bu döner:
$renderer = new PdfRenderer(new TCPDF());
$renderer->runTemplate(new PageSnippet(), array('html' => 'some text'));
2) Burada çalışması için gerekli $renderer
olan PageSnippet
ve alır $data
. Bu ikinci kod örneğime benzer.
Dolayısıyla, oluşturucu sayfa snippet'ini alsa bile, oluşturucunun içinde snippet yine de kendi kendine çalışır . Yani her iki yaklaşım da oyunda. OO kullanımınızı yalnızca bir tanesiyle veya yalnızca diğeriyle sınırlandırabileceğinizden emin değilim. Birbirini maskeleseniz bile her ikisi de gerekli olabilir.