สมมติว่ามี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);
ข้อดีและข้อเสียของแต่ละวิธีคืออะไร เมื่อใดจะดีกว่า คนอื่นจะดีกว่าเมื่อไหร่?
พื้นหลัง
เมื่อต้องการเพิ่มพื้นหลังเพิ่มเติมเล็กน้อย - ฉันค้นหาตัวเองโดยใช้วิธีการทั้งสองในรหัสเดียวกัน ฉันกำลังใช้ห้องสมุดของบุคคลที่ 3 รูปแบบไฟล์ 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
สิ่งที่จำเป็นสำหรับการทำงาน นี่คล้ายกับตัวอย่างรหัสที่สองของฉัน
ดังนั้นแม้ว่า renderer ได้รับข้อมูลโค้ดหน้าภายในแสดงผลข้อมูลโค้ดยังคงทำงานของตัวเอง กล่าวคือวิธีการทั้งสองอยู่ในการเล่น ฉันไม่แน่ใจว่าคุณสามารถ จำกัด การใช้งาน OO ของคุณให้เหลือเพียงอย่างเดียวเท่านั้น อาจจำเป็นต้องใช้ทั้งคู่แม้ว่าคุณจะปิดบังหน้ากัน