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.
Mam dla Ciebie kilka wskazówek dotyczących wprowadzania w życie zasady open close.
Wskazówka numer 1 Korzystaj z abstrakcji i polimorfizmu.
Zasada Open Closed opiera się bardzo mocno na tym, żeby umiejętnie korzystać z
abstrakcji i bardzo rozsądnie korzystać z polimorfizmu.
Polimorfizm pozwala nam na łatwe wstrzykiwanie zależności.
Będzie się to przewijało też w innych zasadach, gdzie będziemy pracować nad
stworzeniem możliwie najbardziej elastycznego interfejsu konkretnego i
elastycznego interfejsu, który z kolei pozwoli na łatwe podmiany klas w kodzie.
Więc korzystaj z abstrakcji i polimorfizmu, żeby taki elastyczny kod
tworzyć, wybieraj kompozycje zamiast dziedziczenia.
Toczy się odwieczna batalia pomiędzy zwolennikami kompozycji i dziedziczenia.
Przypomnę Ci tylko, że kompozycja polega na tym, aby komponować swój obiekt,
komponować zachowanie obiektu na zasadzie wstrzykiwania nowych elementów lub innych
obiektów wewnątrz tego pierwszego, a nie tworzenia łańcuchu dziedziczenia.
W drzewie obiektów, gdzie będziemy mieć te same metody lub dziedziczone różne
zachowania po klasie bazowej, więc kompozycja daje nam dużo większą
elastyczność, bo w dziedziczeniu możemy odziedziczyć metody,
których tak naprawdę nie potrzebujemy i tym samym będziemy łamać jeszcze kolejną,
kolejną zasadę z cyklu solid a.
W kompozycji możemy tworzyć dowolną liczbę obiektów w dowolnych
konfiguracjach, które pozwalają z kolei wypełniać tę zasadę OCP Open Close, gdzie
nasz kod nie jest modyfikowany, ale jest rozszerzany właśnie dzięki kompozycji, co
widziałeś też w poprzednim przykładzie, gdzie pokazywałem konfigurację lub
wstrzykiwanie zależności Millera.
I wskazówka numer 3 projektuj zawsze pod kątem rozszerzania.
Staraj się pisząc kod projektować go w taki sposób, aby naturalnie powstawały w
nim miejsca, gdzie możesz wstrzykiwać zależności, jeśli tylko ten kod
tych zależności będzie wymagał.
Jeśli tylko ten kod będzie miał predyspozycje do tego, aby być
rozszerzeniem, a jesteś w stanie to zidentyfikować na etapie planowania i
designu architektury już wcześniej, to jesteś w stanie też projektować kod,
projektować klasy i metody w taki sposób, aby możliwe było rozszerzanie.
Może potrzeba jakiś service albo jakąś logikę wydzielić do osobnego obiektu
i za chwilę powstanie nam kolejny wariant tej samej usługi, który będzie mógł być
wstrzykiwać naprzemiennie do Twojej klasy usługi.
Myśl o tym, żeby rozszerzać kod, nie modyfikować, ale rozszerzać tak, aby
zasada open close principle mogła być zawsze spełniona.