Zasady SOLID


Podstawowe 5 zasad związanych z programowaniem obiektowym. Zasady zostały zaproponowane na początku lat 2000 przez Roberta C. Martina.

SOLID to nazwa utworzona z pierwszych liter angielskich nazw 5 zasad:

S – single responsibility (zasada pojedynczej odpowiedzialności)
O – open-close (zasada otwarte – zamknięte)
L – Liskov substitution (zasada podstawiania)
I – interface segregation (zasada segregacji interfejsów)
D – dependency inversion (zasada odwrócenia zależności)

Poniżej po krótce opisano ww. zasady.

Single responsibility 
Nigdy nie powinno być więcej niż jednego powodu do modyfikacji klasy. Klasa powinna być koherentna i posiadać pojedynczą odpowiedzialność. Klasy powinny być specjalizowane. Klasy posiadające takie cechy są bardziej stabilne, tj. rzadziej zmieniane, przez co są prostsze w utrzymaniu.

Open-close
Elementy systemu takie jak klasy, funkcje powinny być otwarte na rozszerzanie ale bez modyfikacji ich kodu źródłowego.

Liskov subsitution principle
Jeżeli S jest podtypem T to obiekt T może być zastąpiony innym obiektem dziedziczącym po S bez zmiany pożądanych funkcjonalności programu.

Zgodnie z tą zasadą nie powinno się zatem tworzyć metod, które realizują specyficzne zachowanie w zależności od typu obiektu, jak np.

public void method(S o) {
if (o instacneof T ) {
}

Ponieważ instanceof powoduje, że jeżeli dodamy inny obiekt dziedziczący po S to najprawdopodobniej trzeba będzie zmienić metodę method.

Interface segregation principle 
Klient nie powinien być zależny od metod interfejsu, których nie używa. Interfejsy zawierające dużą liczbę metod powinny być podzielone na mniejsze. Tak aby dany klient korzystał z interfejsu (ze wszystkich metod). System powinien być decoupled, łatwiejszy w refactorowaniu.

Dependency inversion 
W tradycyjnym podejściu klasy (logika) wyższego poziomu bezpośrednio korzysta z logiki (klas) niższego poziomu. Ogranicza się w ten sposób wykorzystanie logiki (klas) wyższego poziomu, gdyż są ściśle związane z implementacją (logiką) niższego poziomu.
Zgodnie z zasadą odwrócenia zależności to logika wyższego poziomu nie powinna zależeć od logiki niższego poziomu. W tym celu wprowadza się elementy abstrakcji (klasy abstrakcyjne/interfejsy) w taki sposób, że klasy wyższego poziomu korzystają z abstrakcji, a klasy niższego poziomu implementują abstrakcję.


Rys 1. Podejście tradycyjne



Rys 2. Podejście zgodne z zasadą odwróconej zależności