Misalkan ada Pagekelas, yang mewakili satu set instruksi ke renderer halaman. Dan Misalkan ada Rendererkelas yang tahu cara membuat halaman di layar. Dimungkinkan untuk menyusun kode dengan dua cara berbeda:
/*
* 1) Page Uses Renderer internally,
* or receives it explicitly
*/
$page->renderMe();
$page->renderMe($renderer);
/*
* 2) Page is passed to Renderer
*/
$renderer->renderPage($page);
Apa pro dan kontra dari setiap pendekatan? Kapan seseorang akan lebih baik? Kapan yang lain akan lebih baik?
LATAR BELAKANG
Untuk menambahkan sedikit lebih banyak latar belakang - Saya menemukan diri saya menggunakan kedua pendekatan dalam kode yang sama. Saya menggunakan perpustakaan PDF pihak ke-3 yang disebut TCPDF. Di suatu tempat dalam kode saya, saya harus memiliki yang berikut agar rendering PDF berfungsi:
$pdf = new TCPDF();
$html = "some text";
$pdf->writeHTML($html);
Katakanlah saya ingin membuat representasi halaman. Saya bisa membuat templat yang berisi instruksi untuk membuat cuplikan halaman PDF seperti ini:
/*
* 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) Perhatikan di sini bahwa $snippet berjalan sendiri , seperti dalam contoh kode pertama saya. Itu juga perlu tahu dan terbiasa dengan $pdf, dan dengan apa pun $dataagar bisa bekerja.
Tapi, saya bisa membuat PdfRendererkelas seperti ini:
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);
}
}
dan kemudian kode saya berubah menjadi ini:
$renderer = new PdfRenderer(new TCPDF());
$renderer->runTemplate(new PageSnippet(), array('html' => 'some text'));
2) Di sini $renderermenerima PageSnippetdan semua yang $datadiperlukan untuk itu berfungsi. Ini mirip dengan contoh kode kedua saya.
Jadi, meskipun renderer menerima potongan halaman, di dalam renderer, snippet tetap berjalan sendiri . Dengan kata lain kedua pendekatan itu berperan. Saya tidak yakin apakah Anda dapat membatasi penggunaan OO hanya untuk satu atau hanya yang lain. Keduanya mungkin diperlukan, bahkan jika Anda menutupi satu sama lain.