Angenommen, es gibt eine Page
Klasse, die eine Reihe von Anweisungen für einen Seitenrenderer darstellt. Angenommen, es gibt eine Renderer
Klasse, die weiß, wie eine Seite auf dem Bildschirm gerendert wird. Code kann auf zwei verschiedene Arten strukturiert werden:
/*
* 1) Page Uses Renderer internally,
* or receives it explicitly
*/
$page->renderMe();
$page->renderMe($renderer);
/*
* 2) Page is passed to Renderer
*/
$renderer->renderPage($page);
Welche Vor- und Nachteile hat jeder Ansatz? Wann wird man besser sein? Wann wird der andere besser sein?
HINTERGRUND
Um ein bisschen mehr Hintergrund hinzuzufügen - ich finde mich dabei, beide Ansätze im selben Code zu verwenden. Ich verwende eine PDF-Bibliothek eines Drittanbieters namens TCPDF
. Irgendwo in meinem Code muss ich Folgendes haben , damit das PDF-Rendering funktioniert:
$pdf = new TCPDF();
$html = "some text";
$pdf->writeHTML($html);
Angenommen, ich möchte eine Darstellung der Seite erstellen. Ich könnte eine Vorlage erstellen, die Anweisungen zum Rendern eines PDF-Seitenausschnitts enthält:
/*
* 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) Beachten Sie hier, dass es $snippet
sich wie in meinem ersten Codebeispiel selbst ausführt. Es muss auch wissen und vertraut sein mit $pdf
und mit jedem, $data
damit es funktioniert.
Aber ich kann eine PdfRenderer
Klasse wie folgt erstellen :
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);
}
}
und dann dreht sich mein Code dazu:
$renderer = new PdfRenderer(new TCPDF());
$renderer->runTemplate(new PageSnippet(), array('html' => 'some text'));
2) Hier $renderer
erhält der PageSnippet
und alle dafür $data
notwendigen Arbeiten. Dies ähnelt meinem zweiten Codebeispiel.
Obwohl der Renderer das Seiten-Snippet empfängt, wird das Snippet im Renderer dennoch selbst ausgeführt . Das heißt, beide Ansätze spielen eine Rolle. Ich bin mir nicht sicher, ob Sie Ihre OO-Nutzung auf den einen oder den anderen beschränken können. Beides kann erforderlich sein, auch wenn Sie eines nach dem anderen maskieren.