Suponha que exista uma Page
classe, que represente um conjunto de instruções para um renderizador de página. E suponha que exista uma Renderer
classe que saiba como renderizar uma página na tela. É possível estruturar o código de duas maneiras diferentes:
/*
* 1) Page Uses Renderer internally,
* or receives it explicitly
*/
$page->renderMe();
$page->renderMe($renderer);
/*
* 2) Page is passed to Renderer
*/
$renderer->renderPage($page);
Quais são os prós e os contras de cada abordagem? Quando alguém será melhor? Quando o outro será melhor?
FUNDO
Para adicionar um pouco mais de fundo - estou me achando usando as duas abordagens no mesmo código. Estou usando uma biblioteca de PDF de terceiros chamada TCPDF
. Em algum lugar do meu código, tenho que ter o seguinte para que a renderização de PDF funcione:
$pdf = new TCPDF();
$html = "some text";
$pdf->writeHTML($html);
Digamos que desejo criar uma representação da página. Eu poderia criar um modelo que contém instruções para renderizar um trecho de página em PDF da seguinte maneira:
/*
* 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 aqui que $snippet
é executado sozinho , como no meu primeiro exemplo de código. Ele também precisa conhecer e estar familiarizado com o $pdf
e com qualquer um $data
para que ele funcione.
Mas, eu posso criar uma PdfRenderer
classe assim:
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 então meu código se volta para isso:
$renderer = new PdfRenderer(new TCPDF());
$renderer->runTemplate(new PageSnippet(), array('html' => 'some text'));
2) Aqui, $renderer
recebe o PageSnippet
e todo o $data
necessário para que ele funcione. Isso é semelhante ao meu segundo exemplo de código.
Portanto, mesmo que o renderizador receba o trecho de página, dentro do renderizador, o trecho ainda será executado automaticamente . Ou seja, ambas as abordagens estão em jogo. Não tenho certeza se você pode restringir o uso de OO a apenas um ou apenas o outro. Ambos podem ser necessários, mesmo se você mascarar um pelo outro.