Deo zbornika Principi razvoja softvera

Princip isključive odgovornosti

Nikada ne treba da postoji više od jednog razloga za promenu klase.

Robert C. Martin

Princip isključive odgovornosti (Single responsibility principle) glasi da svaka komponenta treba da ima samo jednu odgovornost, odnosno jedan razlog za promenu.

To znači da je svaka komponenta odgovorna samo za obavljanje jednog određenog posla. Kada se javi potreba za njenom promenom, trebalo bi da to ne utiče na ostatak sistema.

Ako komponenta ima više odgovornosti teško ju je menjati i održavati. Poštovanjem principa jedne odgovornosti izbegava se problem monolitnih klasa, koje se bave svim i svačim.

Primer: razdvajanje odgovornosti

Kao primer možemo uzeti klasu Book, koja obuhvata koncept knjige i pridruženih funkcionalnosti:

class Book {
  public string getTitle() {
    return "A Great Book";
  }

  public string getAuthor() {
    return "John Doe";
  }

  public string turnPage() {
    // pointer to next page
  }

  public void printCurrentPage() {
    Console.WriteLine("current page content");
  }
}

Ova klasa se može učiniti kao sasvim ispravna. Imamo knjigu kojoj možemo da vidimo naslov i autora, te okrenemo sledeću stranicu. Poslednja metoda omogućava da se odštampa trenutna stranica. Međutim, ovde se može pojaviti problem. Mešanje logike sa prikazom je loša praksa.

Zbog toga bi klasu trebalo razdvojiti:

class Book {
  public string getTitle() {
    return "A Great Book";
  }

  public string getAuthor() {
    return "John Doe";
  }

  public string turnPage() {
    // pointer to next page
  }
}

interface Printer {
  void printPage(string page);
}

class PlainTextPrinter: Printer {
  public void printPage(string page) {
    Console.WriteLine("current page content: " + page);
  }
}

class HtmlPrinter: Printer {
  public void printPage(string page) {
    Console.WriteLine("<div style='single-page'>" + page + "</div>");
  }
}

U okviru ovog prostog primera možemo videti razdvajanje prezentacione od poslovne logike, što predstavlja SRP princip. Primenom ovog principa dobijamo veliku prednost u fleksibilnosti našeg softvera.

Literatura

  • Zdravko Ivanković i Dejan Lacmanović, Softversko inženjerstvo 2 (skripta), Tehnički fakultet Mihajlo Pupin, Zrenjanin
  • Carl-Hugo Marcotte, Architecting ASP.NET Core Applications, 2024.