Single Responsibility Principle (SRP) - PHP

Haremos una introducción al principio de responsabilidad única con PHP.

Rodríguez Patiño, Eduardo
2020-11-27 | 568 lecturas

Un módulo o clase de nuestro sistema debe tener un solo motivo para cambiar.

En pocas palabras no debemos mezclar responsabilidades dentro de una misma clase para evitar tener que modificar tanto código. Asi que mejor promovamos la cohesión o colaboración entre clases.

Ejemplo

Veamos un ejemplo que mezcla 2 responsabilidades, la de crear una orden y mandar el e-mail de notificación.

class OrderService
{
    public function add(Order $order) : void
    {
        // 01. Código para crear la orden

        // 02. Notificar al cliente
        $to = "admin@kodoti.com";
        $subject = "Se creado su orden de compra #2020-2365901";
        $body = "Estimado cliente, hemos creado su orden de compra satisfactoriamente";

        $this->sendCustomerNotification($to, $subject, $body);
    }

    public function sendCustomerNotification(string $to, string $subject, string $body) 
    {
        mail($to, $subject, $msg);
    }
}

La forma correcta sería ..

Veamos como debería quedar nuestro código si aplicamos el principio SOLID de responsabilidad única.

En primer lugar mo voy a mover el método para enviar el correo a una clase separada.

class EmailService 
{
    public function send(string $to, string $subject, string $body) 
    {
        mail($to, $subject, $msg);
    }
}

Y nuestro nuevo código quedaría de la siguiente manera.

class OrderService
{
    private EmailService $emailService;

    public function __construct(EmailService $emailService) 
    {
        $this->$emailService = $emailService;
    }

    public function add(Order $order) : void
    {
        // 01. Código para crear la orden

        // 02. Notificar al cliente
        $to = "admin@kodoti.com";
        $subject = "Se creado su orden de compra #2020-2365901";
        $body = "Estimado cliente, hemos creado su orden de compra satisfactoriamente";

        $this->emailService($to, $subject, $body);
    }
}

Conclusión

Hemos promovido la colaboración, así que mantener la lógica para mandar la notificación ya no será más una responsabilidad de la lógica para crear una orden de compra.