Załóżmy, że istnieje Pageklasa, która reprezentuje zestaw instrukcji dla mechanizmu renderującego strony. Załóżmy, że istnieje Rendererklasa, która wie, jak renderować stronę na ekranie. Istnieje możliwość strukturyzacji kodu na dwa różne sposoby:
/*
* 1) Page Uses Renderer internally,
* or receives it explicitly
*/
$page->renderMe();
$page->renderMe($renderer);
/*
* 2) Page is passed to Renderer
*/
$renderer->renderPage($page);
Jakie są zalety i wady każdego podejścia? Kiedy będzie lepiej? Kiedy ten drugi będzie lepszy?
TŁO
Aby dodać trochę więcej tła - używam obu podejść w tym samym kodzie. Korzystam z zewnętrznej biblioteki plików PDF o nazwie TCPDF. Gdzieś w kodzie muszę mieć następujące elementy do renderowania PDF:
$pdf = new TCPDF();
$html = "some text";
$pdf->writeHTML($html);
Powiedz, że chcę utworzyć reprezentację strony. Mógłbym utworzyć szablon, który zawiera instrukcje renderowania fragmentu strony PDF w następujący sposób:
/*
* 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) Zauważ, że tutaj $snippet działa samo , jak w moim pierwszym przykładzie kodu. Musi także wiedzieć i być zaznajomiony $pdfz każdym $data, aby działał.
Ale mogę stworzyć taką PdfRendererklasę:
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);
}
}
a następnie mój kod zwraca się do tego:
$renderer = new PdfRenderer(new TCPDF());
$renderer->runTemplate(new PageSnippet(), array('html' => 'some text'));
2) Tutaj $rendererotrzymuje PageSnippeti wszelkie $datawymagane do jego działania. Jest to podobne do mojego drugiego przykładu kodu.
Tak więc, mimo że moduł renderujący otrzymuje fragment strony, wewnątrz modułu renderującego nadal działa . To znaczy, że oba podejścia są w grze. Nie jestem pewien, czy możesz ograniczyć użycie OO tylko do jednego lub tylko drugiego. Oba mogą być wymagane, nawet jeśli zamaskujesz jeden po drugim.