Supposons qu'il existe une Page
classe, qui représente un ensemble d'instructions pour un rendu de page. Et supposons qu'il existe une Renderer
classe qui sache rendre une page à l'écran. Il est possible de structurer le code de deux manières différentes:
/*
* 1) Page Uses Renderer internally,
* or receives it explicitly
*/
$page->renderMe();
$page->renderMe($renderer);
/*
* 2) Page is passed to Renderer
*/
$renderer->renderPage($page);
Quels sont les avantages et les inconvénients de chaque approche? Quand sera-t-on meilleur? Quand l'autre sera-t-il meilleur?
CONTEXTE
Pour ajouter un peu plus de contexte - je me retrouve à utiliser les deux approches dans le même code. J'utilise une bibliothèque PDF tierce appelée TCPDF
. Quelque part dans mon code, je dois disposer des éléments suivants pour que le rendu PDF fonctionne:
$pdf = new TCPDF();
$html = "some text";
$pdf->writeHTML($html);
Disons que je souhaite créer une représentation de la page. Je pourrais créer un modèle contenant des instructions pour rendre un extrait de page PDF comme suit:
/*
* 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) Notez ici que cela $snippet
s'exécute , comme dans mon premier exemple de code. Il doit également connaître et être familier avec $pdf
, et avec tout $data
pour que cela fonctionne.
Mais, je peux créer une PdfRenderer
classe comme ceci:
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);
}
}
puis mon code se transforme en ceci:
$renderer = new PdfRenderer(new TCPDF());
$renderer->runTemplate(new PageSnippet(), array('html' => 'some text'));
2) Ici, le $renderer
reçoit le PageSnippet
et tout ce qui est $data
nécessaire pour qu'il fonctionne. Ceci est similaire à mon deuxième exemple de code.
Ainsi, même si le rendu reçoit l'extrait de page, à l'intérieur du rendu, l'extrait s'exécute toujours lui-même . C'est-à-dire que les deux approches sont en jeu. Je ne sais pas si vous pouvez limiter votre utilisation OO à un seul ou à l'autre. Les deux peuvent être requis, même si vous vous masquez l'un par l'autre.