SOLID – 1. Zasada pojedynczej odpowiedzialności (S – single responsibility)

SOLID – Zasada pojedynczej odpowiedzialności – pierwsza wytyczna, którą można zdefiniować następująco: klasa nie powinna być modyfikowana z więcej niż jednego powodu. Lub też: klasa powinna mieć jeden główny cel, być odpowiedzialna za jedną konkretną rzecz, jedną funkcjonalność. Dlaczego? Ponieważ łatwiej jest wtedy zrozumieć kod. Rób jedną rzecz i rób ją dobrze. Reguła ta zwiększa zazwyczaj liczbę klas w programie (co na pierwszy rzut oka wydaje się niekorzystne). Jednak znaczącym plusem jest to, że eliminuje mało zrozumiałe, nawet kilkuset wierszowe klasy odpowiedzialne za wiele rzeczy. Posłużmy się przykładem z języka PHP:

class User
{
     private $name;
     private $surname;

     public function __construct ($name, $surname)
     {
          $this->name = $name;
          $this->surname = $surname;
     }

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

     public function getSurname()
     {
          return $this->surname;
     }

     private function checkText($text)
     {
          //code;
     }
}

W powyższym prostym przykładzie klasa User odpowiedzialna jest za przechowywanie właściwości tegoż użytkownika, ale także za sprawdzanie poprawności podanego tekstu (np. czy nie ma w nim cyfr itp.). Taka metoda może być wykorzystywana także w innych obszarach programu m. in. przy sprawdzaniu podanych przez użytkownika komentarzy czy innych danych, które nie są ściśle powiązane z klasą User. Jeżeli ktoś chciałby walidować tekst poza instancją klasy User, to kod musiałby zostać powtórzony. Aby tego uniknąć kod powinien wyglądać choćby tak:

class User
{
     private $name;
     private $ surname;

     public function __construct ($name, $surname)
     {
          $this->name = $name;
          $this->surname = $surname;
     }

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

     public function getSurname()
     {
          return $this->surname;
     }

}

class textValidator
{
     private $text;

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

     public function checkText()
     {
          //code;
     }
}

Z klasy User wydzielono funkcjonalność związaną ze sprawdzaniem, czy podany przez użytkownika tekst jest poprawny. Na pierwszy rzut oka wydaje się to nieopłacalne. Po co tworzyć nową klasę, tym samym zwiększając (choć nieznacznie) liczbę linijek kodu? Otóż właśnie dzięki temu możemy wykorzystać omawiane sprawdzanie tekstu także w innych miejscach programu. Kod jest także czytelniejszy, ma większe możliwości wykorzystania i łatwiej go naprawiać. W tym przypadku korzyści są znaczące – rozbicie jednej klasy na dwie nie jest więc wadą, lecz zaletą.

Dziękuję za zapoznanie się artykułem dotyczącym pierwszej wytycznej SOLID – Zasada pojedynczej odpowiedzialności.
Zapraszam do kolejnego artykułu. Pochylimy się nad kolejną wytyczną jaką jest zasada otwarty-zamknięty.