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)