Предположим, есть Pageкласс, который представляет собой набор инструкций для средства визуализации страниц. И предположим, есть Rendererкласс, который знает, как отобразить страницу на экране. Структурировать код можно двумя разными способами:
/*
* 1) Page Uses Renderer internally,
* or receives it explicitly
*/
$page->renderMe();
$page->renderMe($renderer);
/*
* 2) Page is passed to Renderer
*/
$renderer->renderPage($page);
Каковы плюсы и минусы каждого подхода? Когда будет лучше? Когда другой станет лучше?
ФОН
Чтобы добавить немного больше фона - я использую оба подхода в одном и том же коде. Я использую стороннюю библиотеку PDF под названием TCPDF. Где-то в моем коде я должен иметь следующее для рендеринга PDF для работы:
$pdf = new TCPDF();
$html = "some text";
$pdf->writeHTML($html);
Скажем, я хочу создать представление страницы. Я мог бы создать шаблон, который содержит инструкции для рендеринга фрагмента страницы PDF, например:
/*
* 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) Обратите внимание, что здесь $snippet запускается сам , как в моем первом примере кода. Он также должен знать и быть знакомым $pdfс любым $dataдругим, чтобы он работал.
Но я могу создать PdfRendererкласс так:
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);
}
}
и тогда мой код превращается в это:
$renderer = new PdfRenderer(new TCPDF());
$renderer->runTemplate(new PageSnippet(), array('html' => 'some text'));
2) Здесь $rendererполучает PageSnippetи все $dataнеобходимые для его работы. Это похоже на мой второй пример кода.
Таким образом, даже несмотря на то, что средство визуализации получает фрагмент страницы, внутри средства визуализации все еще выполняется сам фрагмент . То есть оба подхода находятся в игре. Я не уверен, что вы можете ограничить использование ОО только одним или только другим. Оба могут потребоваться, даже если вы маскируете одно за другим.