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.
Pora teraz na ostatnie z zadań teoretycznych zadanie dla zasady DIP,
w którym chcemy strefa autoryzować system zarządzania użytkownikami, aby usunąć te
bezpośrednie zależności, które widzieliśmy w poprzednich rozwiązaniach między
modułami i zaimplementować wstrzykiwanie zależności.
Aby zademonstrować działanie tej zasady.
No i przechodzimy do kodu.
Widzisz, w tym naszym głównym skrypcie pojawił się nowy obiekt, mianowicie User
Serwis, który z kolei w konstruktorze przyjmuje instancję User Repository
i Authentication Service.
I i ten user service odpowiada za rejestrację i autentykacji użytkowników.
Natomiast sam User Service już na pierwszy rzut oka będzie polegał
na wstrzyknięciu tych zależnościach.
Zobaczmy co tam się dzieje w tym i user serwisie.
User Service implementuje interfejs API User Service i ten interfejs dotyczy
metod register, delete i Authentication.
Więc mamy te trzy główne odpowiedzialności tego user serwisu.
I co tutaj się dzieje?
Przyjmujemy klasy, które implementują z kolei
interfejsy Authentication i User Repository.
I.
Tymi zależnościami operujemy.
Jeśli chodzi o logikę, taki user serwisu User Service sam w sobie
pełni rolę pewnej fasady.
Fasady, która kryje te implementacje, bazuje na wstrzyknięciu tych
zależnościach i wykonuje całą logikę.
Więc mamy user serwis, który z kolei zapisuje nam użytkownika do bazy, usuwa go
z bazy i autentykacji naszego użytkownika za pomocą wstrzyknięcia Authentication
Service i na podstawie tego zadania widzi, że możemy sobie dowolnie
manipulować repozytorium i gdybyśmy mieli repozytorium np.
operujące na bazie danych in memory, możemy po prostu
stworzyć sobie nową klasę In Memory Repository, która będzie implementować ten
interfejs a User Repository i wstrzyknąć advisor serwisu.
I wtedy automatycznie będziemy mieć kod, który operuje już na bazie danych w
pamięci, a nie na realnej fizycznej bazie danych, ale już na bazie in Memory, który
zmieni nam tę warstwę infrastruktury w warstwę implementacji naszego kodu.
Ale zachowanie i logika pozostanie niezmieniona.
Tak właśnie działa zasada odwrócenia zależności.
To jeden z przykładów jej zastosowania na podstawie naszych zadań.