Zasada pojedynczej odpowiedzialności

"Dochodzenie do mistrzostwa wymaga dwóch elementów: wiedzy i pracy." - Robert C. Martin

Zasada pojedynczej odpowiedzialności

Zasada pojedynczej odpowiedzialności single responsibility principle

Zasada pojedynczej odpowiedzialności głosi, że każda klasa powinna być odpowiedzialna za jedną konkretną rzecz. Oznacza to mniej więcej, że nie powinien istnieć więcej niż jeden powód do modyfikacji danej klasy.

Zastosowanie tej zasady w kodzie znacznie zwiększa ilość klas w programie – powstaje wiele małych klas posiadających jedną funkcjonalność, jednocześnie zmniejsza się ilość klas bardzo złożonych, wielofunkcyjnych. Zasada ta odnosi się również do interfejsów – zdefiniowanie dostatecznej ilości interfejsów znacznie zwiększa w przyszłości elastyczność kodu. Poniższy rysunek przestawia kod źródłowy łamiący zasadę SRP.

<?php
class Registration
{
private $login;
private $password;

public function __construct($login, $password)
{
$this->login = $login;
$this->password = $password;
}

public function validateLogin()
{
echo 'Walidacja loginu';
}

public function saveUserToDatabase()
{
echo 'Zapisywanie nowego użytkownika do bazy danych';
}

$user = new Registration('user123','myPassword123');
$user->validateLogin();
$user->saveUserToDatabase();
}
?>

Klasa Registration jest odpowiedzialna za dwie rzeczy, sprawdza czy login podany przez użytkownika login znajduje się już w bazie oraz zapisuje dane nowego użytkownika do bazy danych. Jako, że według zasady SRP klasa powinna posiadać jedną odpowiedzialność, należy klasę Registration podzielić na dwie mniejsze klasy – klasę Registration, której metoda saveUserToDatabase() zapisuje nowego użytkownika do bazy oraz klasę LoginValidator, której metoda validateLogin() sprawdza czy dany login znajduje się już w bazie danych. Poprawnie podzielone klasy zostały przedstawione w poniższym kodzie źródłowym PHP.

<?php
class Registration
{
private $login;
private $password;

public function __construct($login, $password)
{
$this->login = $login;
$this->password = $password;
}

public function saveUserToDatabase()
{
echo 'Zapisywanie nowego użytkownika do bazy danych';
}
}

class LoginValidator
{
public function __construct($login)
{
$this->login = $login;
}

public function validateLogin()
{
echo 'Walidacja loginu';
}

$user = new Registration('user123','myPassword123');
$user = new LoginValidator('user123');
$user->validateLogin();
$user->saveUserToDatabase();
}
?>