Załóżmy, że istnieje Page
klasa, która reprezentuje zestaw instrukcji dla mechanizmu renderującego strony. Załóżmy, że istnieje Renderer
klasa, 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 $pdf
z każdym $data
, aby działał.
Ale mogę stworzyć taką PdfRenderer
klasę:
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 $renderer
otrzymuje PageSnippet
i wszelkie $data
wymagane 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.