मान लीजिए कि एक 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);
प्रत्येक दृष्टिकोण के पेशेवरों और विपक्ष क्या हैं? कब बेहतर होगा? दूसरा कब बेहतर होगा?
पृष्ठभूमि
थोड़ी और पृष्ठभूमि जोड़ने के लिए - मैं खुद को एक ही कोड में दोनों दृष्टिकोणों का उपयोग कर पा रहा हूं। मैं 3rd पार्टी पीडीएफ लाइब्रेरी का उपयोग कर रहा हूं TCPDF
। मेरी कोड में कहीं न कहीं मैं है काम करने के लिए पीडीएफ प्रतिपादन के लिए निम्नलिखित है:
$pdf = new TCPDF();
$html = "some text";
$pdf->writeHTML($html);
कहें कि मैं पृष्ठ का प्रतिनिधित्व बनाना चाहता हूं। मैं एक टेम्पलेट बना सकता हूं जो पीडीएफ पेज स्निपेट को प्रस्तुत करने के लिए निर्देश रखता है जैसे:
/*
* 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
इसलिए, भले ही रेंडरर पेज स्निपेट प्राप्त करता है, रेंडरर के अंदर, स्निपेट अभी भी स्वयं चलता है । यह कहना है कि दोनों दृष्टिकोण खेल में हैं। मुझे यकीन नहीं है कि आप अपने ओओ के उपयोग को केवल एक या केवल दूसरे तक ही सीमित कर सकते हैं। दोनों की आवश्यकता हो सकती है, भले ही आप एक-दूसरे को मुखौटा लगाते हों।