Supponiamo che ci sia una Page
classe, che rappresenta un insieme di istruzioni per un renderer di pagine. E supponiamo che esista una Renderer
classe che sappia renderizzare 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 ogni approccio? Quando uno sarà migliore? Quando sarà meglio l'altro?
SFONDO
Per aggiungere un po 'più di background, mi trovo a utilizzare entrambi gli approcci nello stesso codice. Sto usando una libreria PDF di terze parti chiamata TCPDF
. Da qualche parte nel mio codice devo avere il seguente per far funzionare il rendering PDF:
$pdf = new TCPDF();
$html = "some text";
$pdf->writeHTML($html);
Di '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) Notare qui che si $snippet
esegue da solo , come nel mio primo esempio di codice. Deve anche conoscere ed avere familiarità con $pdf
, e con qualsiasi $data
per farlo funzionare.
Ma posso creare una PdfRenderer
classe 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 trasforma in questo:
$renderer = new PdfRenderer(new TCPDF());
$renderer->runTemplate(new PageSnippet(), array('html' => 'some text'));
2) Qui $renderer
riceve il PageSnippet
e qualsiasi $data
richiesto per farlo funzionare. Questo è simile al mio secondo esempio di codice.
Pertanto, anche se il renderer riceve lo snippet di pagina, all'interno del renderer lo snippet continua a funzionare da solo . Vale a dire che entrambi gli approcci sono in gioco. Non sono sicuro di poter limitare l'utilizzo di OO solo all'una o all'altra. Entrambi potrebbero essere richiesti, anche se si mascherano l'uno dall'altro.