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.
Przejdźmy teraz do omówienia zadania teoretycznego z zasady SRP.
Dla przypomnienia powiem, że chodziło tutaj o zaprojektowanie prostego systemu
zarządzania użytkownikami, upewnienie się, że każda klasa w Twoim projekcie ma tylko
jeden powód do zmiany i tę jedną odpowiedzialność, o
którym mówiłem już wcześniej.
Na przykład, kiedy oddzielne klasy mamy do obsługi danych użytkownika,
walidacji i PR systemu.
I jak to wygląda w kodzie?
Przygotowałem bardzo proste rozwiązanie dla tego zadania.
W pierwszej kolejności mamy tutaj zdefiniowaną klasę usera.
Klasa user to typowy wrapper na dane gdzie mamy pole ID, username i email i ta klasa
odpowiada za to, żeby przechowywać spójne dane dla użytkownika.
Następnie mamy klasę User Repository.
User Repository ma jedną publiczną metodę Save, która będzie odpowiadać za
zapisywanie użytkownika do bazy danych.
Mamy wreszcie klasę User Validation i klasa.
User Validation ma jedną publiczną funkcję Validation, która przyjmuje jako
parametr i usera i walidacji.
W kontekście poprawności adresu email i poprawności username
Walidacja adresu email odbywa się poprzez sprawdzenie naszego emaila
w kontekście wyrażenia regularnego, a walidacja username w kontekście długości
stringa, który jest przekazywany do tego pola.
I całość będzie współgrała w następujący sposób gdzie tworzymy
nową instancję klasy User.
Następnie Validation repozytorium dowali tora, przekazujemy obiekt usera,
sprawdzamy czy jest w poprawnym stanie.
Jeśli jest zapisujemy go do bazy, jeśli nie mówimy o tym użytkownikowi.
Jak widzimy każda z tych klas ma jedną jasno konkretną odpowiedzialność odpowiada
względem konkretnego aktora, gdzie repozytorium odpowiada względem bazy
danych, walidacja odpowiada względem logiki biznesowej.
I wreszcie użytkownik klasa user jest dla nas tutaj tylko raperem,
prostą strukturą danych.
To jest przykładowe rozwiązanie tego zadania teoretycznego RP.
Poćwicz jeszcze na podobnych przykładach, a my przechodzimy do kolejnego materiału.