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.
Litera L, czyli exp blisko substytutem Principle, czyli zasada podstawienia
Barbary blisko.
Na czym polega ta zasada?
Najpierw oddamy głos samej pani Barbarze i przeczytamy tę fascynującą definicję.
Chciałam tutaj uzyskać coś w rodzaju następującej właściwości podstawienia.
Jeżeli dla każdego obiektu O1 typu S istnieje obiekt O2 typu T taki, że dla
każdego programu P Określonego warunkami te zachowanie P.
Nie zmieni się, gdy zamiast o 1 zostanie podstawiony o 2.
To znaczy, że S.
Jest pod typem T.
Proste. Wszystko jasne?
Dziękuję bardzo za uwagę.
Oczywiście, że nie, bo ta definicja Barbary Lisko jest
definicją akademicką, a my musimy to przełożyć na bardziej przystępny język.
I o czym mówi nam ta zasada?
Mówi nam o tym, że nasz kod powinien definiować taki łańcuch dziedziczenia i
takie elastyczne interfejsy, żeby wymienianie poszczególnych elementów w
systemie było możliwe bez konieczności modyfikowania kodu.
Czyli idziemy trochę dalej od zasady OCP i budujemy taki system, który będzie miał
elastyczny interfejs, elastyczny i będzie spełniał ten sam interfejs.
Mówiłem wcześniej o klockach LEGO, które mają odpowiedni kształt, który sprawia, że
każdy klocek LEGO pasuje do każdego klocki Lego i możemy je przypinać dowolnie, bez
jakiejś potrzeby łamania tych klocków, wycinania nowych otworów czy nowych
wypustek, które pozwalają nam te klocki ze sobą spinać.
I jakie mogą być symptomy pogwałcenia tej zasady lub naruszenia tej zasady LSB?
Możemy mieć słynny problem kwadratu i prostokąta, o którym będę rozmawiał
później, gdzie każdy kwadrat jest prostokątem, ale nie każdy prostokąt jest
kwadratem i mimo, że będą dziedziczyć po jakimś wspólnym
obiekcie, to możemy mieć problem z identyfikacją wspólnego interfejsu,
choćby dla liczenia pola figury.
Gdzie?
Skoro każdy prostokąt jest kwadratem, to wzór na liczenie pola kwadratu powinien
się aplikować też do prostokąta, a tak nie jest, bo jeśli zachowanie klasy będzie
zależało od używanego przez nią typu w tym przypadku typ prostokąt
i dodania kolejnego if, a jeśli prostokąt to cośtam, to te typy nie będą
wymienialne, co oznacza, że nie będą spełniały tej zasady.
Więc powinniśmy tak budować łańcuch dziedziczenia i tak projektować interfejsy
klas, aby każde instancję klasy bazowej dawało się podmienić bez
wywalenia całego programu bez błędów.
Mówiąc w skrócie i ten łańcuch dziedziczenia powinien
nam pozwolić na swobodne podmiany.
To brzmi mega abstrakcyjnie i sama pani Liska mówiła, że jest to zasada
ważna, natomiast wiele osób jej nie do końca rozumie, więc musimy przejść do
praktycznego przykładu, gdzie wszystko Ci się już rozjaśni.