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.
W poprzedniej lekcji powiedziałem ci o dziesięciu błędach, które można popełniać
pracując nad kodem i starając się współpracować z zasadami SOLID.
A teraz nie zostawiam Cię samego albo samej, bo dam Ci kilka wskazówek,
jak te błędy zidentyfikować.
Więc punkt pierwszy to będzie analiza.
Analiza jest zawsze pierwszym punktem u mnie i w każdym
projekcie powinna być najpierw przeprowadzona analiza analiza
odpowiedzialności klas.
Więc na początku, żeby uniknąć tych przerośniętych klas, małych interfejsów,
przeanalizuj ich odpowiedzialności.
Zobacz, czy kluczowe klasy w systemie mają zbyt duże odpowiedzialności lub zbyt
małe, bo może się okazać, że jakiś proces biznesowy, który tak naprawdę jest jedną
odpowiedzialnością, jest rozbity na kilka różnych elementów niepotrzebnie.
I można to opakować w jedną klasę, w jedną odpowiedzialność.
Taka analiza odpowiedzialności może odbywać się na podstawie np.
schematu, może na podstawie kodu jakiejś statycznej analizy kodu.
Łatwo znaleźć jakieś narzędzia, które pozwalają nam
sprawdzić, czy nawet IDE nam teraz udostępnia takie narzędzia, czy to pilot,
czy czat CBT czy inne tego typu narzędzia, które pomagają nam analizować kod,
są w stanie wychwycić miejsca, gdzie ta odpowiedzialność klas jest albo
rozmyta, albo zbyt mała, albo zbyt duża.
Więc punkt pierwszy to jest analiza.
Analiza jest podstawą dobrego designu w kodzie.
Druga kwestia, która idzie niejako z analizy, to ewaluacja
hierarchii dziedziczenia.
Mówiłem wcześniej, żeby stosować raczej kompozycję, a nie dziedziczenie.
Że to dobry punkt w kierunku budowania systemu, który jest elastyczny
i łatwy w utrzymaniu.
I taka ewaluacja hierarchii dziedziczenia jest istotna.
Jest ważna, bo często kończymy z klasami, które dziedziczą w jakimś chorym łańcuchu
i tak naprawdę nie wiemy co po kim dziedziczymy.
A zmiana w klasie bazowej ma olbrzymi impakt na wszystkie potomne klasy.
W dużej mierze w nowoczesnym programowaniu, w nowoczesnym kodzie
odchodzimy od takiego bardzo głębokiego dziedziczenia.
Natomiast wciąż jest to obecne w projektach Legacy i sam osobiście
widziałem to wiele razy, więc taka ewaluacja jest konieczna, żeby
unikać niepotrzebnych błędów.
No i jak mamy ewaluacja, mamy analizę, no to wystarczy to wszystko
udokumentować i będziemy happy.
A więc dokumentacja nowych zmian, dokumentacja starych zmian, dokumentacja
wsteczna kodu jest bardzo istotna.
Pisanie samo do komentującego się kodu, pisanie testów, które są dokumentacją dla
kodu i wreszcie taka zwykła papierowa dokumentacja w konferencje jest
niezbędna do tego, żeby uniknąć błędów.
Dokumentacja to jest rzecz, której programiści i programiści nie cierpią, nie
cierpią pisać, ale naprawdę w wielu przypadkach ratuje nam skórę.
Kolejną kwestią będzie sprawdzenie martwych interfejsów.
W kodzie możemy znaleźć dużo klas, które mają metody niewykorzystywane
przez nikogo innego.
I tutaj znowu odwołam się do zasady, gdzie zostawiamy kod lepszym niż go zastaliśmy.
Jeśli natrafisz na metodę, która nie jest używana, a przypominam, że
nowoczesne narzędzia do pisania kodu.
Nowoczesne idee zaznaczają takie metody, które nie są nigdzie wywoływane,
wobec czego mamy prostą drogę do usunięcia, do wyczyszczenia takiego kodu i
przez to kończymy z mniejszymi interfejsami.
Usuwamy te martwe i nieużywane interfejsy.
Możemy dokumentować swoje zależności w systemie i mapować je.
Jeśli mamy już dokumentację taką zwykłą, papierową lub w formie diagramów,
warto nanieść na nią wszelkiego rodzaju zależności, listy parametrów.
Takie dokumentacje mogą żyć w plikach HDMI, w konsumencie, w czymkolwiek, ale
powinny być zawsze dostępne dla programistów i napisane łatwym i
przystępnym językiem, tak aby ten dostęp i korzystanie z tej dokumentacji
było jak najbardziej uproszczone.
No i ostatnia kwestia to identyfikacja tzw.
kod SMS śmierdzącego kodu, brudnego kodu, błędów w kodzie albo takich warstw w
kodzie, które w konsekwencji na pewno będą prowadziły do problemów.
Identyfikacja tych co mieli to intuicja.
Doświadczenie to dobra znajomość zasad SOLID.
Łatwo nam znaleźć kod Miele, jeśli dobrze znamy te 5 zasad, o
których mówiłem wcześniej.
Bo bo choćby na podstawie zasady SRP identyfikujemy proste klasy, ale też
identyfikujemy te, których odpowiedzialność jest zbyt duża, gdzie
zależności nie są wydzielone lub gdzie interfejsy się nie pokrywają i
nie umożliwiają podstawienia.
Te 6 wskazówek pozwoli Ci zidentyfikować błędy i ich unikać, więc trzymam
kciuki za Twój czysty kod.
Dobry i solidny kod i stabilne, elastyczne systemy, które tworzysz.