Single responsibility principle — Zasada jednej odpowiedzialności
Każda klasa powinna mieć tylko jedną odpowiedzialność (czyli tylko jeden powód do modyfikacji klasy) – jeden cel istnienia.
Jak wykorzystywać w praktyce SRP?
Łącz w jedno kod, który ma ten sam jeden powód do zmiany. Rozdzielaj od siebie kod, który ma wiele powodów do zmiany.
Trudności związane z SRP
Z zasadą jednej odpowiedzialności związane są pewne trudności:
- Nie jest zdefiniowane, czym jest zmiana.
- Nie jest zdefiniowane, czym jest odpowiedzialność.
- Wymaga przewidywania przyszłości.
Zasadę pojedynczej odpowiedzialności można przedefiniować.
Klasa, funkcja, metoda itp. powinna odpowiadać za pojedynczą logikę biznesową na jednym poziomie abstrakcji. (http://adam.wroclaw.pl/2014/12/zasada-pojedynczej-odpowiedzialnosci/)
Klasy powinny być organizowane tak, aby minimalizować złożoność. Powinny:
- Być na tyle małe, aby zmniejszać zależności.
- Być na tyle duże, aby maksymalizować spójność.
Domyślnie powinno się wybierać grupowanie funkcjonalności na rzecz rozdzielania kodu. (https://sklivvz.com/posts/i-dont-love-the-single-responsibility-principle)
Przykład
Klasa książka ma dwie odpowiedzialności:
- Posiadanie informacji o sobie.
- Drukowanie siebie.
class Book
{
private string title;
private string content;
public Book(string title, string content)
{
this.title = title;
this.content = content;
}
public void PrintBook()
{
Console.WriteLine(title);
Console.WriteLine(content);
}
}
class Program
{
static void Main(string[] args)
{
Book book = new Book("Interesting title", "Nice content");
book.PrintBook();
}
}
W ramach refaktoryzacji wydzieliłem odpowiedzialność związaną z książką do oddzielnej klasy.
class Book
{
private string title;
private string content;
public Book(string title, string content)
{
this.title = title;
this.content = content;
}
public string GetBookToPrint()
{
return $"{title}{Environment.NewLine}{content}";
}
}
interface IPrinter
{
void Print(string content);
}
class BookPrinter : IPrinter
{
public void Print(string content)
{
Console.WriteLine(content);
}
}
class Program
{
static void Main(string[] args)
{
IPrinter printer = new BookPrinter();
Book book = new Book("Interesting title", "Nice content");
var bookToPrint = book.GetBookToPrint();
printer.Print(bookToPrint);
}
}
}
Wszystkie posty związane z mini projektem: Poznaj zasady SOLID i OOP:
Źródła
Obraz główny
Materiały
- Czysta architektura — Robert C. Martin
- https://hackernoon.com/you-dont-understand-the-single-responsibility-principle-abfdd005b137
- https://code.tutsplus.com/tutorials/solid-part-1-the-single-responsibility-principle–net-36074
- http://adam.wroclaw.pl/2014/12/zasada-pojedynczej-odpowiedzialnosci/
- https://sklivvz.com/posts/i-dont-love-the-single-responsibility-principle