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.
Teraz pora na praktyczny przykład z Dependency Injection Principle.
Przejdźmy do kodu.
Kod w Ruby mamy trzy klasy Employee Admin Support Officer, więc mamy uwaga, uwaga!
Co mamy 3 aktorów w kodzie.
Mamy pracownika, mamy administratora i jakiegoś pracownika supportu.
I każda z tych klas pewnie będzie jakoś wykorzystywana w naszym systemie.
W jaki sposób będzie wykorzystywana i co decyduje o tym, która klasa powinna
być wykorzystywana w danym scenariuszu?
O tym będzie decydowała nasza fabryka. Wzorzec Factory.
Mamy fabrykę, która na podstawie jakichś tam argumentów będzie nam budować
konkretną klasę tego aktora.
Tutaj właśnie w tej metodzie build mamy też jakiś serwis, który też ma jakieś tam
argumenty i on sobie tego aktora buduje właśnie z User Factory.
Bierze sobie to fabrykę, przekazuje mu jakieś argumenty i mówi daj mi tutaj
aktora i fabryka już mu zwraca aktora, który ma uwaga będzie
miał wspólny interfejs.
Więc zasada else cały czas tutaj się trzymamy wszystkich zasad.
No i mamy serwis, który służy do potwierdzania płatności.
Ten serwis będzie nam potwierdzał płatność w metodzie
publicznej CALL, ale jeśli płatność zakończy się
powodzeniem, to nam wyśle powiadomienia.
Czyli jesteśmy w tym trybie powiadomień.
I tu mamy dobrze nam znanego email native era, który z kolei przyjmuje parametr
user, czyli pewnie naszego aktora i temu aktorowi wysyła powiadomienie.
Sama klasa Configure Payment Service nie ma pojęcia komu wysyła powiadomienie.
On nie wie czy wysyła go support oficerowi czy employee, czy czy adminowi.
To jest dla niej nieistotne.
Następnie zobacz, że tutaj w klasie config payment nie mamy już wykorzystania
factory, nie mamy wykorzystania fabryki, mamy usera jako parametr i mamy
notyfikację type jako parametr, czyli mamy kilka typów powiadomień.
I co tu się dzieje?
Mamy analogicznie to samo wysłanie powiadomienia, natomiast już będzie to
wszystko opakowane w metodę send notyfikacje.
I tutaj sens notyfikacji on wygląda w ten sposób Mamy info log, tu jest switch.
Ale nieważne.
Mamy tutaj ideologię, bo w zależności od tego jakie mamy notyfikacje type takiego
note ofiara możemy musimy tutaj użyć i możemy użyć E-mail od
frajera, slack net i frajera.
Albo wysłać sms a do tego usera.
No i rodzi się tutaj pewien problem, który możemy rozwiązać przez
wstrzyknięcie zależności.
Bo w tym momencie tutaj, w tym poprzednim przykładzie zbyt mocno interesujemy się
tym, w jaki sposób ma być wysłane powiadomienie, a tak naprawdę
klasa, która odpowiada za potwierdzenie płatności nie powinna się interesować
abstrakcją, konkretną implementacją.
Wysłanie powiadomienia nie interesuje potwierdzania płatności.
Wie jakie powiadomienie wysyła.
On ma wysłać powiadomienie. A jakie?
Tym powinna się zająć już abstrakcja.
To abstrakcją będzie wprowadzony teraz notice layer i ten notice layer będzie
wykorzystany w metodzie Send notyfikacje i w momencie potwierdzenia
płatności tutaj dostajemy frajera.
Czyli nie musimy mieć notyfikacje typu nie musimy if ować.
Jaki to jest typ notyfikacji, ale będziemy mieć gotowego, zbudowanego frajera.
Gotową abstrakcję będziemy mieć zwróconą.
I ta abstrakcja po prostu wywołuje metodę call i wysyła konkretnemu usera
powiadomienie.
Interfejs jest prosty, a zależność jest odwrócona.
Nie zależymy już od implementacji, ale zależymy od abstrakcji, od tego
frajera, jaki zostanie wysłany.
A tutaj będziemy sobie budować konkretnego frajera lub przekazywać
konkretne wartości.
Więc jeśli user jest supportem to wysyłamy email notice, a jeśli admin to slack
notice layer I to jest bardzo proste.
Na wyższym szczeblu, na wyższym szczeblu abstrakcji możemy sobie
pozwolić na taką flagę.
Możemy skorzystać z factory, z metody wytwórczej, z czegokolwiek co zbuduje nam
odpowiedni obiekt, więc tutaj odwracamy zależność.
Sam serwis, który potwierdza zamówienie nie zależy już od implementacji.
Nie mamy zależności od tego, jakie powiadomienie zostanie wysłane,
bo to wszystko jest gdzieś wyżej.
My tylko dostajemy serwis, usługę, która powiadamia i ona
wysyła już konkretne powiadomienie.
Ta logika jest zamknięta.
W tej usłudze mamy spełnione i odwrócone zależności i co więcej w testach później
możemy sobie stworzyć takiego fake not i frajera, żeby nie wysyłać prawdziwych
powiadomień sms owych jak odpalamy testy, żeby nie spamować naszych użytkowników.
Taki fejk i frajer może w tej metodzie po prostu nic nie robić albo wstrzykuje
żeby sprawdzić implementację, przetestować nasz kod.
Proste odwrócenie zależności wzorzec, który jest uwielbiany.
Zasada, która jest uwielbiana przez programistów wszelakich
technologii poznają. Warto ją poznać.
Będziemy jeszcze ćwiczyć praktycznie to odwracanie zależności, więc
zapraszam Cię dalej.