Single responsibility principle

Wstęp

SOLID to mnemonik, który zaproponował Robert C. Martin, opisujący pięć podstawowych zasad programowania obiektowego. Pierwszą z nich omówimy w tym artykule, a będzie nią zasada pojedynczej odpowiedzialności ( Single responsibility principle).

Teoria

Zasada SRP według definicji wspomnianego wyżej Pana Martina mówi o tym, że nigdy nie powinno być więcej niż jednego powodu do istnienia klasy bądź metody. Dana klasa (lub metoda), powinna mieć tylko jedną odpowiedzialność, ponieważ jeśli zajdzie konieczność ją zmienić, będziemy mieć tylko jeden obszar w którym należy tych zmian dokonać. Stosowanie się do tej reguł znacząco zwiększy ilość klas w programie, jednak wpłynie to pozytywnie na czytelność kodu i jego możliwości modyfikacji i rozszerzania.

Przykład

Poniższy przykład jest uproszczony, nie skupiamy się w nim na konkretnych implementacjach, a na przedstawieniu założeń SRP w praktyce.

public class EmployeeManager(){

  private int yearsOfWork;
  private int annualLeaveDays;
  
  public EmployeeManager(int yearsOfWork){
    this.yearsOfWork = yearsOfWork;
  }
    

  public void HandleeEmployee(){
    calculateAnnualLeaveDays();
    saveToDatabase(); 
  }
  
  private int calculateAnnualLeaveDays(){
     //calculateAnnualLeaveDays implementation
  }
  
  private void saveToDatabase(){
    //saveToDbImplementation
  }
}

Mamy klasę EmployeeManager z dwoma polami – lata pracy i dni urlopowe. Dodatkowo do dyspozycji udostępniona jest metoda publiczna HandleeEmployee, która wylicza dni urlopu na podstawie lat pracy i wynik zapisuje do bazy danych. Podejście takie łamie zasadę SRP, ponieważ w jedna klasa ma różne odpowiedzialności. Na rozwiązanie tego problemu istnieje wiele sposobów, ja proponuję, aby dodać dwie klasy, które będą się zajmowały odpowiednio rejestrowaniem do bazy danych oraz wyliczaniem dni urlopu, a klasę EmployeeManager przemianować na Employee i usunąć zbędne metody. Po wprowadzonych zmianach kod będzie wyglądał następująco.

public class Employee(){

  private int yearsOfWork;
  private int annualLeaveDays;
  
  public EmployeeManager(int yearsOfWork){
    this.yearsOfWork = yearsOfWork;
  }
}




public class EployeeManager(){
  public int calculateAnnualLeaveDays(){
    //calculateAnnualLeaveDays implementation
  }
}




public class DatabaseOperations(){
  public void saveEmployeeToDatabase() {
    //saveToDbImplementation
  }
}

Dzięki takiemu zabiegowi osiągnęliśmy główne założenie SRP – każda klasa ma teraz swoją odpowiedzialność. Kod staje się dużo czytelniejszy, otwarty na rozbudowę w przyszłości, a także jest wielokrotnego użytku i nic nie stoi na przeszkodzie aby używać potrzebnych metod w innych klasach.

Dodaj komentarz