SOLID principy: Princip jedné odpovědnosti
Michal KatuščákPrincip 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)
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;
}
}