wtorek, 29 kwietnia 2008

Zasada Pojedynczej Odpowiedzialności / Single-Responsibility Principle

"Żadna klasa nie może być modyfikowana z więcej niż jednego powodu".

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: