SOLID to akronim, który wymyślił Robert C.Martin.

S – samodzielny / SINGLE RESPONSIBILITY

Klasa ma jeden główny cel, jedną odpowiedzialność, jedną funkcjonalność, jedno zadanie. Klasa może być odpowiedzialna za jeden obszar projektu.

Plusy : Czytelność kodu, łatwość w utrzymaniu i modyfikacji

O – otwarty / OPEN/CLOSED PRINCIPLE

Kod powinien być otwarty na rozbudowę i zamknięty na modyfikację. Sprowadza się to do dziedziczenia, polimorfizmu.

Plusy: Minimalizujemy potrzebę modyfikowania istniejącego kodu w wielu miejscach, gdy dodajemy np. kolejny przypadek czegoś.

L – LISKOV SUBSTITUTION

Kod powinien współpracować poprawnie z klasą i jej podklasami. Klasy pochodne implementują wszystkie metody klas bazowych. Podklasa nie powinna robić mniej niż klasa bazowa

Przykład: Mamy 2 klasy, które mają takie same metody. Należy wspólne metody wyodrębnić do jednej klasy.

Plusy: Przewidywalne zachowania obiektów.

I – interfejsy / INTERFACE SEGREGATION

Kod używający klasy powinien używać wyłącznie podzbioru istotnych metod. Klasy nie powinny implementować metod, których nie używają. System powinien być zbudowany z małych interfejsów (często tylko z jedną metodą). Klasa nie powinna implementować interfejsu, który narusza Single responsibility principle. Wiele dedykowanych interfejsów jest lepsze niż jeden ogólny.

Przykład: Mamy interfejs i 2 klasy, które go implementują. Jedna klasa w całości, druga częściowo. Należy rozdzielić interfejs na mniejsze, tak aby każdy z nich deklarował tylko te funkcje które są rzeczywiście wywoływane przez danego klienta.

Plusy: Lepsza re używalność interfejsów.

D – odwrócenie zależności / DEPENDENCY INVERSION

Niskopoziomowe klasy powinny zależeć od klas wysoko poziomowych, a obie od swoich abstrakcji.

Inaczej mówiąc nie powinniśmy operować bezpośrednio na instancjach naszych klas, zmiennych, obiektów czy metod a na ich interfejsach, które są ich warstwami abstrakcji i pozwalają na rozbudowę i dokonywanie zmian.

Żadna zmienna nie powinna zawierać referencji do konkretnej klasy.

Żadna klasa nie powinna dziedziczyć po konkretnej klasie.

Żadna metoda nie powinna przykrywać metody zaimplementowanej w którejkolwiek z klas bazowych.

Plusy: Minimalizowanie zależności (loose coupling)