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.
Zasada pojedynczej odpowiedzialności Single Responsibility Principle.
Przejdziemy do praktycznego przykładu.
Popatrzmy na kod.
Mamy tutaj bardzo prostą klasę napisaną w języku Ruby.
Jest to klasa Employee.
To jest jakaś encja, Może to być jakiś agregat.
Nieważne. Ta klasa ma trzy zachowania.
Ma trzy metody.
Zobaczmy jakie to są metody Calculator czyli przelicz wypłatę.
Report auth czyli Raportuj.
Godziny i zapisz zapisz sobie tego pracownika i jak przejdziemy przez te trzy
metody możemy sobie przypomnieć to o czym mówiłem w poprzedniej lekcji.
Mianowicie o tym, że każdy czy każda część kodu, która spełnia zasady SRP
powinna być odpowiedzialna względem tylko jednego aktora.
I co tutaj mamy?
W tej klasie Employee mamy wyliczanie wypłaty
i aktorem rolą biznesową, która może być zainteresowana wyliczeniem
wypłaty pracownika.
Może być księgowa albo np.
CFO w startupie.
Więc CFO będzie zainteresowany wyliczeniem wypłaty.
Nasza klasa Employee jest odpowiedzialna względem CFO albo księgowej co kto woli.
Druga metoda Report Auth za raportowanie godzin pracy.
Kto może być zainteresowany za raportowaniem godzin pracy?
Może być zainteresowany sam pracownik ok.
Może być tym zainteresowany np.
bezpośredni przełożony, który musi sprawdzić ile pracownik godzin
przepracował, żeby potem wystawić z kolei fakturę np.
zewnętrznej firmie klienckiej, dla której pracownik pracuje.
Może być tym zainteresowany znów CFO, a więc możemy mieć współdzielonego
aktora, ale z reguły będzie to np.
bezpośredni przełożony naszego pracownika lub sam pracownik.
Więc dochodzi nam drugi aktor i już Nasza klasa Pogwałcenia zasad SRP.
Ale to jeszcze nie koniec, bo mamy jeszcze metodę save.
Metoda save będzie zapisywała jakieś atrybuty tej klasy.
Employee np.
będzie zapisywała rozmiar koszulki, bo rozmiar koszulki może się zmienić z
wiekiem, a firmy wysyłają słoik do swoich pracowników i kto będzie zainteresowany
zmianą rozmiaru koszulki pracownika może być zainteresowany dział HR, który
odpowiada za benefity i wysyłania różnego rodzaju złego do pracowników w firmie.
Mamy klasę Employee, która pozornie ma trzy metody, które pozornie mają związek z
samym pracownikiem, natomiast odpowiadają mają swoją odpowiedzialność względem
trzech różnych aktorów księgowej, menedżera i dział HR.
Mamy trzech aktorów i teraz bardzo fajnie widać właśnie
rozumienie tej zasady według wujka Martina, że aktor to nie jest tylko
użytkownik, ale to jest rola w systemie, która wywołuje jakiś proces logiczny.
Jak może wyglądać ten kod, który będzie spełniał zasadę SRP?
Zanim przejdziemy do kodu, który będzie spełniał te zasady SRP,
przejdźmy do kolejnego przykładu.
Mamy tutaj klasę kurs Course i ta klasa.
Kurs ma też trzy metody, które mają różne odpowiedzialności, robią różne rzeczy.
Mamy n roll, czyli możemy jakoś studenta zapisać do kursu, możemy zapłacić za
kurs albo możemy dodać do niego lekcje.
To są trzy różne rzeczy, które spełnia ta klasa, więc automatycznie.
Kolejny raz widzimy pogwałcenie.
Jak będzie wyglądał kod, który spełnia zasadę pojedynczej odpowiedzialności?
Może wyglądać np.
tak gdzie mamy klasę N rolę ment, która odpowiada za przypisanie studenta do
kursu, za zapisanie go do kursu i będzie tutaj jedna publiczna metoda n roll.
Będziemy mieć klasę Payment Service, który odpowiada za płatności za kurs.
Więc Payment Service nie interesuje się żadnymi dodatkowymi rzeczami.
Interesuje go tylko za jaki kurs ma być stosowana płatność,
wygenerowany link do płatności.
I mamy tylko jedną publiczną metodę pay.
No i wreszcie mamy lesson, która może być przypisana do kursu.
Więc mamy tylko metodę Add course i przyjmuje kurs jako parametr.
W ten sposób mamy trzy różne klasy, które odpowiadać będą
trzem różnym aktorom i będą jednocześnie spełniały trzy różne rzeczy.
Mamy wydzieloną odpowiedzialność do poszczególnych klas.
Możemy pójść dalej, bo sama zasada SRP nie mówi tylko o tym, żeby opakować logikę w
różne klasy, ale mówi nam też o tym, żeby opakować logikę w metodach, że metoda też
powinna pełnić jedną funkcję i jedną rzecz, być odpowiedzialna za jedną rzecz.
I to widzimy na tym przykładzie, gdzie klasa kurs dalej ma te trzy metody ma n
roll i adres n, Ale tutaj zobaczymy, że każda z tych metod pełni niejako rolę
fasady fasady przed właściwą implementacją, przed tą docelową
implementacją, która odpowiada za logikę.
Więc mamy jakąś klasę n roll n, która wywołuje n roll.
Mamy Payment Service i mamy dodanie kursu do lekcji.
Mamy odpowiedzialności odpowiednio wydzielone do poszczególnych elementów i
możemy w tym momencie rozmawiać z różnymi aktorami w różnych miejscach.
Spełniamy zasadę SRP.