Supponiamo che ci sia una Pageclasse, che rappresenta un insieme di istruzioni per un renderer di pagine. E supponiamo che esista una Rendererclasse 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 $dataper farlo funzionare.
Ma posso creare una PdfRendererclasse 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 $rendererriceve il PageSnippete qualsiasi $datarichiesto 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.