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.
W poprzednim materiale mówiłem o problemach związanych ze stosowaniem
anty wzorców przeciw zasadom SOLID.
A teraz pokażę Ci przykład takiego śmierdzącego kodu.
Przejdźmy do anty wzorca zastosowanego w zasadzie SRP.
Kod, który Ci pokazuję napisany jest w języku Ruby.
Zobacz, że mamy tutaj klasę User Manager, która ma trzy główne publiczne metody,
które mają totalnie różne zachowanie.
W pierwszej kolejności mamy jakąś walidację, mamy tworzenie użytkownika i
wysyłanie maila, kod object trzy metody, które robią totalnie inne operacje.
Teraz zasada OCP w zasadzie OCP.
Jak już mówiłem w jednej z poprzednich lekcji, takim symptomem pogwałcenia tej
zasady OCP jest info loga I widzisz, że mamy klasę Generate Report
i mamy typy takich raportów przekazywane jako parametr jest if jest if.
If type pdf Generujemy jakiś pdf if type html generujemy jakiś HTML.
Tu będzie pewnie jakaś logika odpowiedzialna za
wygenerowanie tego raportu.
Gdybyśmy dodali kolejny typ, musielibyśmy dodać kolejnego IFA zamiast tak jak to w
zasadzie powinno się robić wstrzyknąć zależność poprzez tworzenie jakiegoś
nowego obiektu lub posłużenia się wzorcem Factory.
Przejdźmy do zasady LSB. Co tutaj mamy?
Mamy tutaj brak możliwości podstawiania klas.
Mamy klasę bazową Node i FIR, która powinna mieć metodę Not HiFi.
i tutaj mamy email native layer, który wyśle nam maila.
Ale mamy też SMS Native, który oprócz wysłania SMS a będzie aktualizował
użytkownika jakimiś danymi, więc zmienia całkowicie to główne zachowanie
tej metody z klasy bazowej.
Bo jak sama nazwa metody wskazuje powinno się wysłać jakieś powiadomienie, a nie
powinno dojść do żadnych operacji na bazie danych.
Teraz zasada ISP i śmierdzący kod związany z interfejsami.
Mamy duży interfejs implementowany przez klasę Auth Service.
Metody, które totalnie nie współgrają z odpowiednią logiką.
Mamy Auth serwis, który odpowiada za logowanie, rejestrację, wysyłanie
zaproszeń, wysyłanie maili powitalnych.
A docelowo chcielibyśmy skończyć z czymś takim jak tutaj poniżej.
W tym przykładzie, gdzie mamy osobne klasy do logowania, do rejestracji, do wysyłania
powiadomień czy do wysyłania maili powitalnych Mamy rozdzielone interfejsy, a
tutaj mamy pogwałcenie tej zasady zbyt gruby świat, interfejs.
No i na koniec zasada DP, gdzie mamy klasę User report, która
nie bazuje na żadnych zależnościach. Wszystko tu się dzieje.
Mamy jakiś MongoDB adapter, który jest tworzony bezpośrednio w metodzie
odpowiedzialnej za generowanie raportu.
Tworzone jest połączenie do bazy danych, poszukiwanie usera.
Tutaj jest rozłączone połączenie z bazą danych, zwracane są
jakieś dane użytkownika.
Dzieje się tutaj za dużo.
Nie ma zależności, nie wiemy.
Z wierzchu testując tę klasę nie wiemy co tak naprawdę się tam dzieje.
Są dźwigania obiekty.
Zależymy bardzo od bazy danych.
Nasz kod nie jest elastyczny i nie jest skalowalny.
Tutaj pokazałem Ci takie przykłady śmierdzącego kodu, który nie widział
nigdy zastosowania zasad SOLID.