Misalkan ada Page
kelas, yang mewakili satu set instruksi ke renderer halaman. Dan Misalkan ada Renderer
kelas 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 $data
agar bisa bekerja.
Tapi, saya bisa membuat PdfRenderer
kelas 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 $renderer
menerima PageSnippet
dan semua yang $data
diperlukan 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.