Tylko, że co to dokładnie oznacza?
Jeśli klasa odpowiada za więcej niż jeden obszar jednocześnie, wtedy może istnieć więcej powodów do zmian niż jeden. Też można się w tym trochę pogubić ;) zatem przejdźmy do przykładu, który nakreśli problem.
Mamy sobie klasę, która odpowiada za dodanie dwóch cyfr do siebie oraz wypisaniu tego na ekran.
class Matematyka
{
private int wynik;
public void Dodaj(int a, int b)
{
wynik = a + b;
}
public void Wypisz()
{
Console.WriteLine(wynik);
}
}
Tutaj jest zachwiana zasada SRP. Dlaczego? Ponieważ ta klasa odpowiada za dwie rzeczy:
1. dodawanie
2. wypisywanie/rysowanie na ekran
w myśl SRP powinna ciążyć na niej 1 odpowiedzialność, czyli albo dodawanie albo rysowanie. Poprawne rozwiązanie problemu:
interface IWypisz
{
void Wypisz(int wynik);
}
class Matematyka
{
private int wynik;
public int Wynik
{
get
{
return wynik;
}
}
public void Dodaj(int a, int b)
{
wynik = a + b;
}
}
class MatematykaUI : IWypisz
{
public void Wypisz(int wynik)
{
Console.WriteLine(wynik);
}
}
class Program
{
static void Main(string[] args)
{
Matematyka m = new Matematyka();
m.Dodaj(2,3);
IWypisz w = new MatematykaUI();
w.Wypisz(m.Wynik);
}
}
Teraz jak chcemy zmodyfikować nasz bardzo skomplikowany ;) algorytm dodawania, to mamy pewność, że nic nie schrzanimy w wyświetlaniu wyniku i odwrotnie. Oczywiście, trzeba się nauczyć stosować SRP z wyczuciem. Przyjdzie to z praktyką, lecz nie ukrywam, że jest to trudne, by na prawdę dobrze stosować SRP'a. W "przykładowej aplikacji" jaką tworzymy na pewno pojawią się dylematy z rozwiązaniem tego problemu, wtedy przypomnę o Zasadzie Pojedynczej Odpowiedzialności.
Brak komentarzy:
Prześlij komentarz