Supponiamo che esista una classe Page
, che rappresenta un set di istruzioni per un renderer di pagine. Supponiamo che esista una classe Renderer
che sappia come visualizzare una pagina sullo schermo. È possibile strutturare il codice in due modi diversi:
/*
* 1) Page Uses Renderer internally,
* or receives it explicitly
*/
$page->renderMe();
$page->renderMe($renderer);
/*
* 2) Page is passed to Renderer
*/
$renderer->renderPage($page);
Quali sono i pro e i contro di ciascun approccio? Quando si sarà migliori? Quando sarà migliore l'altro?
SFONDO
Per aggiungere un po 'più di background - Mi sto ritrovando ad utilizzare entrambi gli approcci nello stesso codice. Sto usando una libreria PDF di terze parti chiamata TCPDF
. Da qualche parte nel mio codice ho avere il seguente aspetto per il rendering PDF:
$pdf = new TCPDF();
$html = "some text";
$pdf->writeHTML($html);
Dire che desidero creare una rappresentazione della pagina. Potrei creare un modello che contiene le istruzioni per il rendering di uno snippet di pagine PDF in questo modo:
/*
* 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) Si noti qui che $snippet
si esegue da sé , come nel mio primo esempio di codice. Deve anche conoscere e avere familiarità con $pdf
e con qualsiasi $data
affinché funzioni.
Tuttavia, posso creare una classe PdfRenderer
in questo modo:
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);
}
}
e quindi il mio codice si rivolge a questo:
$renderer = new PdfRenderer(new TCPDF());
$renderer->runTemplate(new PageSnippet(), array('html' => 'some text'));
2) Qui $renderer
riceve PageSnippet
e qualsiasi $data
richiesto perché funzioni. Questo è simile al mio secondo esempio di codice.
Quindi, anche se il renderer riceve lo snippet di pagina, all'interno del renderer, lo snippet ancora si esegue da solo . Ciò significa che entrambi gli approcci sono in gioco. Non sono sicuro che tu possa limitare l'utilizzo di OO a uno solo o solo all'altro. Entrambi potrebbero essere richiesti, anche se si maschera uno per l'altro.