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 zasadę otwarte zamknięte w praktyce.
Przejdźmy do kodu.
Po samej strukturze tego kodu możemy wnioskować, że jest to kontroler aplikacji
webowej napisany w Ruby i on robi dość dużo rzeczy.
Można zobaczyć, że tutaj jest wykonywana jakaś analiza SEO blog posta.
Następnie ten post jest zapisywany do bazy, żeby później wysłać maila
powiadomieniem mailowe do kogoś.
Można uprościć ten kod, bo to jest kontroler Kontrolery HTTP z reguły nie
powinny wykonywać aż tylu aktywności ile wykonuje ten kontroler,
więc go można uprościć bardzo sprawnie.
NK postulując warstwę logiki do osobnej klasy serwisu i kończąc z czymś takim,
gdzie będziemy mieć jakiś command serwis Create post, który NK obsługuje tę logikę
tworzenia posta, a kontroler będzie się interesował tylko i wyłącznie tym
czy utworzenie posta się powiodło.
Jeśli tak, zwróci odpowiednią informację lub błędy do klienta.
Natomiast w tej klasie Create Post dzieje się już dużo więcej rzeczy, bo
doszło nam nowe wymaganie logiczne.
Mianowicie po tym jak przeanalizujemy sobie nasz post pod kątem SEO, a co
ważne zobacz, że zaszła zmiana kolejności.
Więc najpierw zapisujemy post do bazy danych, potem
analizujemy go pod kątem SEO, a następnie jeśli analiza przejdzie poprawnie, zostaje
wysłane powiadomienie do autora posta, a jeśli nie zostanie wysłane inne
powiadomienie mailowe, nie wiemy jakie.
Możliwe, że np.
do redaktora naczelnego albo do teamu SEO, który musi poprawić
ten post pod kątem pozycjonowania.
Ta klasa ciągle robi za dużo, więc możemy pójść krok dalej i skapitulować.
Samą logikę wysyłania powiadomień Zobacz teraz czy zapisujemy post, a
następnie po zapisaniu posta wysyłamy powiadomienie.
Sama metoda SAN Notyfikacje korzysta z klasy Email Native Layer,
który ma metodę post created, a ten z kolei przyjmuje parametr mail.
I czym jest ten mail? Ano mailem.
Jest to definicja klasy odpowiedzialnej za wysłanie odpowiedniego maila, która jest
wytwarzana w tej metodzie wytwórczej, którą tutaj mamy.
W metodzie Mail jest to tzw.
zastosowanie wzorca fabryki wytwórczej metody wytwórczej.
Bardzo proste.
Jeśli post przechodzi analizę, to zwraca autor maila, a jeśli nie, to post Müllera.
Ponieważ te dwie klasy mają wspólny interfejs.
I teraz uwaga trochę wyprzedzam.
Kolejne lekcje spełniają kolejną zasadę zasada LSB.
Zasadę podstawienia Barbary blisko, bo mają ten sam interfejs
i możemy je wymieniać.
Stosować dowolnie, w zależności od tego, czego potrzebujemy.
I mamy to wstrzyknięcie właśnie w taki sposób.
Możemy iść jeszcze krok dalej, żeby spełnić tę zasadę i stworzyć sobie taką
klasę Service publish post. I ta klasa.
Serwis może odpowiadać za publikację postu, za wysyłanie powiadomień, ale
będzie miała jeden parametr, który przyjmuje parametr Notice
layers i notice layers.
To jest taka tablica kolekcja usług, które są odpowiedzialne za wysyłanie
różnego rodzaju powiadomień.
I teraz można zobaczyć, że ta klasa nie robi nic więcej.
Tu nie ma żadnych IF ów, nie ma sprawdzania czy jest analiza czy
cokolwiek, ale jest po prostu wysyłane powiadomienie za pomocą tej usługi
tweetera i te usługa na tej frajera może być wstrzykiwania w ten sposób napisane
wielkimi literami Native Layers sugeruje nam, że jest to jakaś stała, a że mamy
stałą, możemy iść krok dalej i wywnioskować, że posługujemy się
pewnego rodzaju konfiguracją.
Więc oprócz wstrzyknięcia zależności, tak jak to pokazałem na bardzo prostym
przykładzie wstrzykiwania zależności tej klasy maile możemy mieć tutaj konfiguracje
gdzie mamy native definicje klas not i frajerów, czyli
usług, które wysyłają powiadomienia w tablicy w jakiejś kolekcji.
I teraz jeśli chcemy dodać kolejnego native Aira kolejną usługę, wystarczy po
prostu, że dodamy je do tej kolekcji, a wszystko już się będzie działo samo.
W ten sposób nasz kod spełnia zasadę OCP spełnia zasadę SRP i spełnia zasadę else.
Mamy aż trzy zasady SOLID tak po prostu opakowane.
Jednym prostym wzorcem wzorcem konfiguracji, gdzie możemy dodać i usuwać
poszczególnych bajerów bez zmian w kodzie logiki aplikacji.
W ten sposób nasz kod jest zamknięty na modyfikacje, a otwarty na rozszerzenia.
Bo żeby rozszerzyć nasz kod wystarczy zmodyfikować jedno miejsce w konfiguracji,
gdzie konfigurujemy listę usług.
W ten sposób spełniamy zasadę Open Closed Principle.