Videa Blog

SOLID principy: Princip jedné odpovědnosti

Michal Katuščák  

Princip jedné odpovědnosti (Single Responsibility Principle) je první z pěti principů SOLID (právě to S).

Jde o metodu, díky které se kód stává přehlednějším a srozumitelnější. Říká třídě, že je zodpovědná pouze za jednu jedinou věc.

Video (1:26)

Video na Youtube

Mám zde například třídu Person, která se uchovává data osoby, ale také validuje email. Což je právě ta věc, která by dle tohohle principu měla být samostatně.

<?php

class Person
{
    private $name;
    private $email;

    public function getName(): string
    {
        return $this->name;
    }

    public function setName(string $name)
    {
        $this->name = $name;
    }

    public function getEmail(): string
    {
        return $this->email;
    }

    public function setEmail(string $email)
    {
        if ($this->validateEmail($email)) {
            $this->email = $email;
        }
    }

    private function validateEmail(string $email): bool
    {
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
            return true;
        }

        throw new InvalidArgumentException("Email is not valid email");
    }
}

Řešením zde může být to, že se bude požadovat konkrétní typ pro email.

Vytvoříme třídu Email, která bude ihned při inicializaci validovat vstup. V konstruktoru proběhne validace. Následně ve třídě Person můžeme vyžadovat typ Email a budeme mít jistotu, že email vždy prošel validací.

<?php

class Person
{
    private $name;
    private $email;

    public function getName(): string
    {
        return $this->name;
    }

    public function setName(string $name)
    {
        $this->name = $name;
    }

    public function getEmail(): Email
    {
        return $this->email;
    }

    public function setEmail(Email $email)
    {
        $this->email = $email;
    }
}

class Email
{
    private $email;

    public function __construct(string $email)
    {
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new InvalidArgumentException("Email is not valid email");
        }

        $this->email = $email;
    }

    public function __toString()
    {
        return $this->email;
    }
}