Supongamos que hay una Pageclase, que representa un conjunto de instrucciones para un procesador de páginas. Y supongamos que hay una Rendererclase que sabe cómo representar una página en la pantalla. Es posible estructurar el código de dos maneras diferentes:
/*
* 1) Page Uses Renderer internally,
* or receives it explicitly
*/
$page->renderMe();
$page->renderMe($renderer);
/*
* 2) Page is passed to Renderer
*/
$renderer->renderPage($page);
¿Cuáles son los pros y los contras de cada enfoque? ¿Cuándo será uno mejor? ¿Cuándo será mejor el otro?
ANTECEDENTES
Para agregar un poco más de antecedentes, me encuentro usando ambos enfoques en el mismo código. Estoy usando una biblioteca PDF de terceros llamada TCPDF. En algún lugar de mi código tengo que tener lo siguiente para que funcione la representación de PDF:
$pdf = new TCPDF();
$html = "some text";
$pdf->writeHTML($html);
Digamos que deseo crear una representación de la página. Podría crear una plantilla que contenga instrucciones para representar un fragmento de página PDF de esta manera:
/*
* 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) Observe aquí que se $snippet ejecuta solo , como en mi primer ejemplo de código. También necesita saber y estar familiarizado con el $pdf, y con cualquiera $datapara que funcione.
Pero, puedo crear una PdfRendererclase así:
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);
}
}
y luego mi código se convierte en esto:
$renderer = new PdfRenderer(new TCPDF());
$renderer->runTemplate(new PageSnippet(), array('html' => 'some text'));
2) Aquí $rendererrecibe el PageSnippety todo lo $datanecesario para que funcione. Esto es similar a mi segundo ejemplo de código.
Por lo tanto, aunque el procesador recibe el fragmento de página, dentro del procesador, el fragmento aún se ejecuta solo . Es decir que ambos enfoques están en juego. No estoy seguro de si puede restringir su uso de OO a solo uno o solo al otro. Ambos pueden ser necesarios, incluso si se enmascaran uno por el otro.