Supposons qu'il existe une Pageclasse, qui représente un ensemble d'instructions pour un rendu de page. Et supposons qu'il existe une Rendererclasse 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 $datapour que cela fonctionne.
Mais, je peux créer une PdfRendererclasse 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 $rendererreçoit le PageSnippetet tout ce qui est $datané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.