Ejercicio: Ejercicio 2
Tenemos una aplicación que genera reportes de ventas. El código utiliza la librería TCPDF para generar archivos PDF. ¿Cómo podríamos desacoplar la generación de PDFs de la lógica de reportes para facilitar el cambio de librería en el futuro?
<?php
class Reporte {
public function generaReporte($datos) {
// ... lógica para recopilar datos del reporte
$pdf = new TCPDF();
$pdf->addPage();
$pdf->setTextColor(0,0,0);
$pdf->setFont('helvetica');
$pdf->write(0, "REPORTE DE VENTAS ANUAL");
$pdf->ln(20);
foreach($datos as $item) {
$pdf->write(0, $item);
$pdf->ln(10);
}
$pdf->output("reporteventas.pdf");
}
}
Solución:
Aplicar patrón Strategy:
- Crear interfaz GeneradorPDF
- Implementar con la clase TCPDF
- Inyectar esta dependencia en Reporte
<?php
interface GeneradorPDF {
public function generarPDF($datos);
}
class Reporte {
private $pdf;
public function __construct(GeneradorPDF $pdf) {
$this->pdf = $pdf;
}
public function genera() {
//...
$this->pdf->generarPDF($datos);
}
}
class TCPDF implements GeneradorPDF {
// implementación
}
Así se desacopla la generación de PDFs y puede cambiarse fácilmente.