Interface Segregation Principle - 4 zasada SOLID

Zasada separacji interfejsów.


Zasada separacji interfejsów mówi, że tworzone interfejsy musza być odpowiedzialne za jak najmniejszą funkcjonalność. Przykładowo, jeśli mamy jeden interfejs opisujący metody dostępne w klasie i chcemy rozszerzyć funkcjonalność aplikacji o nowy moduł, który wymaga tylko części metod dostępnych w interfejsie jesteśmy zmuszeni zaimplementować wszystkie metody z interfejsu bez względu na to, że tylko część z nich będzie wykorzystywana. Taki interfejs nazywamy "fat" (tłustym) lub "polluted" (zanieczyszczonym) interfejsem. Tłuste interfejsy nie są dobrym rozwiązaniem i mogą powodować niewłaściwe zachowanie systemu.
Najpopularniejszym przykładem obrazującym problem tłustych interfejsów jest problem pracownika i robota.

Kod interfejsu:

interface IPracownik
{
    void Pracuj();
    void Jedz();
    void Pij();
}

Kod klas:

class Pracownik : IPracownik
{
    public void Pracuj()
    {
    }
    public void Jedz()
    {
    }
    public void Pij()
    {
    }
}

class Robot : IPracownik
{
    public void Pracuj()
    {
    }
    public void Jedz()
    {
        throw new NotImplementedException();
    }
    public void Pij()
    {
        throw new NotImplementedException();
    }
}
Jak widać nasz interfejs jest tłustym interfejsem, ponieważ robot nie potrzebuje jeść i pić. Aby zapobiec tłustym interfejsom stosuje się refaktoryzacje kodu i rozbicie interfejsów na kilka mniejszych. Następnie w klasie Robot zamiast dziedziczyć po tłustym interfejsie i implementować niepotrzebne metody dziedziczymy tylko po jednym interfejsie. W przypadku Pracownika klasa dziedziczy po dwóch interfejsach.

Kod po refaktoryzacji:

interface IPracuj
{
    void Pracuj();
}
 
interface ISpozywaj
{
    void Jedz();
    void Pij();
}
 



class Pracownik : ISpozywaj, IPracuj
{
    public void Pracuj()
    {}
    public void Jedz()
    {}
    public void Pij()
    {}
}

class Robot : IPracuj
{
    public void Pracuj()
    {}
}
Komentarze facebook (polub nasz profil na FB aby je zobaczyć):