Tworzenie kodu według najlepszych praktyk
2 godz. 45 min · Full-stack i Programowanie
Rafał PiekaraSoftware KomandosNie zrozumiesz SOLIDa bez teoretycznych podstaw. Przejdziemy przez założenia stojące za każdą z nich. Przeanalizujemy problemy, które możesz spotkać oraz dowiesz się dlaczego ciągle jeszcze tak wielu programistów nie stosuje się do tych zasad.
Ruby i Typescript to technologie, które świetnie odzwierciedlają uniwersalizm SOLIDa. Te złote zasady działają w językach dynamicznie typowanych i interpretowanych jak Ruby oraz przy statycznym typowaniu na przykładzie Typescript.
Zanim zabierzesz się za programowanie warto poćwiczyć SOLIDny sposób myślenia. Zmierzysz się z zadaniami, w ramach których będziesz projektować kod tak, aby wszystkie zasady SOLID znalazły w nim swoje zastosowanie.
Prawda jest taka, że kod, z którym w większości pracujemy ma swoją historię. Czasami historia ta jest tak bolesna, że klasy i metody są zagmatwane, poplątane i trudne w utrzymaniu. Gdy dotrzesz do tego miejsca będziesz mieć w arsenale wszystkie potrzebne narzędzia, żeby zmierzyć się z zadaniami praktycznymi, które przekształcą kod legacy w SOLIDne arcydzieło.
Tak ważny temat, jak testowanie nie może zostać pominięty. Między innymi po to też stosujemy zasady SOLID, żeby nasz kod praktycznie sam się testował. Napiszesz więc testy, których wzorce możesz wykorzystać w dowolnym projekcie, dowolnej technologii, jeśli tylko kod, który testujesz będzie spełniał wymagania zasad SOLID.
Nie ma znaczenia, czy dopiero zaczynasz przygodę z programowaniem, czy też jesteś starym wyjadaczem, który klasami i interfejsami myśli przy zagryzaniu tosta na śniadanie. Ten kurs jest właśnie dla Ciebie. Technologia ani język programowania też nie mają znaczenia. Zasady SOLID to uniwersalny zbiór. Ich znajomość sprawi, że Twój kod będzie lepszy, łatwiejszy w utrzymaniu i odporny na perturbacje i zmiany.
No i porada wskazówki do zasady pani Barbary blisko.
Wskazówka numer 1.
Projektuj pod kątem wspólnego interfejsu.
Podmiana łatwa.
Podmiana nie jest możliwa, jeśli nie będziemy mieć wspólnego interfejsu.
Wobec czego jeśli Twój kod powinien obsługiwać kilka wariantów tego samego
zachowania, to projektuj tak, aby klasy odpowiedzialne za poszczególne
zachowanie, bo na pewno masz osobne klasy, bo spełniasz zasadę SRP, aby klasy
odpowiedzialne za poszczególne zachowania miały wspólny interfejs, tak jak to było
pokazane na przykładach w poprzednim materiale.
Więc projektowanie pod kątem wspólnego interfejsu umożliwi Ci
wstrzykiwanie i łatwe podmiany.
Wskazówka numer 2 Unikaj nadpisywania metod, zmieniając ich zachowanie
w momencie, kiedy będziesz się posiłkować dziedziczeniem
i dziedziczyć po jakiejś klasie bazowej, możliwe jest, że będziesz
musiał musiała nadpisać metody.
Unikaj tego, żeby je nadpisać w taki sposób, aby totalnie
zmieniały swoje zachowanie.
Uzasadnionym jest implementowanie metod tego samego interfejsu w różny sposób.
Natomiast w momencie dziedziczenia dziedziczymy pewną logikę po klasie
bazowej, po tej klasie, po której dziedziczą Twoje kolejne obiekty.
W tym momencie, kiedy napiszemy metodę, zmieniając radykalnie jej zachowanie,
nasz system przestaje być stabilny.
Bo kolejny developer, który wejdzie do tego systemu będzie chciał użyć tej
klasy, wywołać tą napisaną metodę.
Może się nieźle zdziwić, kiedy jej zachowanie będzie totalnie inne i system
nie będzie zachowywał się tak jak tego oczekujemy, a więc nie będzie
przewidywalny i nie będzie stabilny.
No i wskazówka numer 3 pilnuj spójności kontaktów.
Kiedy spełniamy zasadę else i mamy te spójne interfejsy, te interfejsy muszą
mieć też spójny kontrakt, a więc lista parametrów i zwracanych
wartości musi być spójna.
Więc pilnuj spójności kontraktów.
Implementując elastyczne interfejsy i tworząc obiekty,
które są przygotowane do podstawienia, muszą mieć stabilny kontrakt, najlepiej
typowany, najlepiej dobrze zrealizowany kontrakt komunikacji
między sobą a klasami.
Które z nich będą korzystać?